• ベストアンサー

2次元配列を戻り値とする関数?

いつもお世話になっています。 角度を入力すると、 2×2の2次元配列を戻す 関数を作りたいのですが、 コンパイルすると、 戻り値の型のところで、 不正な変換だというエラーが出て うまく行きません。 参考書を何度も読み直して 戻り値の型をポインタのポインタにするなど、 いろいろトライしてみたのですが、うまく行きません。 typedef を使う方法も考えましたが、 他にもっとすっきりする方法はないでしょうか? どなたか参考URLをお教えくださるか、 解決策を教えてください。 よろしくお願いします。 ちなみに、この関数は大凡下記の通りです。 double** Matrix(double sita) { double mat[2][2]; mat[0][0]= cos(sita); mat[0][1]= sin(sita); mat[1][0]=-sin(sita); mat[1][1]= cos(sita); return mat; }

質問者が選んだベストアンサー

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.4

補足です。 もし、配列にこだわらないのであれば構造体を宣言してその値を返すようにした方が良いかもしれませんね。 struct mat_str {  :(配列でも、それぞれ意味のある変数でもOK) }; struct mat_str Matrix (double sita) {  struct mat_str mat;  :  return mat; } 呼び出し側は、 struct mat_str result; result = Matrix(1.0); で、Matrix内のauto変数の値が 呼び出し側の resultに代入されます。 typedef struct mat_str stMat; とすれば見やすくなりますね。

その他の回答 (14)

  • nagare
  • ベストアンサー率33% (280/831)
回答No.5

んんん? >やはり型変換できないとのエラーがでました。 エラー見せてください

zico
質問者

補足

nagare様 アドバイスありがとうございます。 エラーは、コンパイルエラーで、 下記の通りでした。 環境は、Visual Studio.NETです。 「C2440 'return':'double[2][2]'から'double*'に  変換できません。  指示された型は関連がありません。」 よろしくお願いします。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.3

ありゃ エラーばかり見てました たしかにdouble mat[2][2]; では、実行エラーですね void Matrix(double *mat ,double sita) { *(mat+0)= cos(sita); *(mat+1)= sin(sita); *(mat+2)=-sin(sita); *(mat+3)= cos(sita); return; }; コーディングは参考程度にしてください。

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

>double mat[2][2]; これは auto変数ですから、Matrix関数が終了した際に開放されます(値が保証されない)。static で宣言するか、malloc等で領域を確保してそのアドレスを返すようにしないとまずいです。 staticで宣言した場合、a = Matrix(n1); b = Matrix(n2); と連続で呼ぶと a と b の値が同じになってしまいます。 mallocで領域を確保すればこのようなことにはなりません。使わなくなったときに freeで領域を開放することを忘れずに。 >double **Matrix では配列のポインタを受け取れません。#1 の方のご指摘通り double *Matrix としなければなりません。配列は連続した記憶領域ですから、ポインタとしてのアドレスは1つだけです。

zico
質問者

お礼

アドバイスありがとうございます。 コンパイルエラーにばかり気を取られ、 上記の重要な点を見落としていました。 今後ともよろしくお願いします。

  • nagare
  • ベストアンサー率33% (280/831)
回答No.1

関数の型と返却値の型があっていません double *Matrix(double sita) { double mat[2][2]; mat[0][0]= cos(sita); mat[0][1]= sin(sita); mat[1][0]=-sin(sita); mat[1][1]= cos(sita); return mat; }; でどうでしょう (今 コンパイラがないので、エラーだったらすみません) matは&mat[0][0]なので、ポインタのポインタではありません ポインタのポインタのなら&mat(&&mat[0][0])です

zico
質問者

補足

アドバイスありがとうございます。 double*も試してみたのですが、 やはり型変換できないとのエラーがでました。

関連するQ&A