如何修复这个与 div 相关的运行时错误为零?

Posted

技术标签:

【中文标题】如何修复这个与 div 相关的运行时错误为零?【英文标题】:How do I fix this runtime error related to div by zero? 【发布时间】:2016-07-16 00:44:39 【问题描述】:

这是我从程序中提取的有问题的代码块:

#include <vector>

using namespace std; 

vector<double> permittingConstructionCosts(56);
static const int PERMITTING_PERIODS                 = 0;
static const int CONSTRUCTION_PERIODS               = 11;
static const double CONSTRUCTION_COSTS                  = 2169506;
static const double PERMITTING_COSTS                    = 142085;
static const int PERMITTING_CONSTRUCTION_PERIODS = PERMITTING_PERIODS + CONSTRUCTION_PERIODS;

void calcExpenses       // Calculates permitting and construction expenses
   (
    vector<double>&     expense,
    double              value1,
    double              value2
   )

int i;

for (i=0; i<=PERMITTING_PERIODS + 1; i++)

    expense[i] = value1;


for (i=PERMITTING_PERIODS + 2; i<expense.size(); i++)

    if (i < PERMITTING_CONSTRUCTION_PERIODS + 2)
    
        expense[i] = value2;
    



int main()
   
    if (PERMITTING_PERIODS != 0)
        
            calcExpenses(permittingConstructionCosts, -PERMITTING_COSTS/PERMITTING_PERIODS,     -CONSTRUCTION_COSTS/CONSTRUCTION_PERIODS);
        
        else
        
            calcExpenses(permittingConstructionCosts,       0,                  -CONSTRUCTION_COSTS/CONSTRUCTION_PERIODS);
        

    return 0;

根据 ideone (http://ideone.com/LpzUny) 的说法,代码存在运行时错误,返回“时间:0 内存:3456 信号:11”。

我试图在 SO 上寻找解决方案并找到以下链接:

How can I avoid a warning about division-by-zero in this template code?

How to eliminate "divide by 0" error in template code

但是,我不知道如何使用模板,因为我是 c++ 新手,我不确定在这种情况下是否需要使用它们,所以我不知道如何使这些解决方案适应我的特定问题甚至可能。

我很确定“-PERMITTING_COSTS/PERMITTING_PERIODS”会导致问题,但我认为只需检查除数就可以解决问题。此函数似乎适用于除 0 以外的所有其他值,但我需要考虑 PERMITTING_PERIODS = 0 的情况。

如果能得到任何帮助,我将不胜感激。提前致谢!

编辑:我实际上确实在我的程序中初始化了向量,但我忘了把它放进去,因为大小是在程序的其他地方决定的。一旦我通过输入一个数字来修复该部分,代码块就可以工作,但是当我将 PERMITTING_PERIODS 设置为 0 时,我的程序仍然存在运行时错误,所以我想我必须在其他地方寻找错误。感谢您的帮助!

【问题讨论】:

您正在尝试索引一个空向量。 顺便说一句,如果你用谷歌搜索signal 11,你会发现所有的结果都是关于访问不属于你的内存,而不是除以零。 当您单步执行该代码时,调试器会告诉您什么?当您遇到无法识别的错误时,您应该做的第一件事是 Google(或 Bing)确切的错误消息 Signal 11 是一个分段错误 - 即访问不应该的内存点。你在哪里初始化你的permittingConstructionCosts 向量?在calcExpenses 的第一个循环中,您正试图写入不存在的permittingConstructionCosts 向量中的位置。 【参考方案1】:

问题出在函数内部,被main函数中的else语句调用:

for (i=0; i<=PERMITTING_PERIODS + 1; i++)

    expense[i] = value1;

这里,PERMITTING_PERIODS 为 0,因此您从 0 循环到 2(包括)。

但是,expense.size() 为 0,因为 您的向量为空。结果,您试图访问一个空向量,这会导致 分段错误

话虽如此,在循环中打印i 的值,你应该看到你尝试访问expense[0],但是向量是空的,所以它没有第一个槽(基本上它没有任何)!!

所以替换为:

expense.push_back(value1);

这将为您的值分配足够的空间以将其推入向量中。

【讨论】:

【参考方案2】:

引用链接中给出的答案(即“如何消除模板代码中的“除以 0”错误”)在这里同样适用。其他答案是在模板的上下文中给出的,但这完全无关紧要。示例原则同样适用于非模板代码。关键原则是计算除法,但如果分母为零,则要计算零值而不是除法。

所以我们要计算-PERMITTING_COSTS/PERMITTING_PERIODS,但是当PERMITTING_PERIODS为0时,使用0的值而不是除法。很好:

int main()
   
      calcExpenses(permittingConstructionCosts, 
                   (PERMITTING_PERIODS == 0 ? 0: -PERMITTING_COSTS)/
                   (PERMITTING_PERIODS == 0 ? 1: PERMITTING_PERIODS),
                   -CONSTRUCTION_COSTS/CONSTRUCTION_PERIODS);
      return 0;

【讨论】:

以上是关于如何修复这个与 div 相关的运行时错误为零?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 google colab 上的 cuda 运行时错误?

当应用程序在本地运行时如何修复 PHP 上的重定向错误

如何使用错误消息修复网页中与脚本相关的 HTML 标签的不正确中和(基本 XSS)?

Ionic 构建/运行 ios 失败,错误代码为 65。如何修复?

如何修复“未处理的运行时错误类型错误:事件未定义”

运行第二个单元测试时核心数据实体名称为零