よくある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