[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2005/07/22(Fri) 19:47
投稿者名:shige
URL :
タイトル:
関数をテーブル化し呼出し
関数のアドレスをテーブル化しておいて、配列位置の指定に応じた各関数を呼び出したい。
addressofを用いれば良いかな? とは思いますがその先がイメージ出来ません。
よろしくご教授願います。

//参考としてCでの等価プログラムは以下のとおり
static char  (*matrix[5][8])(void) =
{
    proc00, proc01 ・・・ proc07,
    proc10,

main()
{
// matrix[2][3]を指定
    bRow = 2;
    bCOL = 3;
//proc23()に遷移
    bResult = (* matrix[bRow][bCOL])();

投稿時間:2005/07/23(Sat) 01:49
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 関数をテーブル化し呼出し
> 関数のアドレスをテーブル化しておいて、配列位置の指定に応じた各関数を呼び出したい。

メソッド名をCollectionとして保持しておき、CallByNameで呼び出す事で代用するとか。

投稿時間:2005/07/23(Sat) 09:30
投稿者名:shige
URL :
タイトル:
ありがとうございます
なるほど、CollectionにCallByNameですね。
光明が差し込んできた想いです。
トライしてみます。
魔界の仮面弁士様、有難うございました。

投稿時間:2005/07/23(Sat) 11:11
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: 関数をテーブル化し呼出し
まず、現在のVBには、アドレスで指定された関数を呼び出す機能が
ありませんので、それをそのまま移植するのは無理があります。
関数テーブルを用意しなければならない、もしくはそうしないと
面倒な処理であるのかどうかを考えて、
A,その部分だけCなどでDLLとして作る。
B,アルゴリズムそのものを見直し、VBで実現可能なものにする。
のどちらかにするのが無難かと思われます。

で、まぁそれだけでは何なので、CallByNameだとIDispatchベースなの
で、それではなくより近いと思われる方法を提示してみます。

アドレスで指定された関数そのものは呼び出せませんが、関数テーブル
を持つInstancedなオブジェクトのメソッドならば、呼び出すことが
できます。それを利用して、
1,最初に呼び出しの基本の型となるメソッド(MethodA)を持つ
  クラス(ClassA)を作る。
2,次に上記のClassAをImplementsしたClassB,C...を作る。
  そのMethodAの実装は、それぞれ独自の処理にする。
3,ClassAの2次元配列を作り、そこにClassAではなく、Setステートメント
  でNewしたClassB,C...を代入していく。
4,関数を呼び出すときは、全てClassA.MethodAとして呼び出す。
というような手順で近い形での実装が可能にはなります。