Fortran from C
宣言、呼出、Makefile

***宣言
extern "C" void energy_new_(float&, float&, float&, float&, float&, float&, float&, int&, float&, float&, float&);


***呼出

Projectile Material::PenetrateProjectile(Projectile Prj, double maxrange){ // Staticな初期値を指定することで、その引数を省略させられる
float e,zi,ai,zm,am,adj,rho,thick,enew,range;
int igas=0;

if (!maxrange) maxrange=width; //ここらへん全部キャスト(めんどくせえ)
e=(float)Prj.K();
zi=(float)Prj.Z(); ai=(float)Prj.A();
zm=(float)Z; am=(float)A;
adj=(float)I0; rho=(float)density; thick=(float)(maxrange*density);

energy_new_(e,zi,ai,zm,am,adj,rho,igas,thick,range,enew); //FORTRANのサブルーチンを呼んでいる。すべてByRef.

Prj.SetK((double)enew); //取得した運動エネルギーを(やっぱりキャストして)飛翔体に反映
return Prj;
}


***Makefile

all:
gfortran -c enew.f
gfortran -c eloss/rrange.f
g++ -DMEXP=19937 -c tips.cpp CProjectile.cpp CMaterial.cpp CMagnet.cpp CSlit.cpp CRandom.cpp SFMT/SFMT.c
gfortran -o tips tips.o CMaterial.o CMagnet.o CSlit.o CProjectile.o CRandom.o SFMT.o enew.o rrange.o -lc -lstdc++ -Bstatic -Bdynamic