• 締切済み

二次元配列を引数として渡し、再び返す方法

c++を用いてます。 main関数内において、二次元配列(行列)の計算によって各成分の値を求め、 その二次元配列を関数の引数として渡し、成分を用いて計算した後、再び返す方法を知りたいです。 具体的には、ルンゲクッタ法を用いたプログラムで、 #include<iostream> : double g11(double D[][9],double x11~) double g12(double D[][9],double x11~) : int main(void) { (中略)double D[6][9]=などの定義をしています for(i=0;i<100;i+) { 行列の計算(積や逆行列の計算) ルンゲクッタ法 (ここでg11を用います) k111=h*g11(D,x11,…); : dx11=(k111+…)/6.0; : cout<<x11…<<endl; x11+=dx11; x12+=dx12; : } return 0; } double g11 (double D[][9],double x11…) { double dif; dif=D[0][0]*x11+D[0][1]*x12+…   return(dif); } double g12 (double D[][9],double x11…) { double dif; dif=D[1][0]*x11+D[1][1]*x12+…   return(dif); } : というようなプログラムです。エラーは出ないのですが、値が一瞬で発散してします。 ちなみに、D[6][9]は行列の積や逆行列の計算を行った結果得られた二次元配列です。 おそらくポインタをうまく使わないといけないことはなんとなく解るのですが…。 プログラムの説明が解りにくくて申し訳ないのですが、よろしくお願いいたします。

みんなの回答

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

ルンゲクッタ法のことはいったん脇へ置いて、 >二次元配列を関数の引数として渡し、成分を用いて計算した後、再び返す このことだけを実現するコードを書いてみてはいかがでしょうか。 ルンゲクッタ法の話は、今は傍流ですよね? 大きな問題を小分けにする方が早く解決するのではないかと思います。

okakao
質問者

お礼

回答ありがとうございます。 そうですね。あまり時間がないので焦ってしまっていました。 一つ一つ試してみて、それで解決できなかったら質問させていただくことにします。 アドバイスありがとうございます。

  • yama1718
  • ベストアンサー率41% (670/1618)
回答No.2

単純な配列よりも、構造体などで型宣言してポインタでやり取りすると、 うまくできると思いますよ。

okakao
質問者

補足

回答ありがとうございます。 自分がC言語初級者ということもあり、構造体などに関する知識が乏しいもので…できるだけ配列のみを用いてプログラムを作ろうとしていました。 もう少し考えてみて、うまくいかなそうだったら構造体を用いることも視野に入れてみたいと思います。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

行数がそれほど多くないのでしたら、全部見せてください。 中略が多すぎて、プログラム全体の流れがわかりません。 やりたいことは、 main関数で値を格納したD[][]の内容を、g11関数を呼び出した後でも 使いたい、ということですか? だとすると、今のソースでも、mainからg11へ、配列へのポインタとして 受け渡しできていると思います。 g11やg12で、D[][]の値を参照しているだけで変更していない(ように見える)のは、正しいのですか?

okakao
質問者

補足

回答ありがとうございます。 説明が下手ですいません。やりたいことは、D[][]の内容をg11に用いて、そのg11をルンゲクッタ法に用いたい。ということです。 g11において、D[][]の値は変更していません。使っているだけです。 このプログラムで正しいということでしょうか?だとしたら、一応何度も確認はしたのですが、他の場所が違っているのかもしれません…。 行数は、係数や変数が多く、自分のプログラムが下手なせいもあり、全部で500行近くになってしまったので… なお、g11などというのはg11,g12,g13,g21,g22,g23,g31,g32,g33の9つがあります。 流れとしては、 行列計算によりD[][](D[][]にはx11などが用いられている)を求める→それを用いてg11関数などの計算を行う→g11などをルンゲクッタ法に用いてx11などを更新する→繰り返す という流れです。

関連するQ&A