5

pthreadライブラリを使用して、 range からのnフィボナッチ数を計算しようとしています。myをに型キャストしようとすると、奇妙なエラーが発生します。n0-1000void*double

私のメインでは、計算フィボナッチ関数への私の呼び出しは次のとおりです。

pthread_create(&tid, &attr, calc_fib, (void *)n);

私のcalc_fib機能では、次のように型キャストしようとしています:

void *calc_fib( void *num)
{
    double n;
    n = (double)num;
    ...

ただし、これを実行しようとすると、次のエラーが発生します。

In function ‘calc_fib’:
error: pointer value used where a floating point value was expected
In function ‘main’:
error: cannot convert to a pointer type

void*C でtoから型キャストできないdoubleのでしょうか、それとも単に間違っているのでしょうか?

4

3 に答える 3

12

void *numポインタです。double n変数です。

次の場所にキャストできvoid*ますdouble*:

double *p = (double *)num;

次に、それを逆参照します。

double n = *p;

または1行で:

double n = *(double *)num;
于 2012-10-03T00:37:37.630 に答える
2

まず、void* を double* に変換します。次に、ポインターを逆参照して double に割り当てる必要があります。

void *calc_fib( void *num)
{
    double n;
    n = *(double*)num;
    ...
于 2012-10-03T00:35:27.113 に答える
1

をポインターに移植可能にキャストすることはできませんdouble。まず、ポインター型に十分なビットがない可能性があります。

を呼び出した後nに変更されない場合 は、変数自体へのポインターを渡すことができます(つまり、内部で使用します)。mainpthread_createnmain(void*)&n*(double*)numcalc_fib

変更される可能性がある場合n(おそらく、生成したさまざまなスレッドに渡すさまざまな n 値を計算するループがある場合)、メイン スレッドが値を置き換える前に新しいスレッドが値を読み取っていない可能性があるという競合状態を回避する必要があります。これにはミューテックスを使用できます。これは、スレッドの数に関係なく一定量のメモリが必要であることを意味しますが、コードは比較的冗長であり、スレッドの起動をさらにシリアル化して遅くします。通常、より適切な方法は、各値を個別のメモリ アドレスに配置することです。新しいスレッドと同じ数の値を持つ配列を使用するか、それぞれにヒープにメモリを割り当ててからdouble、スレッドに読み取らせてからそのメモリを解放することができます....

于 2012-10-03T01:06:43.907 に答える