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

Functionで戻り値を複数取得したいのですが
うまくいきません。(NULLの使い方が不正ですとエラー)

戻り値に配列を使う場合
呼び出し側はどのように記述すればいいでしょうか?

<呼び出し側>

Private Sub a()
wkkekka1 = 処理結果(Kensu, Houhou)(0) ⇒ ここでエラー
wkkekka2 = 処理結果(Kensu, Houhou)(1)
wkkekka3 = 処理結果(Kensu, Houhou)(2)

End Sub


<関数>
Public Function 処理結果(ByRef lngKensu As Long, ByRef strHouhou As String)

Dim kekka(3) As Double

If lngKensu = 1000 and strHouhou = aaaaaa then
kekka(0) =  0.1
kekka(1) =  2
  kekka(2) =  300
Else
↓ (省略)
    ↓
End If

処理結果 = kekka

End Function

A 回答 (4件)

関数 処理結果の戻り型を As Double() と定義します


呼び出し元で
Dim arKekka as double()
arKekka = 処理結果(Kensu, Houhou)
で受け取り
wkekka1 = arKekka(0)
wkekka2 = arKekka(1)
wkekka3 = arKekka(2)
といった具合にして見ましょう

3個の結果を返すなら変数kekkaの宣言は
dim kekka(2) as Double
としましょう
    • good
    • 1
この回答へのお礼

初心者にもとてもわかりやすいアドバイス
ありがとうございます。
しっかり理解できました★

お礼日時:2008/08/18 21:28

この関数の呼び出しが多用されるのであれば、その処理用の構造体なりクラスなりを用意して、関数の戻りはその型で返すようにするというのが


一番エレガントな答えじゃないかと思います。(手間との兼ね合いがありますが)

ちなみに上のような呼び出しが可能であっても(VB.netで関数の戻りの型を明示すれば可能のはず)上の使い方だと、関数が3回呼び出されることになります。
関数の呼び出しは最小限にして、戻りを変数に格納して使う習慣はつけといていいかと思います。

No1の返信について
>呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?
何もセットしないというよりは、初期化した変数をセットするというのが無難かと思います。

# FunctionならOutput引数は使わないというのは当然として、個人的には「答えを返す」のであれば極力関数の戻りとしてとるべきだと思っています。(そのほうがよんでいてわかりやすいし)
    • good
    • 1
この回答へのお礼

関数が3回呼び出されることになるんですね
NO1の返信についてのコメントも
ありがとうございます。
よくわかりました。

お礼日時:2008/08/18 21:35

 関数というのは元来アウトプットされるデータが一つのものを指します。

コール・バイ・ネームで引き数を定義すればデータを持ち出すことができますが、これは飽くまで非常手段であり、複数のアウトプットデータがある場合は Procedure として定義するべきです。そしてインプットデータはコール・バイ・バリュー、アウトプットデータはコール・バイ・ネームで宣言すると後のデバッグで紛れがなくなります。自分でコーディングするからいいじゃないか、それは勝手だというのは全く違います。自分で組んだルーチンは殆ど頭に残っておらず、それぞれがどういう計算をしているのかが分からなくなってしまい勝ちなのでできるだけ紛れのない構造にしておくことが大切なのです。
引数は何を意味するのかを、註釈で説明しておくことも大切ですよ。
 これは大きなシステムを大人数で共同開発するときには必要不可欠なことなのですが、一人で組むプログラムも全く同じですよ。
    • good
    • 0
この回答へのお礼

初心者かつ独学ではじめている為
まだまだ勉強不足です。
一字一句の理解から時間がかかってしまうので
Willytにアドバイスしていただいた語句は
ひとつづつ調べてみて理解していこうと思います。
取り急ぎお礼させていただきます。
ありがとうございました。

お礼日時:2008/08/18 21:25

同じような質問がありました。


http://oshiete1.goo.ne.jp/qa3511531.html
No.3及びNo.4の回答がそのままではないかと思います。
#個人的には参照型引数使いたいケースですが
    • good
    • 0
この回答へのお礼

早速試したらできました。
とても助かりました!
ありがとうございました。

ちなみに参照型引数について、調べてみました。
引数にも値をセットできるという事でしょうか?
今回の場合でいうと、
もともと必要な2つの引数+値を戻したい3つの引数=5つの引数を指定しておいて
呼び出し側では戻り値に使用する3つの引数には何もセットしない・・ということになるのでしょうか?

お礼日時:2008/08/14 17:47

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A