FORTRANからCへの移植
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[並列グループ各種情報]]
* 引数 [#h38d4818]
関数・サブルーチンの引数はデフォルトで参照渡し。
call hoge(x, y)
:
subroutine hoge(w, z)
integer w
double precision z
if (z .ge. 1) then
w = w + 1;
end
return
end
なら、
hoge(&x, y);
:
void hoge(int *w, double z){
if (z >= 1){
*w = *w + 1;
}
}
のようにする。w, zともにポインタにしても良いが、
この例の場合zはサブルーチン側で読み出しのみなので、
Cのコードでは値渡しにしている。
* べき乗 [#cca85e78]
FORTRANではべき乗演算子**がある。
x = 3**3
y = 7**7
z = 2**8
Cにはこのような演算子がないので、
- 回数が少なければ、かけ算に展開する
- mathライブラリのpow関数を使う
- 2のべき乗ならシフト演算子を使う
といった方法をとる。
x = 3*3*3;
y = pow(7, 7);
z = 1 << 8;
* 倍精度実数 [#q1469d1d]
倍精度実数(double precision)の定数値は、次のような書き方...
x = 12345678.d0
y = 1.d-8
これは指数形式でdの後の数字は10の何乗を掛けるかを表す。
したがってCでは以下のように書けばよい
x = 12345678e0
y = 1e-8
* 配列変数 [#ba89a83f]
FORTRANでは添え字はデフォルトで1から。宣言時に指定可能。
添え字の括弧は丸括弧。
たとえば
integer i
double precision x
common/storage/ x(1000)
do 100 i=1,1000
x(i)=i
100 continue
をCで書き直すと以下のようになる
int i;
double x[1000];
for (i=0;i<1000;i++){
x[i]=i;
}
*continue [#j2564584]
continue文自体には効果がなく、
行番号を付加してdoの範囲やgotoの行き先を示すだけのもの。
Cのcontinueのように「ループの次のイテレーションに進む」効...
したがって、
do 200 i=1, 1000
do 100 j=1, 10
if (x[i] .eq. j) goto 150
100 continue
150 continue
200 continue
のようなコードであれば、150行のcontinueはただのラベルなの...
Cに直すと以下のようになる。
for (i=0; i<1000; i++){
for (j=0; j<10; j++){
if (x[i] == j) break;
}
}
ただし、100行と150行の間に実行コードがある場合、
FORTRAN版では条件成立時にスキップされるが、
上記のCコードだと常に実行されてしまう。
このような場合はCでもgoto文とラベルを使えばよい。
* 参考ページ [#jb531ada]
-Fortran入門:http://www.nag-j.co.jp/fortran/index.html
--知識として必要な過去のFortran:http://www.nag-j.co.jp/fo...
終了行:
[[並列グループ各種情報]]
* 引数 [#h38d4818]
関数・サブルーチンの引数はデフォルトで参照渡し。
call hoge(x, y)
:
subroutine hoge(w, z)
integer w
double precision z
if (z .ge. 1) then
w = w + 1;
end
return
end
なら、
hoge(&x, y);
:
void hoge(int *w, double z){
if (z >= 1){
*w = *w + 1;
}
}
のようにする。w, zともにポインタにしても良いが、
この例の場合zはサブルーチン側で読み出しのみなので、
Cのコードでは値渡しにしている。
* べき乗 [#cca85e78]
FORTRANではべき乗演算子**がある。
x = 3**3
y = 7**7
z = 2**8
Cにはこのような演算子がないので、
- 回数が少なければ、かけ算に展開する
- mathライブラリのpow関数を使う
- 2のべき乗ならシフト演算子を使う
といった方法をとる。
x = 3*3*3;
y = pow(7, 7);
z = 1 << 8;
* 倍精度実数 [#q1469d1d]
倍精度実数(double precision)の定数値は、次のような書き方...
x = 12345678.d0
y = 1.d-8
これは指数形式でdの後の数字は10の何乗を掛けるかを表す。
したがってCでは以下のように書けばよい
x = 12345678e0
y = 1e-8
* 配列変数 [#ba89a83f]
FORTRANでは添え字はデフォルトで1から。宣言時に指定可能。
添え字の括弧は丸括弧。
たとえば
integer i
double precision x
common/storage/ x(1000)
do 100 i=1,1000
x(i)=i
100 continue
をCで書き直すと以下のようになる
int i;
double x[1000];
for (i=0;i<1000;i++){
x[i]=i;
}
*continue [#j2564584]
continue文自体には効果がなく、
行番号を付加してdoの範囲やgotoの行き先を示すだけのもの。
Cのcontinueのように「ループの次のイテレーションに進む」効...
したがって、
do 200 i=1, 1000
do 100 j=1, 10
if (x[i] .eq. j) goto 150
100 continue
150 continue
200 continue
のようなコードであれば、150行のcontinueはただのラベルなの...
Cに直すと以下のようになる。
for (i=0; i<1000; i++){
for (j=0; j<10; j++){
if (x[i] == j) break;
}
}
ただし、100行と150行の間に実行コードがある場合、
FORTRAN版では条件成立時にスキップされるが、
上記のCコードだと常に実行されてしまう。
このような場合はCでもgoto文とラベルを使えばよい。
* 参考ページ [#jb531ada]
-Fortran入門:http://www.nag-j.co.jp/fortran/index.html
--知識として必要な過去のFortran:http://www.nag-j.co.jp/fo...
ページ名: