dポイントプレゼントキャンペーン実施中!

Dim i As Integer:Dim i2 As Integer:Dim card(5) As Integer:Dim expectPoint0card(1) As Integer '0枚のカードを交換する場合のすべての選択肢の期待値
Dim expectPoint1card(5) As Integer
Sub porkerGame()
card(1) = 1: card(2) = 2: card(3) = 3: card(4) = 4: card(5) = 5
getExpectPoint1card expectPoint1card
End Sub

Sub getExpectPoint1card(expectPoint1card() As Integer)
Dim tesu1 As Integer:Dim sum1 As Integer
For i = 1 To 5
getTesuSum1 i, tesu1, sum1
expectPoint1card(i) = sum1 / tesu1
Next i
End Sub

Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer)
Dim card2(5) As Integer:tesu1 = 0:sum1 = 0
MsgBox rowNumber
copy card, card2, 5
MsgBox rowNumber
For i = 4 To 55
MsgBox rowNumber
card2(rowNumber) = i
addTesuSum card2, tesu1, sum1
Next i
End Sub

Sub copy(row() As Integer, row2() As Integer, i2 As Integer)
For i = 1 To i2
row2(i) = row(i)
Next i
End Sub
上記のプログラムで、ウィンドウに1,6,4,5,6と表示され、その次には、エラーが表示します。僕は、ウィンドウに表示される変数RowNumberの値がしばらくの間は1のままであるようにプログラムを書いたつもりなのですが、変数rowNumberの値が変わるのは、どうしてでしょうか?教えてください。お願いします。

A 回答 (3件)

補足しますと、rowNumber は 元々 i を「参照渡し」してますので、i の変化に合わせて変化してます。



i = 1 で getTesuSum1 に渡され、MsgBox 1
更に copy に渡され i = 5 まで実行され、i = 6 で For を抜けて copy から戻った時に MsgBox 6
更に 次の For で i = 4 になり、MsgBox 4
次に For 内でインクリメントされて MsgBox 5
次に For 内でインクリメントされて MsgBox 6
そして card2(5) に 6 は入らずオーバーフロー

引数の規定は参照渡し(ByRef)なので 値渡し(ByVal) にするのも手です。

Sub getTesuSum1(ByVal rowNumber As Integer, tesu1 As Integer, sum1 As Integer)

いずれにしても、同じ変数を ローカル以外で宣言して使うのは必要範囲に留めましょう。
    • good
    • 0
この回答へのお礼

なるほど。rowNumberの値がiと等しいようになっているから、このようなことがおこるのですね。これで、わかりました。どうもありがとうございました。

お礼日時:2005/04/17 17:36

Sub addTesuSum


は、どのようなコードなのでしょうか?

>MsgBox rowNumber
は、Debug.Print か、ウォッチ式の変わりですか?
それ自体に、意味があるとは思えませんが。

この回答への補足

このプログラムはポーカーゲームのプログラムを作っていて、うまくいかないところがあったので、そのままそのプログラムを書き込もうとすると800字以上で書き込めなかったために、質問に必要なところ以外を削除したものですが、いらないところが残っていたようです。

補足日時:2005/04/17 17:37
    • good
    • 0

VBは解りませんが、、、


Dim i As Integer を

Sub getExpectPoint1card(expectPoint1card() As Integer)
Sub getTesuSum1(rowNumber As Integer, tesu1 As Integer, sum1 As Integer)
Sub copy(row() As Integer, row2() As Integer, i2 As Integer)

などでバラバラに使うなら、Sub 内で宣言しないとダメなのでは?
    • good
    • 0

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