fortran66のブログ

fortran について書きます。

F03GL について

以前の日記で Windows + IVF の組み合わせで動かないと書きましたが、http://d.hatena.ne.jp/fortran66/20090129その後わかったことをメモっておきます。

x64 版では OpenGL 描画窓を windows のチェックボックス等で消したときに、親の DOS 窓側が正常終了できないのは仕様のようで如何ともしがたいようです。OpenGL 側でESC 文字等を検知して終了動作を定義しておけば正常終了することがわかりました。

Win32 版では BIND(C, name='xxx') で指定するファイル名の尻に @nn の引数バイト数を入れなければいけないようです。コンパイラ指定子 !DEC$ での DECORATE に当たる自動修飾機能がコンパイラに備わっていないようで、手動で全部直すわけにもゆかず無理?

x64 チラシ裏メモ

G95 and F03GL http://www.dolfyn.net/dolfyn/f03gl_en.html
ここに乗せられているサンプル・プログラムのうち NIST f90gl、OpenGL Green Book の分は、比較的少数の修正(主にBIND(C)の処理と、文字列を C 式に配列で与えることにかかわる処理)で動かせました。ただし、GLUT,GLU,GL をライブラリ化しようとしても、MOD ファイルのインクルードがうまくいきませんでした。単に勘違いのせいかもしれませんが、C_BINDING が絡んでいるような感触を持ちました。これはソースコードを全部一緒にコンパイルすることで回避できます。

OpenGL Red Book に関しては、fgl10 のビットマップフォントの部分で多少書き換えないといけない部分がありました。fgl17 も若干修正が必要でした。それ以外のものは、BIND(C) を付け加える程度の修正で実行できたと思います。

OpenGL Blue Book のサンプル・プログラムは半数近く動きませんでした。Windows から簡単には OpenGL Ver.1.5 の機能が呼べないためです。そのため、その機能を用いている gltools.f90 中のいくつかのルーチンが使えません。

! glGenBuffers etc is available only if the GL version is 1.5 or greater.

また、アニメーション的な機能を実行するタイマー関数 glutTimerFunc もうまく働いていないようです。

call glutTimerFunc(33, TimerFunction, 1) 

再帰的に呼び出しているためではないかとも思われますが、今のところよくわかりません。

追記3.20
f90gl でも、Win32 なら glutTimerFuncは 動きますが、Win64 だと動かない感じです。しかし、出所の違うGLUTxx.DLL の類を突っ込みまくっているので再現性があるのかどうか分かりません・・・

<del datetime="2009-03-12T04:38:39+09:00">F03GLがWindowsでは動かない件について</del><span style="color:#FF0000;">F03GL が Windows で動いた件</span>

若干のソースの手直しで、 x64 版で動くことが判明しました。いずれ後日の日記にて。

Fortran から OpenGL を使う時に、F90GL というインターフェースを用いることが多かったわけですが、Fortran2003 で Fortran から C 言語ルーチンを呼び出すための規格が定まったことを受けて、F03GL というインターフェースが開発されているようです。

しかし、Windows+Intel Visual Fortran の組み合わせでは、 F03GL がうまく動きません。それは、Windows (32bit) 版での C サブルーチンの呼び出し規約がいわゆる _cdecl となっていているために、Fortran2003 規格が用意した standard call (?) と食い違っているために生じているようです。

64bit 版の Windows では名称の問題は回避できて、GLUT もふくめてコンパイルしなおせば、一応動くことは動くのですが、スタックのつみ方が異なるのか、それとも GLU32, OpenGL ルーチンが32bit 版になっているためなのか、正常に終了できません。

私には、ちょっといじっただけでは解決で出来そうにないです・・・