C++ 如何修复与div by zero相关的运行时错误?
下面是我从程序中提取的有问题的代码块:C++ 如何修复与div by zero相关的运行时错误?,c++,c++11,vector,segmentation-fault,runtime-error,C++,C++11,Vector,Segmentation Fault,Runtime Error,下面是我从程序中提取的有问题的代码块: #include <vector> using namespace std; vector<double> permittingConstructionCosts(56); static const int PERMITTING_PERIODS = 0; static const int CONSTRUCTION_PERIODS = 11; static const
#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;
}
#包括
使用名称空间std;
矢量电容施工成本(56);
静态常数int=0;
施工期间的静态常数=11;
静态常数双施工成本=2169506;
静态成本双倍成本=142085;
允许施工期的静态常数=允许施工期+施工期;
void CalceExpenses//计算许可和施工费用
(
矢量与费用,
双值1,
双值2
)
{
int i;
对于(i=0;i而言,问题在于函数内部,该函数由主函数中的else语句调用:
for (i=0; i<=PERMITTING_PERIODS + 1; i++)
{
expense[i] = value1;
}
这将为您的值分配足够的空间,以便推送到向量中。引用链接中给出的答案,(即“如何消除模板代码中的“除以0”错误”)在这里同样适用。其他答案是在模板的上下文中给出的,但这完全不相关。示例原则也同样适用于非模板代码。关键原则是计算除法,但如果分母为零,则需要计算零的值,而不是除法
因此,我们希望计算-允许成本/允许周期
,但当允许周期
为0时,使用0值代替除法。很好:
int main()
{
calcExpenses(permittingConstructionCosts,
(PERMITTING_PERIODS == 0 ? 0: -PERMITTING_COSTS)/
(PERMITTING_PERIODS == 0 ? 1: PERMITTING_PERIODS),
-CONSTRUCTION_COSTS/CONSTRUCTION_PERIODS);
return 0;
}
你正在尝试索引一个空向量。顺便说一句,如果你在谷歌上搜索,你会发现所有结果都是关于访问不是你的内存,而不是关于除以零。当你逐步处理代码时,调试器会告诉你什么?当你遇到一个无法识别的错误时,你应该做的第一件事就是谷歌(或必应)确切的错误消息。是分段错误-即访问不应该访问的内存点。您在哪里初始化PermitingConstructionCosts
向量?就在CalceExpenses
的第一个循环中,您正试图写入PermitingConstructionCosts
向量中不存在的位置。
int main()
{
calcExpenses(permittingConstructionCosts,
(PERMITTING_PERIODS == 0 ? 0: -PERMITTING_COSTS)/
(PERMITTING_PERIODS == 0 ? 1: PERMITTING_PERIODS),
-CONSTRUCTION_COSTS/CONSTRUCTION_PERIODS);
return 0;
}