プロが教えるわが家の防犯対策術!

お世話様です。
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 }
};

コマンド名とコマンド関数のテーブルですが、要は関数テーブルの
作り方を知りたいのです。
ご教授よろしくお願いいたします。

A 回答 (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");

 }
}
    • good
    • 0
この回答へのお礼

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

なかなか粋なコードなりました。ありがとうございました。

お礼日時:2006/01/21 11:34

# ここで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);
  }
 }
}
    • good
    • 0
この回答へのお礼

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

># ここでC#の質問をしてもいいものやら疑問に思いつつも…
やっぱり、VBの方がいいですかね(笑

お礼日時:2006/01/21 02:14

そもそもわざわざ構造体を自作しなくても、.NET Framework 組み込みのハッシュテーブルを使えばいいと思いますが。



組み込みのハッシュテーブルとは System.Collections.Hashtable クラスのことです。
(バージョン 2.0 なら新しく追加された System.Collections.Generic.Dictionary クラスの方をお奨めします)

この回答への補足

回答ありがとうございます。
ハッシュテーブルでキーの検索は高速になりますね。
"AAA"->0, "BBB"->1 とか…。
今回はインデックスの取得方法ではないので、意図が違います。
(その意図を書いていない私も私ですが…)

もしかして、ハッシュのキーとバリューの関係上で
キーにコマンド(文字列)バリューに関数アドレス入力してハッシュ関数
クリエイトしたあと、オペレートでキーを入力して、一致したら
勝手に実行みたいなのが使い方ができるのでしょうか?

補足日時:2006/01/21 01:50
    • good
    • 0
この回答へのお礼

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

今後もよろしくお願いします。

お礼日時:2006/01/21 11:39

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