アプリ版:「スタンプのみでお礼する」機能のリリースについて

質問事項


1)目的のglut.dll内のglutKeyboardFuncの仕様

   glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))

   質問1)この仕様がC++風に記述されており仮引数仕様を理解できていませんので、解説をお願い致します

2)インポート文

[SuppressUnmanagedCodeSecurity()]
[DllImport("glut.dll", EntryPoint = "glutKeyboardFunc", ExactSpelling = true)]
internal extern static void GlutKeyboardFunc(?????)

質問2:仮引数をどのように記述すべきなのでしょうか? 色々試してみましたが解決できないで い ます

3)メソッド内での GlutKeyboardFunc 呼び出し文

static void myInit(string progname)
{
GlutInitDisplayMode(GLUT_RGBA);
GlutInitWindowSize(500, 400);
GlutInitWindowPosition(0, 0);
GlutCreateWindow(progname);
}

static void myKeyboard(uint key, int x, int y)
{
if (key == 27) { return; }
}

static int Main(string[] args)
{
GlutInit(args.Length, args);
myInit(args[0]);
GlutKeyboardFunc(myKeyboard)

質問3:文法エラーになります。多分2項が解決すればと思いますが、関数名をそのまま記述して構わないのでしょうか
                
//以後省略

}

A 回答 (1件)

> 1)目的のglut.dll内のglutKeyboardFuncの仕様


>   glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))

これはC++ではなくCのやりかたですが、これは関数のポインタをあらわしています。

戻り値の型 (*関数名)(引数リスト)

とかいてやると、このような戻り値と引数リストを持つ関数へのポインタをあらわします

たとえば、

void aaaa(int i)
{
....
}
void (*func)(int i) = aaaa;
func(3);

これを実行すると、aaaa(3)と同じことをやったことになります。

glutKeyboardFuncはこの仕組みを使ってコールバック関数の指定を行います。


> 2)インポート文
> 3)メソッド内での GlutKeyboardFunc 呼び出し文

について、C#からdllを参照する場合、関数ポインタにはデリゲートを指定します。
デリゲートという言葉そのものを知らないのであれば、まずはインターネットで意味と使い方を
調べられたほうが良いと思います。

あまりC#を使わないので間違えているかもしれませんが、この例の場合

delegate void KeyboardCallback(unsigned char key, int x, int y);

[SuppressUnmanagedCodeSecurity()]
[DllImport("glut.dll", EntryPoint = "glutKeyboardFunc", ExactSpelling = true)]
internal extern static void GlutKeyboardFunc(KeyboardCallback f);

GlutKeyboardFunc(new KeyboardCallback(myKeyboard));

大体こんな感じになるかと思います。
    • good
    • 1
この回答へのお礼

早速のご回答ありがとうございました。
非常に分かりやすく説明して下さって、大変助かりました。
深く感謝申し上げます。

お礼日時:2015/02/27 10:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!