Ошибка при передаче указателя на структуру для функции в 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