3

有谁知道 vb6 中随机溢出错误的原因?

我必须自定义一个用 VB6 编写的遗留应用程序,并且最近溢出错误已经开始到处发生。有时在多年未触及的功能中!

尝试将某些内容分配给 Double 类型的变量时,总是会发生错误。

这些错误的原因可能不是引发错误的代码,而是其他原因。但我不知道要寻找什么。函数因溢出错误而失败的最令人困惑的示例是以下代码:

Dim test As Double
test = 0#

那怎么可能引发溢出错误?

我尝试启用一些编译器优化,比如不检查浮点计算错误等等。这已经“解决”了一些问题,但其他问题仍然存在。

4

2 回答 2

4

VB6 将以这样一种方式运行,如果外部信号发出浮点错误标志,则在您自己的代码中执行下一个浮点操作之前不会报告它。

在大多数情况下,这可能是由某些执行浮点运算的 DLL 引起的。如果您对这些外部 DLL 有任何控制权,那么我的建议是将此行放在应用程序调用的函数的末尾:

_clearfp();

此功能记录在这里:http: //msdn.microsoft.com/en-us/library/49bs2z07.aspx

如果您没有太多控制权,您可以通过从调用该函数的 DLL 调用您自己的函数来解决此问题。或者仅使用 VB6 的简单 hack 是:

Public Sub ClearFP()
    On Error Resume Next
    Dim d as Double
    d = 0#
End Sub

您可以在您认为是罪魁祸首的任何 DLL 调用之后调用它。

隔离最初是哪个函数执行的一个技巧就是在错误出现之前查看调用。或者,一个更复杂的解决方案是编译您的应用程序并通过可以中断浮点异常的调试器运行它。

于 2013-09-23T17:12:08.610 回答
-1

在 VB6 中,井号 (#) 符号可以表示多种含义:

用于与日期一起使用的文件名,通常应用于 DB 将数字视为双精度 如果条件为真,则编译常量或代码段

我敢肯定还有更多。

它可能取决于编译器。

我的建议是尝试:

Dim test As Double
test = CDbl(0)

看看是否能解决问题。

于 2013-09-23T17:32:53.643 回答