以下の文はある本から抜粋してきたガウス・ジョルダン法のサブルーチンです。Cに翻訳してくださいって言ったら怒りますか?(笑
c Gauss-Jordan method
subroutine gj(a,n1,nn,m,epsl,isw)
double precision a,epsl,p,w
dimension a(n1,*)
nplsm=nn+m
do 100 n=1,nn
p=0.0
do 10 i=n,nn
if(p.lt.abs(a(i,n))) then
p=abs(a(i,n))
ip=i
end if
10 continue
if(p.le.epsl) then
isw=1
write(6,*) 'error'
return
end if
do 20 j=n,nplsm
w=a(n,j)
a(n,j)=a(ip,j)
20 a(ip,j)=w
do 30 j=n+1,nplsm
30 a(n,j)=a(n,j)/a(n,n)
do 40 i=1,nn
if(i.ne.n) then
do 45 j=n+1,nplsm
45 a(i,j)=a(i,j)-a(i,n)*a(n,j)
end if
40 continue
100 continue
isw=0
return
end
だいたい自分でもCに書き換えることはできたんですが、次のところがどのように書き換えたらよいのか分かりません。
subroutine gj(a,n1,nn,m,epsl,isw),
dimension a(n1,*),
do 20 j=n,nplsm
w=a(n,j)
a(n,j)=a(ip,j)
20 a(ip,j)=w
どうかよろしくお願いします。
No.3ベストアンサー
- 回答日時:
No.1です。
よく見たら、配列以外はすべてコピー渡しで十分ですね。だから、
void gj(double *a[][], int *n1, int *nn, ...)
は
void gj(double *a[][], int n1, int nn, ...)
でも問題ありません。(当然、関数内部は少し書き換える)
でも、Gauss-Jordan法のソースなら、たぶん検索エンジンで英語のページとか探せば見つかるんじゃないかな…
と思って探したら、見つかりました。No.2の方がお勧めの本のオンライン版です。ただし英語ですが。
ソースの中にivector(1,n)といった関数がありますが、これは可変長配列(必要な分だけ勝手に長さが変わる配列)を作る関数だと思います(たぶん本のどこかにソースが載っているはず)。
参考URL:http://www.ulib.org/webRoot/Books/Numerical_Reci …
No.4
- 回答日時:
FORTRANの2次元配列と違いCでは可変長の2次元配列をFORTRANのように作ることが出来ません。
つまり、
FOTRANでは、
dimension a(n1,n2)
というサイズを変数n1,n2で指定した変数を宣言できます。しかし、Cではこのような宣言は許されていません。
つまり、
double a[n1][n2];
はエラーになります。
この部分を同等にするには、工夫が必要です。
やり方は2とおりあります。
a[i][j] = xxxx.....;
のように、FORTRANと同じように取り扱いたい場合は、サイズをn1,n2として、
double **a;
int i;
a = (double **) malloc( n1 * sizeof(double *) );
for (i = 0; I < n1; i++)
a[i] = (double *) malloc( n2 * sizeof(double) );
とします。これによりa[n1][n2]の配列が出来上がります。
これはサブルーチンを呼ぶ側で作り、そして、 (double **) の型で n1, n2とともに渡せばよいわけです。
別の方法は、FORTRANと同様な2次元配列を扱う関数群を作ることです。
しかし、これだと直接a[i][j]のようなアクセスは出来ません。( SetValue(a, i, j, value) みたいに関数呼び出しで値をセットする )
C++であれば、FORTRANと全く同じ扱いになる配列は作れるんですけどね。
では。
No.1
- 回答日時:
fortranですか、懐かしい…私もあまり詳しくないので、間違いがあるかもしれません。
>subroutine gj(a,n1,nn,m,epsl,isw),
fortranのsubroutineはなかなかCには直しづらいですね。普通の関数のように記述してありますが、これはすべてポインタ渡しを行うのと等価です。つまり、Cの関数のコピー渡しでは渡された値をいじっても元の値は変化しないのに対して、fortranのsubroutineに渡された変数は、すべてサブルーチンの中から操作可能です。これをC言語では次のように定義します。
void gj(double *a[][], int *n1, int *nn, ...)
として、関数内では
a(i,j)=a(i,j)*2
のようにしていたものを、
*a[i][j] = *a[i][j] * 2;
のようにするはずです(自信なし)。
>dimension a(n1,*)
これは関数を定義する際に記述した(double *a[][]の部分)ので不要。
>do 20 j=n,nplsm
>w=a(n,j)
>a(n,j)=a(ip,j)
>20 a(ip,j)=w
これは以下のようにする。
double w;
int n_ = *n;
int ip_ = *ip;
for(int j=n_; n_<=nplsm; j++){
w = *a[n_][j];
*a[n_][j] = *a[*ip_][j];
*a[ip_][j] = w;
}
でも、これはあまりきれいな方法ではありません。実際には構造体を用いて、
typedef struct {
double a[NUM_X][NUM_Y]; //適当な数を#defineしておくか、double **a;として後でmallocする
int n1;
int nn;
...
}GaussJordan; //もっとマシな名前を付けて
としたものを
void gj(GaussJordan *ga){
int nn_ = ga->nn;
for(int n=1; n<=nn_; n++){
...
}
}
のようにします。関数の内部は、上の例で*(アスタリスク)をつけていた変数に、ga->をつけるようにします(アロー演算子)。
もしあなたがC言語の初心者だったら、これは理解できないと思います。最低限ポインタの概念を理解していないと…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
define で 配列
-
C言語の2次元配列 容量が大き...
-
C言語 数値の連続入力について
-
MFC - ダイアログボックスのPic...
-
Cのエラー
-
要素数・要素の値が未定の配列...
-
C言語 ビットフィールドについて
-
C言語において、 配列要素をひ...
-
ファイルのデータを構造体に代...
-
eの計算
-
C言語への翻訳お願いします
-
C言語のプログラミングで、ある...
-
char型配列をint型に代入するには
-
配列の要素数に変数を入れたい...
-
c言語
-
関数の仮引数は宣言か式か
-
2次元配列のマスを数える方法...
-
C#で構造体の配列を持った構造...
-
C言語(サイズ指定のない配列)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
構造体のextern方法
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
MFC - ダイアログボックスのPic...
-
C言語の2次元配列 容量が大き...
-
2次元配列のマスを数える方法...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C#で配列が空かを判定するには?
-
C#でのフィボナッチ数列
-
ポインタを使って構造体の配列...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
C言語の配列のコピーについて
おすすめ情報