Nobuhito Mori
Navigation :
開始行:
*FORTRANとCが混在したプログラム [#ubf9712b]
#contents
*注意事項 [#e053c52c]
-cから見ると,fortranのサブルーチン”XXX”は,”XXX_”という...
これはnm XXX.oで確認できる.
-実行ファイルは,各サブルーチンをf77 -c XXX.fとしてオブジ...
-ccを使用してcのメインルーチンをコンパイルすると,fortran...
-2次元配列の引き渡しは,cの方が1つ余分に宣言しておく.
例) 3X3行列
c:
int dat1[3][3];
int nx=3, ny=3
f:
subroutine matrix(a,nx,ny)
integer*4 nx,ny
integer*4 a(nx,ny),b(nx,ny)
理由は,cの行列は(0-2,0-2)であるが,fortranでは(1-3,1-3)...
-2次元配列はcとfortranのルーチンの間では転地行列となるの...
例)
********************************************************...
転置行列を計算 - CとFortran間での2次元配列のやりとり
* ------------------------------------------------------...
* transpose_2dmatrix_i / 整数行列
* transpose_2dmatrix_i / 実数行列
* transpose_2dmatrix_i / 倍精度実数行列
* ------------------------------------------------------...
* Input:
* a - Matrix with (nx,ny)
* nx - number of gyo of matrix a
* ny - number of retsu of matrix a* Output:
* b - Transpose Matrix of a ** Dec.7, 1998 / Nobuhito Mo...
********************************************************...
subroutine transpose_2dmatrix_i(a,b,nx,ny)
********************************************************...
* global variables
integer*4 nx,nyinteger*4 a(nx,ny), b(nx,ny)
* local variables
integer*4 c(nx*ny)integer*4 i, j, k
*=======================================================...
k=0
do 10 j=1, ny
do 10 i=1, nx
k=k+1
c(k)=a(i,j)
10 continuek=0
do 20 i=1,nx
do 20 j=1,ny
k=k+1
b(i,j)=c(k)
20 continue
return
end
--------------------------------
*Cプログラムの中からFORTRANサブルーチンを呼ぶ [#v4d3436c]
CのプログラムとFORTRANのプログラムを混在して使いたい場合...
それぞれの言語の枠の中では関数名や変数名などユーザが定義...
% cat test.c
int inc1( i )
int i;
{
return i + 1;
}
% cc -c test.c
% nm test.o
00000000 T _inc1
%
C言語の枠組みではinc1という関数を定義したのですが、オブジ...
% cat testf.f
integer function inc1( i )
integer i
inc1 = i + 1
return
end
% f77 -c testf.f
% nm testf.o
00000000 T _inc1_
今度は前と後ろに_が付きました。FORTRANの場合自動的に前と...
次に考えなければならないのは引数の与え方です。Cの場合は基...
/* Cプログラムの中 */
int i, j;
i = 10;
j = inc1_( & i ); /* FORTRAN のinc1を呼んだ...
ということになります。関数の値の戻し方は同じです。このよ...
CのプログラムとFORTRANプログラムで最も取り扱い方が異なる...
こういったことに注意しながら文字列を扱う例を見ていきまし...
subroutine sub1( str1, str2 )
character str1*40, str2*80
という関数をCから呼ぶときは
char str1[ 40 ], str2[ 80 ];
sub1_( str1, str2 );
というように同じ長さの文字列を宣言しておく必要があります...
subroutine sub2( str1, str2 )
character str1*(*), str2*(*)
固定長なのに長さが指定されていません。この場合はFORTRANプ...
char str1[ 40 ], str2[ 80 ];
sub2_( str1, str2, 40, 80 );
(*)型の引数の分だけ文字列の実際の長さを引数に追加します。...
---------------------------------------------
*FORTRANプログラムの中からCの関数を呼ぶ [#n62d0171]
では次にFORTRANプログラムからCの関数を呼び出す場合を考え...
% cat test.c
/* FORTRANコーラブルなinc1 */
int inc1_( pi )
int * pi;
{
return * pi + 1;
}
これをFORTRAN側では
* FORTRANプログラムの中
integer i
i = 10
j = inc1( i )
という風になります。このようにFORTRANから任意のCサブプロ...
------------------------------------------
*FORTRANコモンブロックをCから使う [#h5f87ae6]
大規模なFORTRANプログラムではコモンブロックを頻繁に使いま...
* FORTRANプログラムの宣言文
common /testcb/ k, f
integer k
doubleprecision f
この場合コモンブロックは_testcb_という名前が付きます。名...
/* Cプログラムの中 */
extern struct {
int k;
double f;
} testcb_;
...
testcb_.k = 10; /* コモンブロックの要素k...
もちろん構造体testcb_のメンバーとFORTRANのコモンブロック/...
--------------------------------------------------
*CとFORTRANの混在したプログラムのリンク [#re185270]
ここまででCとFORTRANの混在したプログラムの書き方を見てき...
Cのプログラムをリンクする場合UNIXのシステムコールとCのラ...
もう一つ注意する点はプログラムのエントリーポイントのこと...
見てきたようにFORTRANとCそれぞれが非常に重要な役割をはた...
-Cが有利であると思われること
シェルからの引数がmainで渡せる。コマンド組み込み...
(FORTRANでも引数を参照する関数は用意され...
システムコールはCから呼ぶように設計されている。
(FORTRANから呼ぶインターフェースもある)
構造体やポインターが扱える。
(FORTRANでも仕様拡張によりできることが多い)
-FORTRANが有利であると思われること
CERNLIBはFORTRANからの呼出しを前提に書かれている。
(Cからだって呼べないことはない)
一般ユーザはFORTRANの方が使い慣れている。
(ユーザ定義関数だけFORTRANで書かせること...
終了行:
*FORTRANとCが混在したプログラム [#ubf9712b]
#contents
*注意事項 [#e053c52c]
-cから見ると,fortranのサブルーチン”XXX”は,”XXX_”という...
これはnm XXX.oで確認できる.
-実行ファイルは,各サブルーチンをf77 -c XXX.fとしてオブジ...
-ccを使用してcのメインルーチンをコンパイルすると,fortran...
-2次元配列の引き渡しは,cの方が1つ余分に宣言しておく.
例) 3X3行列
c:
int dat1[3][3];
int nx=3, ny=3
f:
subroutine matrix(a,nx,ny)
integer*4 nx,ny
integer*4 a(nx,ny),b(nx,ny)
理由は,cの行列は(0-2,0-2)であるが,fortranでは(1-3,1-3)...
-2次元配列はcとfortranのルーチンの間では転地行列となるの...
例)
********************************************************...
転置行列を計算 - CとFortran間での2次元配列のやりとり
* ------------------------------------------------------...
* transpose_2dmatrix_i / 整数行列
* transpose_2dmatrix_i / 実数行列
* transpose_2dmatrix_i / 倍精度実数行列
* ------------------------------------------------------...
* Input:
* a - Matrix with (nx,ny)
* nx - number of gyo of matrix a
* ny - number of retsu of matrix a* Output:
* b - Transpose Matrix of a ** Dec.7, 1998 / Nobuhito Mo...
********************************************************...
subroutine transpose_2dmatrix_i(a,b,nx,ny)
********************************************************...
* global variables
integer*4 nx,nyinteger*4 a(nx,ny), b(nx,ny)
* local variables
integer*4 c(nx*ny)integer*4 i, j, k
*=======================================================...
k=0
do 10 j=1, ny
do 10 i=1, nx
k=k+1
c(k)=a(i,j)
10 continuek=0
do 20 i=1,nx
do 20 j=1,ny
k=k+1
b(i,j)=c(k)
20 continue
return
end
--------------------------------
*Cプログラムの中からFORTRANサブルーチンを呼ぶ [#v4d3436c]
CのプログラムとFORTRANのプログラムを混在して使いたい場合...
それぞれの言語の枠の中では関数名や変数名などユーザが定義...
% cat test.c
int inc1( i )
int i;
{
return i + 1;
}
% cc -c test.c
% nm test.o
00000000 T _inc1
%
C言語の枠組みではinc1という関数を定義したのですが、オブジ...
% cat testf.f
integer function inc1( i )
integer i
inc1 = i + 1
return
end
% f77 -c testf.f
% nm testf.o
00000000 T _inc1_
今度は前と後ろに_が付きました。FORTRANの場合自動的に前と...
次に考えなければならないのは引数の与え方です。Cの場合は基...
/* Cプログラムの中 */
int i, j;
i = 10;
j = inc1_( & i ); /* FORTRAN のinc1を呼んだ...
ということになります。関数の値の戻し方は同じです。このよ...
CのプログラムとFORTRANプログラムで最も取り扱い方が異なる...
こういったことに注意しながら文字列を扱う例を見ていきまし...
subroutine sub1( str1, str2 )
character str1*40, str2*80
という関数をCから呼ぶときは
char str1[ 40 ], str2[ 80 ];
sub1_( str1, str2 );
というように同じ長さの文字列を宣言しておく必要があります...
subroutine sub2( str1, str2 )
character str1*(*), str2*(*)
固定長なのに長さが指定されていません。この場合はFORTRANプ...
char str1[ 40 ], str2[ 80 ];
sub2_( str1, str2, 40, 80 );
(*)型の引数の分だけ文字列の実際の長さを引数に追加します。...
---------------------------------------------
*FORTRANプログラムの中からCの関数を呼ぶ [#n62d0171]
では次にFORTRANプログラムからCの関数を呼び出す場合を考え...
% cat test.c
/* FORTRANコーラブルなinc1 */
int inc1_( pi )
int * pi;
{
return * pi + 1;
}
これをFORTRAN側では
* FORTRANプログラムの中
integer i
i = 10
j = inc1( i )
という風になります。このようにFORTRANから任意のCサブプロ...
------------------------------------------
*FORTRANコモンブロックをCから使う [#h5f87ae6]
大規模なFORTRANプログラムではコモンブロックを頻繁に使いま...
* FORTRANプログラムの宣言文
common /testcb/ k, f
integer k
doubleprecision f
この場合コモンブロックは_testcb_という名前が付きます。名...
/* Cプログラムの中 */
extern struct {
int k;
double f;
} testcb_;
...
testcb_.k = 10; /* コモンブロックの要素k...
もちろん構造体testcb_のメンバーとFORTRANのコモンブロック/...
--------------------------------------------------
*CとFORTRANの混在したプログラムのリンク [#re185270]
ここまででCとFORTRANの混在したプログラムの書き方を見てき...
Cのプログラムをリンクする場合UNIXのシステムコールとCのラ...
もう一つ注意する点はプログラムのエントリーポイントのこと...
見てきたようにFORTRANとCそれぞれが非常に重要な役割をはた...
-Cが有利であると思われること
シェルからの引数がmainで渡せる。コマンド組み込み...
(FORTRANでも引数を参照する関数は用意され...
システムコールはCから呼ぶように設計されている。
(FORTRANから呼ぶインターフェースもある)
構造体やポインターが扱える。
(FORTRANでも仕様拡張によりできることが多い)
-FORTRANが有利であると思われること
CERNLIBはFORTRANからの呼出しを前提に書かれている。
(Cからだって呼べないことはない)
一般ユーザはFORTRANの方が使い慣れている。
(ユーザ定義関数だけFORTRANで書かせること...
ページ名:
MENU
INTRODUCTION
RESEARCH
EDUCATION
MEMO
COMPUTER
RESEARCH
ETC
LINK
最新の5件
2024-03-23
Publications/Journal Papers
2024-03-17
Introduction/CV in English
Introduction/CV in Japanese
2024-02-01
Publications/学会発表講演集・アブストラクト
2024-01-26
Publications/メディア等
カスタム検索
Counter
Total : 0
Today : 0
Yesterday : 0
Edit Menu
[
新規
] [
ヘルプ
]
Site Search
AND
OR