【问题标题】:VB6 random double overflow errorsVB6 随机双溢出错误
【发布时间】:2013-09-23 15:30:18
【问题描述】:

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

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

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

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

Dim test As Double
test = 0#

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

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

【问题讨论】:

    标签: vb6


    【解决方案1】:

    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 调用之后调用它。

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

    【讨论】:

    • 这听起来像是我的问题的解决方案,我在软件中唯一更改的是用更新的版本替换第三方组件。
    • 是的。那很可能是问题所在:)。如果最终成功,请接受我的回答!
    • 再问一个问题。您发布的 VB hack 不起作用,下一个浮点运算仍然会引发错误,您还有其他想法可以从此类外部错误中恢复吗?
    • 我的建议是制作一个可以从 VB6 调用的 C++ DLL,它执行 _clearfp();可能会比我未经测试的 hack 更好。
    • @DaveInCaz 我想出的解决方案允许我调用一个导致产生浮点错误的数学库(无论浮点精度 MSVC 项目设置如何)。不幸的是,没有内置的 Win32 API 方法可以执行此操作,因此您必须创建自己的 DLL 来调用此 C++ 函数。本教程很好地涵盖了它:codeproject.com/Articles/6243/…(本质上,创建一个 C++ 项目,其中包含您想要公开的 .def 文件命名函数 - 并确保使用 __stdcall 定义这些函数)。
    【解决方案2】:

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

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

    我相信还有更多。

    这可能取决于编译器。

    我的建议是尝试:

    Dim test As Double
    test = CDbl(0)
    

    看看是否能解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2021-10-08
      • 1970-01-01
      • 2021-06-11
      • 2011-11-18
      相关资源
      最近更新 更多