2016-03-18 8 views
0

構造体を複数の子プロセスから親構造にパイプし直そうとしています。構造配管構造エラー

typedef struct node* Node; 
struct node{ 
    char *str; 
    int num; 
    struct node* next; 
}; 

が設定されています。 パイプで読み書きして構造体のフィールドを印刷しようとすると、変数が構造体から何かを要求していますが、構造体ではないと表示されます。ここで

wordc-mp-main.c:123:44: error: request for member ‘num’ in something not a structure or union 
printf("%s, count %d\n", taken->str, taken->num); 
             ^

は子プロセスからのパイプコードです:ここで

close(fd[0]); 
fclose(inputFile); 
Node* pass = wordList->head; 
write(fd[1], pass, sizeof(Node)); 

は、親からのコードです:

close(fd[1]); 
Node* taken; 
read(fd[0], taken, sizeof(Node)); 
printf("%s, count %d\n", taken->str, taken->num); 

助け、あなたに感謝してください。

更新:ノードから削除*と1

Node taken = (Node) malloc(sizeof(Node)); 

を作った私は、セグメンテーションフォールトを取得していないが、私の構造が正しくパイプを通過しませんでした。

+2

そして、あなたはtypedef's 'を通して、あなたの間接を隠していない理由です。 – EOF

+0

2つのポインタを含む構造体は、プロセス間で送信される良い候補ではないことに注意してください。送信プロセスのポインタは、一般的に受信プロセスでは無効です。ポインタが指しているデータは渡されていません。これはおそらく、コンパイルの問題を越えてしまえば、クラッシュを引き起こすでしょう。 –

+0

@ EOFの詳細な議論については、['typedef'ポインタを使うのは良い考えですか?](http://stackoverflow.com/questions/750178/is-it-a-good-ide-to-typedef-pointers)ポイント。 –

答えて

0

Nodeは、typedef struct node* Nodeです(つまり、Nodeは既にポインタ定義です)。中に、

Node *taken; 

変更:だから、あなたは間接の余分な層を持っている

Node taken; 
+0

私がそれをしたとき、私はセグメンテーション違反を得ました。 –

+0

子プロセスに割り当てられたメモリへのポインタを渡し、親プロセスで逆参照しようとすると、セグメンテーション違反が発生します。 –

+0

@PaulGriffithsはい、それは可能かもしれません[私はそのような可能性を認識していました]。しかし、OPの質問はコンパイルエラーに関するものでした。彼は深い分析をするのに十分なポストをしていませんでした。たぶん、彼はこのコメントを見ると思います。 –