二次元配列を関数の引数として渡し、
その配列を戻り値として呼び出し元の変数に返したいです。
具体的にはルンゲクッタ法で微分する関数の引数を行列で扱いたいです。
for (i=0;i<N;i++){
for (j=0;j<N;j++){
y[i][j]=rand();
}
}
K1=h*ff(t,y);
K2=h*ff(t+h/2,y+K1/2);
K3=h*ff(t+h/2,y+K2/2);
K4=h*ff(t+h,y+K3);
Ka=(K1+2*K2+2*K3+K4)/6;
double ff(int t,double y[][]){
ここで
return y[][];
のような形で二次元配列を戻り値として変数に返したいのです。
}
C言語初心者なのでいまいちよくわかりません、
宜しくお願いいたします。
No.4ベストアンサー
- 回答日時:
>Ka=(K1+2*K2+2*K3+K4)/6;
>の文の後に元の配列y[][]にKa[][]を加える操作 y+Ka; をします。
>また、K2=h*ff(t+h/2,y+K1/2);
C言語では「配列同士」や「配列と数値」の演算は直接できませんので、K2=h*ff(t+h/2,y+K1/2) という式は書けないのですが、このあたりはご理解されているでしょうか?
ご理解されているという前提で続けますと、配列を渡してその中身を変えることなく結果を配列で返したいときは、構造体のメンバにする方法があります。
#define N 10
typedef struct
{
double K[N][N];
} hairetu;
hairetu ff(hairetu arr)
{
/* arr.K[][] に対して演算する */
return arr;
}
int main()
{
hairetu y, Ka;
int i, j;
for (i=0;i<N;i++){
for (j=0;j<N;j++){
y.K[i][j]=rand();
}
}
Ka = ff(y); /* y.K[][]の内容は変わらない。ffの演算結果をKa.K[][]に代入できる */
・・・・・
}
No.3
- 回答日時:
#1の方の指摘の通り、普通の変数は関数の中で値を変えても呼び出し元の変数は変わりませんが、
配列の場合はアドレスを渡すことになるので、特別な方法を使わない限り、関数の中で配列の中身を変更すると結果として呼び出し元の配列の中身も変わります。
ですから、特別な事情がない限り配列を返す必要はあまりありません。
普通の変数では
void ff(int a)
{
a = 3;
}
int main()
{
int a;
a = 0;
ff(a);
printf("%d\n", a); /* 0と表示される 3とは表示されない */
return 0;
}
配列では
void ff(int a[][4])
{
a[0][0] = 3;
}
int main()
{
int a[2][4];
a[0][0] = 0;
ff(a);
printf("%d\n", a[0][0]); /* 3と表示される 0とは表示されない */
return 0;
}
この回答への補足
回答ありがとうございます。
下の補足にも書かせていただきましたが、
書き忘れていましたが、
質問文のプログラム例の
Ka=(K1+2*K2+2*K3+K4)/6;
の文の後に元の配列y[][]にKa[][]を加える操作
y+Ka;
をします。
また、
K2=h*ff(t+h/2,y+K1/2);
K3=h*ff(t+h/2,y+K2/2);
K4=h*ff(t+h,y+K3);
のように
求めていくK1,K2,K3をそれぞれ関数の引数としてまた計算させたいのです。
その場合でも戻り値にしなくてもできるのでしょうか?
宜しくお願いいたします。
No.2
- 回答日時:
void ff(int t,double** ppY,int x,int y)
{
}
double ppy[10][9];
ff(8,(double**)ppy,10,9);
という感じではどうでしょうか?
引数で渡している二次元配列を処理して同じ二次元配列を返すだけでしたらあえてreturun ppy;のようにしなくてもいいかと思います。またx,yはppY[x][y]の最大インデックスを示しています。そうしないと変なメモリにアクセスしかねませんから。
この回答への補足
回答ありがとうございます。
このようにポインタを使うことで戻り値としても使えるのですね。
そのようにした場合、
K1=h*ff(t,(double**)ppy,10,9);
K2=h*ff(t+h/2,(double**)ppy+K1/2,10,9);
というようにしていけばいいのでしょうか?
すみませんが、宜しくお願いいたします。
No.1
- 回答日時:
戻り値として返すのは何か特別な目的があるのですか。
そうでなければ、戻り値を使わなくても引数にした配列に自動的に答えが戻ってきます。
配列はアドレス渡しですので、呼び出し側と関数側で同一配列を共用することになります。
この回答への補足
回答ありがとうございます。
すみません。
書き忘れていましたが、質問文のプログラム例の
Ka=(K1+2*K2+2*K3+K4)/6;
の文の後に元の配列y[][]にKa[][]を加える操作
y+Ka;
をします。
そうするとy[][]の値が変化していってしまうと不便だなと思ったのですが、いかがでしょうか。
宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 単振り子とルンゲ・タック法 1 2022/07/15 00:05
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- 数学 確率について 8 2023/08/25 04:21
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【速いブラインドタッチ】手を...
-
C言語 配列の長さの上限
-
擬似コード 長さがmの配列でな...
-
【エクセルVBA】Functionの引数...
-
二次元配列の引数渡し
-
パイソンの
-
2次元配列でエラーがでます。
-
先頭アドレスとは何ですか?
-
市販のビンゴカードについて
-
配列を使わずに、変数名を動的...
-
配列で格納したものをmsgboxで...
-
構造体配列を引数とするDLL作成...
-
C# Listを使わずに2次元配列の...
-
太鼓の達人の段位道場3級にて、
-
unsigned char配列への入力の仕方
-
c言語の型宣言 VBAの型宣言で D...
-
テキストファイルから文字列を...
-
VBAにてcolorindexを変数に格納...
-
日付チェック関数について
-
関数から配列を返すには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 配列の長さの上限
-
配列を使わずに、変数名を動的...
-
先頭アドレスとは何ですか?
-
配列で格納したものをmsgboxで...
-
C# Listを使わずに2次元配列の...
-
C# 配列の変数宣言について。
-
テキストファイルから文字列を...
-
配列の参照渡しで型が一致しま...
-
ExcelVBAで質問です。離れた二...
-
unsigned char配列への入力の仕方
-
VBで構造体の配列を関数に渡す...
-
C++ vectorに配列をプッシュしたい
-
C言語で特定列だけを抽出して配...
-
Excel、VBAのユーザーフォーム...
-
複数の選択範囲の行番号を個別...
-
配列をEraseしてもメモリが開放...
-
配列を含む構造体の初期値について
-
【速いブラインドタッチ】手を...
-
C言語 配列の再初期化
-
Redimした動的配列はEraseする...
おすすめ情報