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:
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.
Ok, aber wieso nach diesem Casting auf ein Element mit 'arguments [1]' und nicht '* arguments [1]' verweist? – asdf
'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 –
wird tun. Vielen Dank – asdf