- ベストアンサー
windowsプログラミング
windowsプログラミングを始めたばかりの者です。 サンプルのhelloを書き換えたりして勉強しています。 都合上Fortranのサブルーチンを呼び出さなくてはいけないのですが、どうやってもうまくいきません。外部シンボルがエラーになってしまうのです。 windowsプログラミングでない場合はCからFortranを呼び出せたのですが・・・。 switch( wmId ) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX,hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow( hWnd ); break; case IDM_AAA: BBB();----->これを呼び出したい! MessageBox(hWnd , "終了しました", title,MB_OK | MB_ICONEXCLAMATION); break; default: return DefWindowProc( hWnd, message,wParam, lParam ); } どこにプロトタイプ宣言や関数を書いていいのか等よく分かりません。詳しい方、ご教授よろしく願います。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
開発言語内の関数名とコンパイル・リンクされる関数名は異なる場合がほとんどです。 大体、以下の様な形が一般的か? C) BBB() ---> _BBB FORTRAN) BBB() ----> _bbb_ http://rakasaka.fc2web.com/fortran/fortran.html#g77_gcc C++) BBB() ---> パラメータに応じて難しい名前に なるので興味が有れば調べて見てください。難しい名前にしたくない場合は extern "C" で関数名を宣言しておきます。 よって、言語が異なる場合、リンクされる実際の名称をあわせないと質問者のようなエラーになります。 <実際の対応> コンパイラーにより、作成される実際の名称が異なるので、どの様に作成されるか調査する(マニュアルに書いてあると思われます)。見つからない場合、コンパイル・リンクオプションでファイルリステイングやMAPファイル出力などを行い、関数名称を確認する。 VC++6でファイルリステイングした例) cファイルからのbbbコール部分のASM結果 ; 3 : BBB() ; call _BBB <実際の対応2> BBB() ではなく bbb_() として呼んでみれば良いかもしれません?? また C++の場合 関数宣言といして extern "C" { float bbb_() ; //double かも? } をファイルの先頭に記述しておく事が必要でしょう。
その他の回答 (3)
- jacta
- ベストアンサー率26% (845/3158)
ちなみに、(Cではなく)C++であれば、処理系によっては、 extern "C" の代わりに extern "FORTRAN" を使えば、Fortranとリンクできる場合があります。
お礼
ありがとうございます。 私の処理系では"FORTRAN"ではできませんでしたが、今後の参考にします。
- jacta
- ベストアンサー率26% (845/3158)
最低限、使用しているCとFortranの処理系が何かぐらいは書きましょう。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
まず、一般的に使えるCからFortranの呼び出し方法はありません。別の言語とのリンク手段は標準的には準備されていないからです。 両方の言語のコンパイラとして同じメーカーのものをお使いであれば、可能かもしれません。その場合は、C言語とFortran のマニュアルのいずれかに、呼び出し方がかかれています。 Windows プログラムでない場合は可能だったとのことですが、それは、Windows プログラムと同じコンパイラを使っての話でしょうか? もしそうであれば、同じように可能なはずです。 もしかしたら、プロトタイプとして、 extern "C" BBB(); をC言語のソースに入れれば、リンクはできるかもしれません。
お礼
ありがとうございます。 できました。勘違いしてたみたいで__stdcall を使って呼び出そうとしていました。 "C"を使えばいいんですね。
お礼
詳しい説明ありがとうございます。 参考ページも今後参考にさせていただきます。