2016-11-19 4 views
0

Also habe ich versucht, ein Programm zu erstellen, das einen Thread in c erstellt, dessen Aufgabe es ist, maximal 2 gegebene Zahlen zu finden. Das erste Programm, das ich schrieb (benannt askisi.c) war folgende:Ein Array an pthread_create übergeben

#include <pthread.h> 
#include <stdio.h> 
#include <sys/types.h> 

int max; 

void *max_of_two(void *param); 

int main(int argc , char *argv[]) 
{ 
    pthread_t tid; 

    pthread_attr_t attr; 

    if (argc != 3) 
    { 
      fprintf(stderr,"You have to give 2 numbers... \n"); 
      return -1; 
    } 

    pthread_attr_init(&attr); 

    pthread_create(&tid,&attr,max_of_two,argv); 
    pthread_join(tid,NULL); 
    printf("max = %d\n",max); 
} 

void *max_of_two(void *param) 
{ 
    if(atoi(*param[1]) >= atoi(*param[2])) 
      max = atoi(*param[1]); 
    else 
      max = atoi(*param[2]); 
    pthread_exit(0); 
} 

Aber mit gcc unter Linux habe ich diese Fehler: enter image description here

nun nach viel Forschung fand ich, dass meine die

void *max_of_two(void *param) 
{ 
    char **arguments = (char**)param; 

    if(atoi(arguments[1]) >= atoi(arguments[2])){ 
      max = atoi(arguments[1]);} 
    else 
      max = atoi(arguments[2]); 
    pthread_exit(0); 
} 

Das erste Problem ist, dass ich auf eine Erklärung fand nicht, warum mein erstes Programm hat nicht funktioniert: function max_of_two sollte wie folgt geschrieben werden. Der zweite ist, dass ich keine verständliche Erklärung gefunden habe, was der Befehl char **arguments = (char**)param; tatsächlich tut.

Antwort

0

void ist kein realer Typ, und in diesem Zusammenhang bedeutet es, dass die Funktion irgendeinen Typ erwartet, und es liegt an dem Programmierer zu entscheiden, was mit casting gemacht wird.

Also, indem Sie char **arguments = (char**)param; tun Sie Casted Param in char ** und zugewiesen, dass Cast auf die Variable arguments.

+0

Ok, aber wieso nach diesem Casting auf ein Element mit 'arguments [1]' und nicht '* arguments [1]' verweist? – asdf

+0

'Argumente' ist ein Zeiger auf ein Array von Zeichen (um es einfacher zu verstehen, können wir sagen, es ist ein Zeiger auf ein Array von Zeichenfolgen). Wenn Sie also auf das erste Array von char (oder string) zugreifen wollen, können Sie entweder '* (arguments + pos)' oder 'arguments [pos]' verwenden, da sie äquivalent sind. Auch 'arguments' selbst verweist auf' arguments [0] '. Ich schlage vor, über 'Array-Indizes in C' [http://users.ece.utexas.edu/~valvano/embed/chap8/chap8.htm] zu lesen, um eine bessere Idee zu bekommen –

+0

wird tun. Vielen Dank – asdf

Verwandte Themen