- ベストアンサー
C#での関数テーブルの作り方
お世話様です。 C++で関数ポインタを使用していたのですが、C#にそのまま持ってくると エラーが発生します。 C++でのコードをどのように変更したら良いでしょうか。 [C++] typedef struct { char *cmd; BOOL (*exe)(char* oprand); }FTBL; FTBL tbl[] = { { "AAA", aaa }, { "BBB", bbb }, { "CCC", ccc } }; [C#](当方のコードでエラーがでます。) delegate bool Execute( string oprand ); struct FTBL{ string cmd; Execute exe; }; FTBL[] tbl = { { "AAA", aaa }, { "BBB", bbb }, { "CCC", ccc } }; コマンド名とコマンド関数のテーブルですが、要は関数テーブルの 作り方を知りたいのです。 ご教授よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> キーにコマンド(文字列)バリューに関数アドレス入力してハッシュ関数 > クリエイトしたあと、オペレートでキーを入力して、一致したら > 勝手に実行みたいなのが使い方ができるのでしょうか? delegate bool Execute( string oprand ); class Entry { static bool aaa(string op) { System.Console.WriteLine("aaa "+op); return true; } static bool bbb(string op) { System.Console.WriteLine("bbb "+op); return true; } static bool ccc(string op) { System.Console.WriteLine("ccc "+op); return true; } static public void Main() { System.Collections.Generic.Dictionary<string,Execute> map = new System.Collections.Generic.Dictionary<string,Execute>(); map["AAA"] = aaa; map["BBB"] = bbb; map["CCC"] = ccc; map["BBB"]("argument"); } }
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
# ここでC#の質問をしてもいいものやら疑問に思いつつも… delegate bool Execute( string oprand ); struct FTBL { public string cmd; public Execute exe; public FTBL(string c, Execute e) { cmd = c; exe = e; } }; class Entry { static bool aaa(string op) { System.Console.WriteLine("aaa "+op); return true; } static bool bbb(string op) { System.Console.WriteLine("bbb "+op); return true; } static bool ccc(string op) { System.Console.WriteLine("ccc "+op); return true; } static public void Main() { FTBL[] tbl = new FTBL[] { new FTBL("AAA", aaa), new FTBL("BBB", bbb), new FTBL("CCC", ccc) }; foreach ( FTBL item in tbl ) { item.exe(item.cmd); } } }
お礼
まいど!お世話になってます。 なるほろ~。構造体でもコンストラクタ使えるんですね。 当方のコード、メモリ確保の観点からしても滅茶苦茶でしたね(^^; ありがとうございます。勉強になりました。 またお願いします。 ># ここでC#の質問をしてもいいものやら疑問に思いつつも… やっぱり、VBの方がいいですかね(笑
- UKY
- ベストアンサー率50% (604/1207)
そもそもわざわざ構造体を自作しなくても、.NET Framework 組み込みのハッシュテーブルを使えばいいと思いますが。 組み込みのハッシュテーブルとは System.Collections.Hashtable クラスのことです。 (バージョン 2.0 なら新しく追加された System.Collections.Generic.Dictionary クラスの方をお奨めします)
お礼
ありがとうございます。 私の知識が足りなかっただけでした。(;; 1さんの仰っていることは正しかったです。 今後もよろしくお願いします。
補足
回答ありがとうございます。 ハッシュテーブルでキーの検索は高速になりますね。 "AAA"->0, "BBB"->1 とか…。 今回はインデックスの取得方法ではないので、意図が違います。 (その意図を書いていない私も私ですが…) もしかして、ハッシュのキーとバリューの関係上で キーにコマンド(文字列)バリューに関数アドレス入力してハッシュ関数 クリエイトしたあと、オペレートでキーを入力して、一致したら 勝手に実行みたいなのが使い方ができるのでしょうか?
お礼
まいど、ありがとうございます。 なるほど、1さんが述べられたことの意味がやっとわかりました。 私の知識が足りなかっただけですね…。 なかなか粋なコードなりました。ありがとうございました。