ошибка при передаче указателя на структуру для функции в c - PullRequest
3 голосов
/ 15 апреля 2011

Я пытаюсь передать указатели на два struct timevals функции, которая будет выводить прошедшее время между ними в программе на Си.Однако, даже если я разыменую эти указатели, 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 ]

7 голосов
/ 15 апреля 2011

Оператор . имеет более высокий приоритет, чем оператор *, поэтому выражения типа *end.tv_sec пытаются сначала вычислить end.tv_sec (что невозможно, поскольку end является указателем), а затем разыменовать результат ,

Вы должны использовать (*end).tv_sec или end->tv_sec.

2 голосов
/ 15 апреля 2011

Вы должны написать elapsed = (((*end).tv_sec - (*begin).tv_sec)*1000000 + (*end).tv_usec - (*begin).tv_usec); или использовать оператор ->.

оператор . можно использовать только для структур, но не для указателей на структуры, например: (*begin).tv_sec и не begin.tv_sec, поскольку begin - указатель на структуру. оператор -> является просто «ярлыком» для вышеприведенного, например, (*begin).tv_sec совпадает с begin->tv_sec

...