dポイントプレゼントキャンペーン実施中!

いつもお世話になっています。

角度を入力すると、
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;
}

A 回答 (15件中11~15件)

double (*Matrix(double sita))[2]


{
staticdoublemat[2][2];
mat[0][0] = cos(sita);
mat[0][1] = sin(sita);
mat[1][0] = -sin(sita);
mat[1][1] = cos(sita);
return mat;
}

呼び出す度に値は上書きされます。
それが嫌な場合は、その都度malloc()等で記憶領域を確保する
必要があります。

この回答への補足

ranx様
アドバイスありがとうございます。

上記方法でうまく行きました。
大変助かりました。

この場合、呼び出し側で戻り値を受ける変数も

 double (*tt)[2];

と宣言すれば良いことは分かりましたが、

 double tt[2][2];
tt=Matrix(PI/2);

のように配列変数のままにすると
型変換不能でコンパイルエラーになります。

何か良い方法がありましたら、
教えていただければありがたいです。

よろしくお願いします。

補足日時:2002/07/17 14:01
    • good
    • 0

んんん?



>やはり型変換できないとのエラーがでました。

エラー見せてください

この回答への補足

nagare様
アドバイスありがとうございます。

エラーは、コンパイルエラーで、
下記の通りでした。
環境は、Visual Studio.NETです。

「C2440 'return':'double[2][2]'から'double*'に
 変換できません。
 指示された型は関連がありません。」

よろしくお願いします。

補足日時:2002/07/17 13:49
    • good
    • 0

ありゃ エラーばかり見てました



たしかに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;
};

コーディングは参考程度にしてください。
    • good
    • 0

>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つだけです。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

コンパイルエラーにばかり気を取られ、
上記の重要な点を見落としていました。

今後ともよろしくお願いします。

お礼日時:2002/07/17 14:09

関数の型と返却値の型があっていません



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])です

この回答への補足

アドバイスありがとうございます。

double*も試してみたのですが、
やはり型変換できないとのエラーがでました。

補足日時:2002/07/17 11:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!