【问题标题】:error when passing pointer to struct to function in c将指向结构的指针传递给c中的函数时出错
【发布时间】:2011-04-14 22:25:41
【问题描述】:

我正在尝试将指向两个 struct timevals 的指针传递给一个函数,该函数将在 C 程序中输出两者之间的经过时间。但是,即使我取消引用这些指针,nvcc 也会抛出错误“表达式必须具有类类型”(这是一个 CUDA 程序)。以下是 main() 中的相关代码:

struct timeval begin, end;
if (tflag) { HostStartTimer(&begin) };
// CUDA Kernel execution
if (tflag) { HostStopTimer(&begin, &end); }

以及HostStopTimer()的函数定义:

void HostStopTimer(struct timeval *begin, stuct timeval *end) {
    long elapsed;
    gettimeofday(end, NULL);
    elapsed = ((*end.tv_sec - *begin.tv_sec)*1000000 + *end.tv_usec - *begin.tv_usec);
    printf("Host elapsed time: %ldus\n", elapsed);
 }

导致错误的行是对elapsed 的赋值。我没有太多在 C 中使用结构的经验,更不用说将指向结构的指针传递给函数,所以我不确定是什么导致了错误。

【问题讨论】:

  • try: elapsed = ((end->tv_sec - begin->tv_sec)*1000000 + end->tv_usec - begin->tv_usec);

标签: c struct gettimeofday


【解决方案1】:

. 运算符的优先级高于 * 运算符,因此像 *end.tv_sec 这样的表达式会尝试首先评估 end.tv_sec(这是不可能的,因为 end 是一个指针)然后取消引用结果.

您应该改用(*end).tv_secend->tv_sec

【讨论】:

    【解决方案2】:

    您应该写elapsed = (((*end).tv_sec - (*begin).tv_sec)*1000000 + (*end).tv_usec - (*begin).tv_usec); 或使用-> 运算符。

    . 运算符只能用于结构,不能用于指向结构的指针,例如:(*begin).tv_sec 而不是begin.tv_sec,因为 begin 是指向结构的指针。运算符-> 只是上面的“快捷方式”,例如(*begin).tv_secbegin->tv_sec 相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-17
      • 2020-04-25
      • 1970-01-01
      • 2012-04-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      相关资源
      最近更新 更多