質問事項
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項が解決すればと思いますが、関数名をそのまま記述して構わないのでしょうか
//以後省略
}
No.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));
大体こんな感じになるかと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
関数の実体定義にヘッダファイ...
-
long型の定数の末尾にLを付ける...
-
visualstudio C# テキストボッ...
-
typedef enumの使い方を教えて...
-
2重定義って??
-
C言語 宣言した変数になにも代...
-
intとINTの違いは?
-
構造体を引数とする、クラス間...
-
ハンドルされていない例外が発...
-
変数の型を定義しなかった場合...
-
Arduinoのプログラムについて
-
C++の(左辺値)参照を参照渡し
-
C++/CLIでネイティブの構造体を...
-
C言語での方向キー入力判定
-
警告 ”値が割り当てられていな...
-
main()とint main(void)の違い
-
gccのエラー "initialization d...
-
WinMainの第3引数のl...
-
エラー「invalid conversion fr...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
2重定義って??
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
typedef enumの使い方を教えて...
-
関数の実体定義にヘッダファイ...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
【#define】 defineで定義した...
-
void func( void )について
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
C++の(左辺値)参照を参照渡し
-
main()とint main(void)の違い
-
intとINTの違いは?
-
DLLでLIBファイルが作成されない
おすすめ情報