いつもお世話になっています。
角度を入力すると、
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;
}
No.6
- 回答日時:
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);
のように配列変数のままにすると
型変換不能でコンパイルエラーになります。
何か良い方法がありましたら、
教えていただければありがたいです。
よろしくお願いします。
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;
};
コーディングは参考程度にしてください。
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つだけです。
アドバイスありがとうございます。
コンパイルエラーにばかり気を取られ、
上記の重要な点を見落としていました。
今後ともよろしくお願いします。
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])です
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- Visual Basic(VBA) Excel のユーザー定義関数でソルバーが動作しない 1 2022/09/05 19:51
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 配列の再初期化
-
先頭アドレスとは何ですか?
-
シグマの計算
-
C言語 配列の長さの上限
-
配列をEraseしてもメモリが開放...
-
.net 2010VB配列TextBox貼り付ける
-
C言語について質問お願いします...
-
Excel関数でのコロンの使い方
-
ミャンマー語の文字がない。
-
配列とその要素数をメンバにも...
-
C++ vectorに配列をプッシュしたい
-
FORTRANとC言語のデー...
-
C言語のプログラムについての質...
-
RGB値を画像(PNG・BMPJPEGなど)...
-
教えてください。 配列とポイン...
-
【速いブラインドタッチ】手を...
-
C++を本で独学してますが、配列...
-
C言語のint (*)[5]型と参照につ...
-
本日までの累計を表示させたい!
-
配列の参照渡しで型が一致しま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
unsigned char配列への入力の仕方
-
ExcelVBAで質問です。離れた二...
-
配列の参照渡しで型が一致しま...
-
パイソンの
-
C# Listを使わずに2次元配列の...
-
C言語で特定列だけを抽出して配...
-
複数の選択範囲の行番号を個別...
-
【C言語】配列の中に配列を入れ...
-
メモリの初期値
-
VBで構造体の配列を関数に渡す...
-
Excel、VBAのユーザーフォーム...
-
配列をEraseしてもメモリが開放...
-
2次元配列を戻り値とする関数?
-
【速いブラインドタッチ】手を...
おすすめ情報