以前の日記で Windows + IVF の組み合わせで動かないと書きましたが、http://d.hatena.ne.jp/fortran66/20090129その後わかったことをメモっておきます。
- F03GL (Fortran2003 での GLUT の実装)http://www-stone.ch.cam.ac.uk/pub/f03gl/index.xhtml
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 の類を突っ込みまくっているので再現性があるのかどうか分かりません・・・