3

struct timevalsC プログラムで 2 つの間の経過時間を出力する関数に 2 つへのポインターを渡そうとしています。ただし、これらのポインターを逆参照しても、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 で構造体を使用した経験はあまりなく、構造体へのポインターを関数に渡す経験はあまりないため、エラーの原因がわかりません。

4

2 に答える 2

7

演算子は.演算子よりも優先順位が高い*ため、 のような式は*end.tv_sec最初に評価を試み(はポインターでend.tv_secあるため不可能です)、次に結果を逆参照します。end

代わりに(*end).tv_secorを使用する必要があります。end->tv_sec

于 2011-04-14T22:33:59.517 に答える
2

演算子を作成elapsed = (((*end).tv_sec - (*begin).tv_sec)*1000000 + (*end).tv_usec - (*begin).tv_usec);または使用する必要があります。->

演算子は、.構造体へのポインターではなく、構造体でのみ使用できます。たとえば、begin が構造体へのポインターであるためでは(*begin).tv_secありません。begin.tv_sec演算子->は、上記の単なる「ショートカット」です。たとえば(*begin).tv_sec、次と同じですbegin->tv_sec

于 2011-04-14T22:31:56.973 に答える