よくあるcfortranのバグの傾向と対策 その1
pn.comp.sun より
[question]
解析のために C から HBOOK を使っているのですが、HFITHN が呼べません。
問題の部分は
#include
#include
float temp1[2], temp2[2], temp3[2], par353[2], sigpar353[2], chi2_353;
HFITHN( 353, "P1", "Q", 2, *par353, temp1, temp2, temp3, sigpar353, &chi2_353);
コンパイルすると HFITHN の行で incompatible types in initialization
というエラーが出ます。 対処方を教えてください。
ついでですが、HUNPAK と HUNPKEに関して の中に
/*#define HUNPAK(A1,A2,A3,A4) CCALLSFSUB4(HUNPAK,hunpak,INT,PFLOAT,STRING,INT,A1,A2,A3,A4)*/
#define HUNPAK(A1,A2,A3,A4) CCALLSFSUB4(HUNPAK,hunpak,INT,FLOATV,STRING,INT,A1,A2,A3,A4)
#define HUNPKE(A1,A2,A3,A4) CCALLSFSUB4(HUNPKE,hunpke,INT,PFLOAT,STRING,INT,A1,A2,A3,A4)
このような部分があって( A2の呼び方に関して )違いがあるのですが、
こういうものなのでしょうか? 実際、HUNPKE を HUPPAK と同じように
呼んでも warning が出るだけで、正しく動くようです。
[answer]
>> float temp1[2], temp2[2], temp3[2], par353[2], sigpar353[2], chi2_353;
>> HFITHN( 353, "P1", "Q", 2, *par353, temp1, temp2, temp3, sigpar353, &chi2_353);
>> コンパイルすると HFITHN の行で incompatible types in initialization
これを 1とします。
>> ついでですが、HUNPAK と HUNPKEに関して の中に
>> /*#define HUNPAK(A1,A2,A3,A4) CCALLSFSUB4(HUNPAK,hunpak,INT,PFLOAT,STRING,INT,A1,A2,A3,A4)*/
>> #define HUNPAK(A1,A2,A3,A4) CCALLSFSUB4(HUNPAK,hunpak,INT,FLOATV,STRING,INT,A1,A2,A3,A4)
>> #define HUNPKE(A1,A2,A3,A4) CCALLSFSUB4(HUNPKE,hunpke,INT,PFLOAT,STRING,INT,A1,A2,A3,A4)
>> このような部分があって( A2の呼び方に関して )違いがあるのですが、
>> こういうものなのでしょうか? 実際、HUNPKE を HUPPAK と同じように
>> 呼んでも warning が出るだけで、正しく動くようです。
これを2とします。
1と2は同根です。
大ざっぱにいって fortran では 引数はすべて アドレス渡しですが(本当は
処理系によるらしいですが:)、cでは値渡しとアドレス渡しを区別します。
cfortran.h では 、両者を区別します。 たとえば int の値渡しは
INT, アドレス渡しは PINT, また、int の配列は INTV と書くことになっています。
そして hbook.h etc では 、親切にも(当然か。)、関数(含サブルーチン)
のなかで値が変えられる場合には アドレス渡し、値渡しで済む変数には値渡し
として、例のマクロを定義しています。たとえば hbook1なら、
すべて値渡しですが、hroutならば 第二引数の icycle が outputを
入れるための場所なので(マニュアル参照)、
#define HROUT(A1,A2,A3) CCALLSFSUB3(HROUT,hrout,INT,PINT,STRING,A1,A2,A3)
と PINT が使われています。
(この手のことは /usr/local/lib/cfortran/cfortran.doc
に書いてあるので、一度は目を通すように。)
1については、第十引数の chi2 が output parameter ですが、
hbook.h が PFLOAT にすべきところを FLOAT のままにしています。
これが問題と思われます。hbook.hを修正して使ってください。
この種類のバグは、hbook.h geant**.h 等において 困ったことに
日常茶飯事です。hbookのマニュアルと、hbook.hを照合すると、
たいてい ヘッダファイルが間違っています。
(もちろんユーザが間違っている場合もあって、そのための
ヘッダファイルですが。)
2については、本来 floatの配列が入るはずなので、FLOATVが正しく、
PFLOATは間違いですが、実際問題としては 渡されるのがどちらも
アドレスなので、warning で済んでしまうのだと思います。
yokkaich@pn.scphys.kyoto-u.ac.jp