2016-11-30 2 views
0

Hier vorbei Struktur habe ich ein structC - Fehler beim auf Threads

struct dotData{ 
    long x; 
    long y; 
}; 

die ich versuche threads

void *find_z(void *thisdot) 
{ 
    long z; 
    struct dotData *data; 
    *data = *((struct dotData*)(thisdot)); 
    z = data.x + data.y; 
    printf("Here's our dot! %ld * %ld = %ld \n", data.x, data.y, z); 
    pthread_exit(NULL); 
} 

Von main() mehr zu passieren, wo ich eine Struktur thisdot erstellen, die übergeben wird als ein Argument zu find_z jedes Mal, wenn seine Elemente x und y geändert werden

int main() 
{ 
. 
. 
. 
    struct dotData thisdot; 

    int NUM_THREADS; 
    NUM_THREADS = N*M; 
    pthread_t threads[NUM_THREADS]; 
    int i, j; 

    for(i = 0; i < M; i++){ 
     for (j = 0; j < N; j++) { 
      thisdot.x = x_dotBegin + x_interval*j; 
      thisdot.y = y_dotBegin + y_interval*i; 
      pthread_create(&threads[NUM_THREADS], NULL, find_z, &thisdot); 
     } 
    } 
    pthread_exit(NULL); 
} 

während der Kompilierung jedoch bekomme ich einen Fehler in z = data.x + data.y;

error: request for member ‘x’ in something not a structure or union| 
error: request for member ‘y’ in something not a structure or union| 

Wie kann ich diese Struktur korrekt auf Threads passieren?

+0

'data-> x' und' data-> y' aber Sie haben undefiniertes Verhalten mit '* data = ...' –

+0

Der Compiler sagt Ihnen genau, was das Problem ist. Daten sind keine Struktur und keine Union. Daten sind ein Zeiger. Handle es wie ein Zeiger. – Gerhardh

Antwort

2

Das Problem zu verwenden ist, dass data ein Zeiger auf eine Struktur, und für diejenigen, müssen Sie den „Pfeil“ Operator ->, wie data->x in verwenden.


Es ist ein schlimmeres Problem aber:

struct dotData *data; 
*data = *((struct dotData*)(thisdot)); 

Der Zeiger data nicht überall hin. Nicht initialisierte lokale (nicht statische) Variablen haben einen unbestimmten Wert. Um einen Zeiger zu verwenden, müssen Sie ihn irgendwo zeigen.

Oder für eine einfache Lösung und die, die ich empfehlen, keine Zeiger verwenden überhaupt:

struct dotData = *(struct dotData *) thisdot; 

Sie haben auch andere großes Problem darin, wie Sie Daten auf die Gewinde übergeben. Alle Threads erhalten denselben Zeiger auf dieselbe Struktur. Daher werden die Änderungen, die Sie in der Thread-Erstellungsschleife vornehmen, für die Threads alle die Daten in alle festgelegt.

Dies kann gelöst werden, indem dynamisch die Struktur zugewiesen wird, die Sie den Threads übergeben. Sie können dann einfach den Zeiger kopieren, anstatt die Struktur zu kopieren. Und Sie müssen sich an free die Daten erinnern oder Sie werden ein Speicherleck haben.

0

data ist ein Zeiger, so (*data).x oder data->x