- 締切済み
不正な構造体の演算
ある構造体を戻り値として関数からかえして、変数に代入すると不正な構造体の演算というエラーになります。 これは、どういったことが原因と考えられますか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- jjk65536
- ベストアンサー率59% (66/111)
//コメントが使えているので、比較的最近のコンパイラだと推測します。 (//はC99で追加された仕様) とはいってもコンパイラが不明ですので、とりあえず手元のGCC4.3.2でコンパイルしてみました。 結果、エラーも警告も出ずにコンパイルできました。 そのときのソースを張っておきます。 質問者様のg2の宣言の仕方に問題があるのではないかと考えています。 質問者様のお手元のコードと比べて違いがないか確認してください。 (そういえば質問者様のg2はgが一部全角になっていました。あわせてご確認ください) [xxx@xxx tmp]$ gcc -Wall -c test.c [xxx@xxx tmp]$ cat test.c struct rts { int x; int y; } g2; struct rts checkLeftDown (int x, int y, int boad[9][9]) { int i; int j; struct rts g2; if (boad[y + 1][x - 1] == boad[y][x]) { return g2; //隣が同色 } i = x; j = y; while (1) { if (boad[j][i] == 0) { return g2; } i--; j++; if (boad[y - 1][x - 1] == boad[j][i] && boad[j][i] != 0) { //さらにひっくり返帰る可能性があるか? } else { if (boad[y][x] == boad[j][i]) //はさむ事ができる? break; else return g2; } } g2.x = i; g2.y = j; return g2; } void test(void) { struct rts g2; g2 = checkLeftDown (0,0,(void *)0); }
- Tacosan
- ベストアンサー率23% (3656/15482)
まず処理系を示しエラーメッセージを正確に書く. あと, そのエラーが「何行目で出ているのか」も書いてあるはずだから, その前後を中心に調べる. 人に聞くときにはこれくらいしようよ.
古いコンパイラでは構造体を戻り値に出来ないものや構造体への直接代入が出来ないものがあります コンパイラが何だか知りませんがそれがちゃんと可能なものですか?
- S117
- ベストアンサー率40% (18/45)
示されたソースだと、グローバル変数g2を定義した上で、関数内で同じ型のローカル変数g2を定義していますね。 まぁ、これもエラーとは関係ないと思いますが。 ソースを全部見せることに問題があるなら、せめてコンパイラのエラーメッセージを、「すべて」書くと回答がしやすいと思います。 コンパイル時のエラーなら、まず行が指定されています。この場合は、コンパイラとコンパイル時のオプション、OSなどの環境の情報も必要です。 で、これはただの勘なので間違ってるかもしれませんが、呼び出しもとが別のファイルにあって、そっちで構造体の定義が入ってないとかいうことはありませんか。 たとえば、呼び出しもと関数のファイルでは extern struct rts g2; でグローバル変数を宣言しておき、 提示したソースのファイルで struct rts{ int x; int y; }g2; グローバル変数を定義する。 そして、呼び出しもとでは、グローバル変数g2に代入する。 ただ、これは呼び出し元でエラーがでるだろうから、 提示されたソースにエラーが発生した行が含まれている のであれば、多分別の原因ですね。 メッセージと、グローバル変数g2の存在から考えるに、構造体の不完全型が絡んでいるかもしれないです。
- asuncion
- ベストアンサー率33% (2127/6290)
ところで、提示されたソースには何ヶ所かで return g2; がありますね。ところが、g2のメンバーx,yに値を格納してから returnしているのは最後だけですね。 それで本当によいのでしょうか?まあ、本題のエラーの件とは 関係ないと思いますけれど。
- asuncion
- ベストアンサー率33% (2127/6290)
ヘッダーファイルのインクルードやmain関数等の定義など、 どうせなら全部ひっくるめてコピペしてくださればよいのに…。 そうすれば、回答しようとする側で何も考えずに コンパイルできるんですが…。
- Wr5
- ベストアンサー率53% (2173/4061)
どのような構造体で、どのように返したのか… ソースで示された方が早いかと思われます。 あと、コンパイルエラーですか? 実行時のエラーですか? # 構造体のメンバにポインタ変数があって、ソレが不正なところを指しているとか。
お礼
早速のご回答ありがとうございます。 コンパイルエラーです。 構造体宣言は struct rts{ int x; int y; }g2; で struct rts checkLeftDown(int x,int y,int boad[9][9]){ int i; int j; struct rts g2; if(boad[y+1][x-1] == boad[y][x]){ return g2;//隣が同色 } i = x; j = y; while(1){ if(boad[j][i] == 0){ return g2; } i--; j++; if(boad[y-1][x-1] == boad[j][i] && boad[j][i] != 0){ //さらにひっくり返帰る可能性があるか? } else{ if(boad[y][x] == boad[j][i])//はさむ事ができる? break; else return g2; } } g2.x = i; g2.y = j; return g2; } このような関数で返して、 g2 = checkLeftDown(x,y,&boad); このように構造体を受けています。