プロが教える店舗&オフィスのセキュリティ対策術

VB6 SP5
フォームのロードで構造体変数に
値を入れ、ボタンを押したときに
IF文の処理を通したのですが
aaaに20以上の数値を入れると
該当の処理を通らず全てELSEを
通ってしまいます

以下コード

////// 標準モジュール //////
Type Strct_Dat
□□start_no(5) As Integer
□□end_no(5) As Integer
End Type

Global StrctDat As Strct_Dat

////// フォーム //////
Private Sub Form_Load()
□□With StrctDat
□□□□.start_no(0) = 1
□□□□.start_no(1) = 10
□□□□.start_no(2) = 20
□□□□.start_no(3) = 30
□□□□.start_no(4) = 40
□□□□.end_no(0) = 9
□□□□.end_no(1) = 19
□□□□.end_no(2) = 29
□□□□.end_no(3) = 39
□□□□.end_no(4) = 49
□□End With
End Sub

Private Sub Command3_Click()
□□Dim aaa As Integer

□□aaa = 20

□□With StrctDat
□□□□If .start_no(0) <= aaa And aaa <= .end_no(0) Then
□□□□□□MsgBox ("0")
□□□□ElseIf .start_no(1) <= aaa And aaa <= .end_no(1) Then
□□□□□□MsgBox ("1")
□□□□ElseIf .start_no(2) <= aaa And aaa <= .end_no(2) Then
□□□□□□MsgBox ("2")
□□□□ElseIf .start_no(3) <= aaa And aaa <= .end_no(3) Then
□□□□□□MsgBox ("3")
□□□□ElseIf .start_no(4) <= aaa And aaa <= .end_no(4) Then
□□□□□□MsgBox ("4")
□□□□Else
□□□□□□MsgBox ("ELSE")
□□□□End If
□□End With
End Sub

構造体の型をLONGにすると
ちゃんと該当処理をとおります
また、デバッグ時は正常で
EXE化したときのみ該当処理を
通らなくなります

回避方法はあるのですが
何かご存知の方いらっしゃいましたら
教えて下さい

よろしくお願い致します

A 回答 (5件)

何とも妙な現象ですね。

条件式を変えるとうまく動く場合もあることから、コンパイラの最適化ルーチンのバグのようです。

VB6にはSP6が出ていますが、SP6でも修正されていません。MSKBにもこれに関する情報はないようです。

応急策としては、プロジェクト(P)→プロジェクトのプロパティ(E)...→「コンパイル」タブで「P-Codeコンパイル(P)」を選択するか、「ネイティブコードコンパイル(N)」を選択する場合は最適化オプションで「最適化なし(O)」を選択すると正常に動作するようです。
    • good
    • 0

先ほどは失礼しました。



解決策になるか分かりませんが
ローカルで宣言すればOKのようです


////// フォーム //////
Private StrctDat As Strct_Dat <--- ここ

Private Sub Form_Load()
With StrctDat
.start_no(0) = 1
.start_no(1) = 10
.start_no(2) = 20
.start_no(3) = 30
.start_no(4) = 40
.end_no(0) = 9
.end_no(1) = 19
.end_no(2) = 29
.end_no(3) = 39
.end_no(4) = 49
End With
Command3_Click
End Sub
    • good
    • 0

be-beさん



失礼しました。
再現できました。

コンパイルした時のみのエラーですから
ステップインは出来ませんでした。
    • good
    • 0

質問者さんではありませんが、#2の方に補足を。



インタプリタ実行では現象は発生しません。ですので、ステップインで現象を確認することはできません。

現象が発生するのは、質問の中にあるように「EXE化したときのみ」です。
    • good
    • 0

私の環境では再現できませんが



MsgBoxは2になります。


ステップインで1行づつ追ってみたらどうでしょう
    • good
    • 0

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