• ベストアンサー

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 } }; コマンド名とコマンド関数のテーブルですが、要は関数テーブルの 作り方を知りたいのです。 ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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");  } }

SafeGuard
質問者

お礼

まいど、ありがとうございます。 なるほど、1さんが述べられたことの意味がやっとわかりました。 私の知識が足りなかっただけですね…。 なかなか粋なコードなりました。ありがとうございました。

その他の回答 (2)

回答No.2

# ここで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);   }  } }

SafeGuard
質問者

お礼

まいど!お世話になってます。 なるほろ~。構造体でもコンストラクタ使えるんですね。 当方のコード、メモリ確保の観点からしても滅茶苦茶でしたね(^^; ありがとうございます。勉強になりました。 またお願いします。 ># ここでC#の質問をしてもいいものやら疑問に思いつつも… やっぱり、VBの方がいいですかね(笑

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.1

そもそもわざわざ構造体を自作しなくても、.NET Framework 組み込みのハッシュテーブルを使えばいいと思いますが。 組み込みのハッシュテーブルとは System.Collections.Hashtable クラスのことです。 (バージョン 2.0 なら新しく追加された System.Collections.Generic.Dictionary クラスの方をお奨めします)

SafeGuard
質問者

お礼

ありがとうございます。 私の知識が足りなかっただけでした。(;; 1さんの仰っていることは正しかったです。 今後もよろしくお願いします。

SafeGuard
質問者

補足

回答ありがとうございます。 ハッシュテーブルでキーの検索は高速になりますね。 "AAA"->0, "BBB"->1 とか…。 今回はインデックスの取得方法ではないので、意図が違います。 (その意図を書いていない私も私ですが…) もしかして、ハッシュのキーとバリューの関係上で キーにコマンド(文字列)バリューに関数アドレス入力してハッシュ関数 クリエイトしたあと、オペレートでキーを入力して、一致したら 勝手に実行みたいなのが使い方ができるのでしょうか?

関連するQ&A