Ошибка при передаче указателя на структуру для функции в c

Я пытаюсь передать указатели на два 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 ответа

Решение

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

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

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

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

Другие вопросы по тегам