2016-11-19 19 views
0

私は与えられた最大2つの数字を見つけることができる仕事をcで作成するプログラムを作ろうとしていました。pthread_createに配列を渡す

#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); 
} 

が、Linuxでのgccを使用して私が得たこれらのエラー::私は(askisi.cという名前)を書いた最初のプログラムは以下の通りであったenter image description here

は、今多くの研究の後、私はことを発見し 私機能max_of_twoは、次のように記述する必要があります。

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); 
} 

最初の問題は、私は私の最初のプログラムが動作しなかった理由上の任意の説明を見つけることができませんでしたということです。 2番目は、char **arguments = (char**)param;の指示が実際に何をしているのかわかりませんでした。

答えて

0

voidは実際の型ではなく、その意味でどの型でも期待している関数を意味し、プログラマが決定するのはcastingです。

char **arguments = (char**)param;を実行すると、char **にパラメータがキャストされ、そのキャストが変数argumentsに割り当てられました。

+0

しかし、このキャスト後に 'arguments [1]'ではなく 'arguments [1]'で要素を参照するのはなぜですか? – asdf

+0

'arguments'はcharの配列へのポインタです(わかりやすくするために、文字列の配列へのポインタを言うことができます)。だから、char(またはstring)の最初の配列にアクセスしたい場合は、 '*(arguments + pos)'または 'arguments [pos]'を使うことができます。また、 'arguments'自身が' arguments [0] 'を指しています。 より良いアイデアを得るには、 –

+0

が行うことになる 'Cの配列添字について[http://users.ece.utexas.edu/~valvano/embed/chap8/chap8.htm]を読むことをお勧めします。ありがとう – asdf

関連する問題