openGLによるドラッグ量検出

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TOA

openGLによるドラッグ量検出

#1

投稿記事 by TOA » 13年前

openGLのマウスイベントについて参考著書に掲載されているサンプルプログラムを実装したのですが、以下のようなエラーがでます。
開発環境はvc6.0,言語はc++を使っています。

'glutMouseFunc' : 1 番目の引数を 'void (int,int,int,int)' から 'void (__cdecl *)(int,int,int,int)' に変換できません。 (新しい機能 ; ヘルプを参照)
'glutMotionFunc' : 1 番目の引数を 'void (int,int)' から 'void (__cdecl *)(int,int)' に変換できません。 (新しい機能 ; ヘルプを参照)

メイン関数内で,コールバック関数の登録を記述するとエラーが出ます。
・プログラム抜粋

コード:

void doragMotion(int x,int y){
   //ドラッグの移動量を検出する処理
}
void mous(int button, int state, int x, int y){
     //クリックを検出する処理
}

int main(int argc, char *argv[]){
           
        glutMouseFunc(mouse);
        glutMotionFunc(dragMotion);

}     
doragMotion,mous関数はメインのヘッダでプロトタイプ宣言しています。
ググってみたところ,vc6.0特有?のエラーというような記述もあったんですが・・・
何らかの処理を加えることで解決できる方法が分かる方はご教授ください。
よろしくお願いします。

参考著書:はじめてのOpenGL MICC/工学社

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: openGLによるドラッグ量検出

#2

投稿記事 by ISLe » 13年前

ソースファイルの拡張子はcppでしょうか。
コールバック関数の宣言の前にextern "C"を付けたら良いかもしれません。

TOA

Re: openGLによるドラッグ量検出

#3

投稿記事 by TOA » 13年前

>>ISLeさん
ソースファイルの拡張子はcppです。

プロトタイプ宣言で以下のようにしても,エラーメッセージの変化はありませんでした。

コード:

#ifdef __cplusplus
extern "C" {
#endif

void mous(int button, int state, int x, int y);
void doragMotion(int x,int y);

#ifdef __cplusplus
}
#endif
このエラーが出るのは関数の呼び出し規約の相違が問題なんでしょうか?

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: openGLによるドラッグ量検出

#4

投稿記事 by ISLe » 13年前

TOA さんが書きました:このエラーが出るのは関数の呼び出し規約の相違が問題なんでしょうか?
__cdecl が呼び出し規約のキーワードですからね。

エラーメッセージで引数の並びは合っているので、質問に書いてあるコードで関数名が間違っているのは関係なさそうですね。

ソースファイルを分割しているのなら、関数定義側でもプロトタイプをインクルードしていないと食い違いが起きますが。

コンパイルオプション等で__cdeclがデフォルトでないのであれば__cdeclを明示する必要があります。

エラーメッセージの(ひとつ目の)関数原型に呼び出し規約が付いてないのがおかしいですけど、その辺がVC6特有なのかもしれません。
C++の最初の正式な言語規格よりも前に発売された製品ですから、現状で一般的なC++処理系と比較しておかしいのは仕方ないと思います。

TOA

Re: openGLによるドラッグ量検出

#5

投稿記事 by TOA » 13年前

>>ISLeさん

エラーメッセージで引数の並びは合っているので、質問に書いてあるコードで関数名が間違っているのは関係なさそうですね。
>単なる私の記載ミスでした。すみません。

コンパイルオプション等で__cdeclがデフォルトでないのであれば__cdeclを明示する必要があります。
>関数宣言部において次のように宣言を変更してもエラーメッセージは変わりませんでした。

コード:

void __cdecl mouse(int button,int state,int x,int y);
void __cdecl doragMotion(int x,int y);
解決策もなさそうなら,開発環境を変えようかなと思ってますが・・・

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: openGLによるドラッグ量検出

#6

投稿記事 by ISLe » 13年前

「プロトタイプ宣言で~」とか「関数宣言部において~」と書かれていますけど、質問に書かれたコードのようなひとつのソースファイルの中でエラーが出るということではないわけですよね。
どういうふうにソースファイルを分割してコンパイルしているかが重要なのですが。
TOA さんが書きました:解決策もなさそうなら,開発環境を変えようかなと思ってますが・・・
先にも書いたようにVC6はC++の規格が固まるより前に出たものですから、規格準拠度とかいうレベル以前にC++としての実装自体が適当なのです。
変えることができるなら変えたほうが良いです。

OpenGLというかGLUTを使うだけなら拡張子をcにしてC言語でプログラムすればこのエラーは出ないような気がします。
VC6でもCコンパイラとしての完成度は高いでしょうから。

仕事場で使っているので仕方なくということもなく、プログラミングの勉強ということであれば、最新のコンパイラを使うことをおすすめします。

TOA

Re: openGLによるドラッグ量検出

#7

投稿記事 by TOA » 13年前

>>ISLeさん

返信遅れて申し訳ありません。
環境開発を変更することにより、今回の問題はひとまず解決しました。

また、質問する機会があればよろしくお願いします。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る