みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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 }
};

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

投稿日時 - 2006-01-20 19:12:07

QNo.1909497

困ってます

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

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

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");

 }
}

投稿日時 - 2006-01-21 03:10:23

お礼

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

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

投稿日時 - 2006-01-21 11:34:15

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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);
  }
 }
}

投稿日時 - 2006-01-20 21:04:21

お礼

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

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

投稿日時 - 2006-01-21 02:14:40

ANo.1

UKY

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

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

投稿日時 - 2006-01-20 20:07:14

補足

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

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

投稿日時 - 2006-01-21 01:50:23

お礼

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

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

投稿日時 - 2006-01-21 11:39:39

あなたにオススメの質問