• 締切済み

不正な構造体の演算

ある構造体を戻り値として関数からかえして、変数に代入すると不正な構造体の演算というエラーになります。 これは、どういったことが原因と考えられますか?

みんなの回答

  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.7

//コメントが使えているので、比較的最近のコンパイラだと推測します。 (//は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)
回答No.6

まず処理系を示しエラーメッセージを正確に書く. あと, そのエラーが「何行目で出ているのか」も書いてあるはずだから, その前後を中心に調べる. 人に聞くときにはこれくらいしようよ.

noname#208124
noname#208124
回答No.5

古いコンパイラでは構造体を戻り値に出来ないものや構造体への直接代入が出来ないものがあります コンパイラが何だか知りませんがそれがちゃんと可能なものですか?

  • S117
  • ベストアンサー率40% (18/45)
回答No.4

示されたソースだと、グローバル変数g2を定義した上で、関数内で同じ型のローカル変数g2を定義していますね。 まぁ、これもエラーとは関係ないと思いますが。 ソースを全部見せることに問題があるなら、せめてコンパイラのエラーメッセージを、「すべて」書くと回答がしやすいと思います。 コンパイル時のエラーなら、まず行が指定されています。この場合は、コンパイラとコンパイル時のオプション、OSなどの環境の情報も必要です。 で、これはただの勘なので間違ってるかもしれませんが、呼び出しもとが別のファイルにあって、そっちで構造体の定義が入ってないとかいうことはありませんか。 たとえば、呼び出しもと関数のファイルでは extern struct rts g2; でグローバル変数を宣言しておき、 提示したソースのファイルで struct rts{ int x; int y; }g2; グローバル変数を定義する。 そして、呼び出しもとでは、グローバル変数g2に代入する。 ただ、これは呼び出し元でエラーがでるだろうから、 提示されたソースにエラーが発生した行が含まれている のであれば、多分別の原因ですね。 メッセージと、グローバル変数g2の存在から考えるに、構造体の不完全型が絡んでいるかもしれないです。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.3

ところで、提示されたソースには何ヶ所かで return g2; がありますね。ところが、g2のメンバーx,yに値を格納してから returnしているのは最後だけですね。 それで本当によいのでしょうか?まあ、本題のエラーの件とは 関係ないと思いますけれど。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

ヘッダーファイルのインクルードやmain関数等の定義など、 どうせなら全部ひっくるめてコピペしてくださればよいのに…。 そうすれば、回答しようとする側で何も考えずに コンパイルできるんですが…。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

どのような構造体で、どのように返したのか… ソースで示された方が早いかと思われます。 あと、コンパイルエラーですか? 実行時のエラーですか? # 構造体のメンバにポインタ変数があって、ソレが不正なところを指しているとか。

ryo-river
質問者

お礼

早速のご回答ありがとうございます。 コンパイルエラーです。 構造体宣言は 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); このように構造体を受けています。

関連するQ&A

  • 参照送りした構造体のメンバ変数の扱い方が

    自作関数に構造体のポインタを送り、メンバ変数の値を扱いたいのですが、 &で送り、*で受け取り、*とアロー演算子でメンバを指定しても 「error C2100: 間接指定演算子 (*) の使い方が正しくありません。」 と出てしまいます。 変数と構造体とでは勝手が違うのでしょうか? どうすればメンバ変数の値を扱えるのでしょうか。

  • ファイルのデータを構造体に代入する方法

    学習し始めてから時間が経ちましたが、まだ初心者のまま・・・少しずつ頑張っている状態の者です。 今回はタイトルのことで御質問させてください。 関数Read(自己作成)でcsvファイルの内容を読み取り、読み取ったデータを用意しておいた構造体の変数ポインタを利用して代入しようと試みているのですが・・・要領がつかめません。 それで気になったのですが、読み込んだファイルを用意しておいた構造体に入れるにはどんな方法があるかよろしければご教授下さい。 私としてはforを使ったやり方があるのなら是非見本を見せてほしいのですが・・・ ちなみに、私が考えていたプログラム案は以下の通りです。 構造体にはcsvファイル・1レコード分の情報が入る構成。 構造体と読み取るファイルの構造は酷似しているが構造体全てに入る情報でない場合がある。 構造体には必要な分、配列領域を確保する ファイルの先頭アドレスはファイルポインタに代入。 構造体の先頭アドレスはポインタ変数に代入。   main関数とは別の関数の引数に2つのアドレスをコピー。 ★ そこでファイルデータを構造体へ代入しmainに戻って出力する。    その関数での戻り値は特になし(成功したら0・・・と考えていたのですが使い道が今のところはreturnだけです) ★で特に悩んでいるので、よろしくお願い致します。

  • C言語に関して質問です。構造体について

    構造体についての課題を出されたのですが、よくわかりません。教えてください。 問.複素数の構造体を作成し、その構造体変数2つを引数にもつ四則演算の関数を作成せよ。ただし、それぞれの四則演算の構造体を作成し、main関数内で、(a + bi) + (c + di)の形にし、a=2, b=3,c=4,d=5とすること。 この問題で以下までしか作れませんでした。解説を付けてソースをお願いします。 戻り値の型あってますか? #include<stdio.h> typedef struct{ double x,y; }Complex; void add(Complex z1 , Complex z2); void sub(Complex z1 , Complex z2); void multi(Complex z1 , Complex z2); void divide(Complex z1 , Complex z2);

  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

  • 構造体

    構造体を受け取って、メンバの値を変数に代入する部分での質問です。 lParamには構造体のアドレスが入っています。 strcpy(buf, ((struct mpoint*)lParam)->r); これによって構造体のrメンバの文字列値をbufにコピーしたいのですが、文法が違うようなので正しく直したものを教えてください。

  • 構造体でデータをやり取り出来ないか

     みなさん、こんにちは。質問させて頂きます。  関数に変数を渡すとき、変数のポインタを渡す方法が有ります。  この方法なら呼ばれた関数が、呼び出した関数の変数を直接操作出来ます。  これを構造体で出来ないでしょうか。  下記のプログラムで実験しました。(2)の所を色々と書き換えて試したのですが、エラーになります。  (1)は、エラーになりません。エラーで無く(2)の様に使えなければ、(1)の p はどのような使い道が有るのでしょう。 /*-----------------------------*/ struct Par { long a ; } ; /*-----------------------------*/ void sub1( struct Par *p )  ・・・(1) エラーにならない { p.a = 2 ;   ・・・(2) 色々変えて試しても、エラーになる }

  • HOSTENT構造体を宣言する必要はないのですか?

    ネットワークプログラミングを勉強しているのですが,ソケットを用いた通信のサンプルで, HOSTENT *lphost として,HOSTENT構造体へのポインタを宣言して, lphost = gethostbyname(ホスト名の文字列); で,サーバーのアドレスをHOSTENT構造体にセットするとあります。 構造体へのポインタを宣言しても,構造体自体の領域は確保されないのではないかと思うのですが,gethostbyname関数が返すポインタは,いったい誰がどこに確保した領域を指しているのか,そしてその領域はいつまで保持されるのか,よく理解できません。構造体そのものを宣言せずに,それへのポインタを宣言し,それに関数の戻り値を代入するというのが,よく理解できないです。どなたか解説していただけると幸いです。

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • VB2008: 構造体と関数との関係?

    VB.Net を知って60日余という初学者です。 やっと、構造体の基本事項の確認まで辿り着きました。 で、構造体と関数の関係をテスト。 結果、「関数に構造体全体を渡す場合には、たとえモジュールレベルの変数として宣言してモジュールレベルだけで用いるとしても Public で広域な変数として宣言しなければならない」ことが判明しました。 このことに関しての個人的な見解は次のようです。 >「関数のパラメータの型に用いる構造体等は全て Public で宣言されることで公開されていなければならない。 >関数がどういう型を受け取って、どのように演算し、いかなる型の値として戻すかは公開されていてこそ判断できる。 つまり、「関数の内々の事情、関数の約束事からの Public 宣言であって、構造体の通用範囲を広域にするためのそれではない」というのが私の理解。 問題は、MSDN ライブラリでこの理解の裏付けを取りたいのですが、なかなか見つかりません。 そこで、質問の角度を変えます。 この「関数の内々の事情説」、「関数の約束事説」という理解はいかがなものでしょうか?

  • 構造体のポインタに関する質問

    構造体の中にポインタ変数を置いたのですが、代入時に members.*pstack=*pushdeta; と記述すると、 エラー E2451 C:\WINDOWS\デスクトップ\作成\s\ds.cpp 85: 未定義のシンボル pstack(関数 stack::push(int *,char *) ) とエラーが出てしまいます ちなみに↓がその構造体です struct stack_member{ int *pstack; char *chpstack; int *pfornt; }members; このエラーの解決方法がわかる方が居たら教えてください (*を取れば、エラーは出ない) ちなみにこれを書いた言語はC++です

専門家に質問してみよう