将指针传递给struct到c中的函数时出错

时间:2011-04-14 22:25:42

标签: c struct gettimeofday

我正在尝试将指向两个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中使用结构的经验,更不用说将结构传递给函数的结构了,所以我不确定导致错误的是什么。

2 个答案:

答案 0 :(得分:7)

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

您应该使用(*end).tv_secend->tv_sec代替。

答案 1 :(得分:2)

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

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