2012-10-03 29 views
5

Ich versuche, die pthread Bibliothek zu verwenden, um n Fibonacci-Nummern zu berechnen, wobei n aus dem Bereich 0-1000 stammen können. Ich renne in einen seltsamen Fehler, wenn ich versuche, meine void* zu einem double typecast.Convert void * zu double

In meinem Haupt hier ist mein Aufruf an meine berechnen Fibonacci-Funktion:

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

In meiner calc_fib Funktion, die ich mit typisieren bin versucht:

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

Allerdings, wenn ich dies zu tun versuchen, Ich bekomme folgende Fehler:

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 

Bin ich nicht in der Lage zu ty paste von void* zu double in C oder mache ich es gerade falsch?

Antwort

11

void *num ist ein Zeiger. double n ist eine Variable.

können Sie werfen void* zu double*:

double *p = (double *)num; 

Dann sind Sie dereferenzieren:

double n = *p; 

Oder in einer Zeile:

double n = *(double *)num; 
+0

Ja, das war es genau. Ich vergesse immer die Feinheiten des Gießens zwischen verschiedenen Zeigertypen. –

2

Zuerst möchten Sie die void * zu einem Doppel * konvertieren. Dann müssen Sie den Zeiger dereferenzieren, um ihn einem Double zuzuordnen.

1

Sie können nicht portably die double werfen zu einem Zeiger - für einen Anfang kann der Zeigertyp nicht genug Bits haben .

Wenn n nicht in main nach dem Aufruf pthread_create geändert werden, können Sie einen Zeiger auf die n Variable in main passieren selbst (das heißt (void*)&n, dann *(double*)num innerhalb calc_fib verwenden).

Wenn sich n ändern könnte - vielleicht hast du eine Schleife, die eine Vielzahl von n Werten berechnet, um sie an verschiedene Threads zu übergeben - dann musst du eine Race Condition vermeiden, in der der neue Thread den Wert vor dem Hauptthread nicht gelesen hat ersetzt es. Sie können dafür einen Mutex verwenden - es bedeutet, dass unabhängig von der Anzahl der Threads eine bestimmte Menge an Speicher benötigt wird -, aber der Code ist relativ ausführlich und serialisiert und verlangsamt den Start der Threads weiter. Ein typischer besserer Ansatz besteht darin, jeden Wert in eine separate Speicheradresse zu schreiben. Sie könnten ein Array mit so vielen Werten verwenden, wie Sie neue Threads haben, oder für jede double Speicher auf dem Heap reservieren, dann die Threads lesen lassen und dann den Speicher freigeben ....

Verwandte Themen