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;
}