- ベストアンサー
関数の番号付け
久しぶりにまた質問をさせていただきます。 Visual Basic Express Edition で、ユーザー定義関数としてf1,f2,…f100などの関数を定義して、 この関数を順番に呼び出したいのですが、出来ますでしょうか? ちなみに、この関数は、引数がいらない関数を作っています。 もし、このようなことが出来たとして、もう1つ同時に行いたいことがあるのですが、 複数値を返す関数は定義できますでしょうか? 引数を使わずに乱数を関数内で発生させ、それにあった計3つの数値や文字列を3つのcomboboxに対応させながら追加させたいのです。 C言語(今学校で習っている最中ですが)のポインタのようなことが出来れば、 メモリ内のデータを直接書き換えることで複数値を返しそれぞれcomboboxの項目に追加ができる、そんなことがしたいのです。 何かアイディアがあればご指導いただきたいと思います。 不可解なところがあれば是非レスを下さい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ANo.2の回答者です。 > もしわからないことがあっても、極力自分で調べることはがんばりますので。 と言うことですので、 > callbyname関数の使い方をいろいろインターネット等で調べては見ましたが、いまいちよくわかりませんでした。 どう理解して、どこがわからないのかを明記してください。 ちなみに、ヘルプ(MSDNライブラリ)は調べましたか? #たまに、ネットの検索で調べるだけで、ヘルプを調べない人がいるようですけど・・・ 「Visual Basic 言語リファレンス CallByName 関数 」 (http://msdn2.microsoft.com/ja-jp/library/chsc1tx6(VS.80).aspx) 「Visual Basic 言語の概念 文字列名によるプロパティまたはメソッドの呼び出し」 (http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/vbcn7/html/vbconCallingPropertyOrMethodUsingStringName.asp) > 現在自分がしたいことが最初の投稿ではうまく表現できていなかったようです >もし、今回の補足で、なんとなく私の実行したいことがつたわりましたら ほぼ伝わっていると思いますが・・・ #少なくとも、今回の投稿を読んでも、 #「私が想定していた、貴方のやりたいこと」に対する認識はほとんど変わりませんでした。 私の認識では、 (1)他クラス、又は自クラス内に「f1」~「f100」の様に関数を定義する。 (2)何らかのアクションで、その関数達を順番に実行していく。 です(でした)。 間違ってませんよね? その前提で解説。 > 内部クラスの関数で、「f1」から「f100」まであるのが分かっているなら、 > 素直に、100個並べるとか・・・ 内部クラスの場合、「自分で関数を書く」はずなので、「関数が何番まであるか」は、 「自分で認識できる(手間を惜しまず調べれば分かる)」はずです。 で、余計な作りこみなんかしないで、素直に、 f1() f2() ・・・・ f100() と書けば済むのではないですか? と言うことです。 > 関数定義が、外部のクラスライブラリ等で行われていて、実行時にレイトバインディングするとかで、 は、その関数を定義する部分が別になっていて、状況によって変わる場合です。 #あるときは、「f1~f100」が定義されたクラスを使用し、別の時には「f1~f2」が定義されたクラスに入れ替える。とかのケースです。 呼び出し側のプログラムを書く時点では、いくつまであるかを「数えることができない」ので、 「CallByName」で「関数名を『文字列』で指定して実行」する方法を使えば、何とかなるのでは? と言うことです。 #多分これが、貴方のやりたいことずばりだと思いますけど・・・ だとすると、 外部クラス(関数が定義されているクラス)をClassFunctionとして、 ------------------------------------------------------ Public Class ClassFunction Public Function f1() As Long Return 1 End Function Public Function f2() As Long Return 20 End Function Public Function f3() As Long Return 300 End Function End Class ------------------------------------------------------ で、呼び出すときは、 ------------------------------------------------------ Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim c As New ClassFunction Dim ret As Long Dim i As Long For i = 1 To 100 Try ret = CallByName(c, "f" & i.ToString, CallType.Method) MsgBox(ret) Catch ex As Exception Exit For End Try Next End Sub ------------------------------------------------------ こんな感じだと思いますけど。 #ちなみに、CallByNameは、引数も指定できますよ。
その他の回答 (2)
- dsuekichi
- ベストアンサー率64% (171/265)
> ユーザー定義関数としてf1,f2,…f100などの関数を定義して、 内部クラスの関数で、「f1」から「f100」まであるのが分かっているなら、 素直に、100個並べるとか・・・ 関数定義が、外部のクラスライブラリ等で行われていて、実行時にレイトバインディングするとかで、 コンパイル時に個数が不明だとかなら、 「CallByName 関数」を使うとか・・・ #前述の内部クラスの場合でも、Public関数なら、「CallByName 関数」が使えます。 #但し、レイトバインディングになってしまうので、実行速度が落ちますけど・・・ > 複数値を返す関数は定義できますでしょうか? 関数の戻り値ではなく、ByRef指定した参照型引数で値を戻すとか・・・ #C言語の「ポインタ型引数」のイメージ。
補足
返信が遅くなってすみませんでした。 現在自分がしたいことが最初の投稿ではうまく表現できていなかったようです。(反省しています。) 順番にボタンを押す方法をここで以前質問させていただいたのですが、 今回は順番に関数を実行する方法が知りたいのです。 さすがに関数をすべてというのは無理なはずですので、ルールをつけ、 「関数として、f##(##の部分には数字)という関数で、その数字は欠番がない、どの関数も引数も必要としない」 という関数を以後定義していくという条件の下でエラーが出る(関数が見つからなくなる)まで順番に関数を実行したいのです。 つまり文字列自身を関数名にもつとき、その関数を実行しなさい (実際には、aという整数を動かし、文字列"f" & aという関数を実行しなさいという命令) が作りたいのです。(正しくはそれで十分なのです。) callbyname関数の使い方をいろいろインターネット等で調べては見ましたが、いまいちよくわかりませんでした。 実際にネット上のサンプルもいろいろ実行もして見ましたが、callbyname関数の仕組みもよくわかりませんでした。ごめんなさい。 もし、今回の補足で、なんとなく私の実行したいことがつたわりましたら、ご教授いただけないでしょうか? ちなみに、私のレベルは、代入・算術演算・繰り返し文・条件分岐とこれらを使った関数定義くらいしか出来ないと思ってください。 (基本的には、中学生の授業と、高校数学でのBASIC(独学)でしか扱ったことはないので) 出来るだけわかりやすくご指導願います。もしわからないことがあっても、極力自分で調べることはがんばりますので。 よろしくお願いします。
>複数値を返す関数は定義できますでしょうか? ユーザー定義型(C言語の構造体に相当)を使えば よいのではないでしょうか。
お礼
返信が遅くなってすみませんでした。 構造体を使う方法は、今日のCの授業で何とか理解できました。 ありがとうございました。
お礼
ありがとうございました。 自分でcallbyname関数を調べたときは、callbynameの第3引数の意味(違い)がわからなかったり、(実際にいろいろ動かしてみてもエラーしか出なくて、エラーヘルプの意味もわからず、・・・。) 実際、(第一引数).(第二引数)の形になっているかとも思いまして、(Microsoftのサンプルで(Textbox1,"TEXT",…)だったので・・・) もう少し関数自身を調べるのではなく、ヘルプで出てきた分からない用語を調べるようにしていかなければいけない気がしました。 今回は大変勉強になりました。ありがとうございました。