平成もあと僅かとなったが、未だにVB6.0で開発・運用されているシステムがそこら中で稼働しており、しばしば苦しめられることがある。
つい先日も、十数年前にVB6.0で構築されたシステムでバグが見つかって呼び出された。
工場の棚卸しの在庫量が合わないとの連絡があり、駆けつけて行って現地でドハマりしたのでここにメモしておく。
だれが作成したのかもわからないシステムで、当然のように仕様書は残ってない。ソースは履歴コメントだらけ。
地道にデバッグ実行で隅から隅まで追いかけて、やっと原因を特定できた。
Int関数の使い方によって、実行結果に差が出ていた。
【例】
Sub Main() ''Int関数の引数内で乗算する Dim i1 As Integer i1 = Int(27.7 * 100) ''乗算してDouble型にキャスト Dim i2 As Integer i2 = Int(CDbl(27.7 * 100)) ''Double型の変数に一旦計算結果を代入してからInt関数実行 Dim i3 As Integer Dim d3 As Double d3 = 27.7 * 100 i3 = Int(d3) Debug.Print "i1 = " & i1 Debug.Print "i2 = " & i2 Debug.Print "i3 = " & i3 End Sub
【実行結果】
i1 = 2769 i2 = 2770 i3 = 2770Fix関数でも同じ事が起こる。
ちなみにVB.NETでも同じコードを実行して試してみたが、このような現象は発生しなかった。
0 件のコメント :
コメントを投稿