2011-04-14 121 views
3

我試圖將指針傳遞給兩個struct timevals函數,該函數可以在C程序中輸出兩者之間的經過時間。然而,即使我解引用這些指針,nvcc會拋出錯誤「expression must class class」(這是一個CUDA程序)。下面是從main()中的相關代碼:錯誤時,將指針傳遞給結構函數c

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中使用結構體,更不用說將結構體的指針傳遞給函數,所以我不確定是什麼導致了錯誤。

+0

try:elapsed =((end-> tv_sec - begin-> tv_sec)* 1000000 + end-> tv_usec - begin-> tv_usec); – fazo 2011-04-14 22:29:50

回答

7

.的操作者具有比*操作者更高的優先級,所以像*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是指向struct的指針。操作者->爲上述僅僅是一個「快捷方式」,例如(*begin).tv_sec相同begin->tv_sec