如何修复这个与 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 运行时错误?
如何使用错误消息修复网页中与脚本相关的 HTML 标签的不正确中和(基本 XSS)?