如何修复与div相关的运行时错误?

时间:2016-07-16 00:44:40

标签: 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 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),代码有一个运行时错误,返回&#34; time:0 memory:3456 signal:11&#34;。

我试图在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 ++的新手,我不确定在这种情况下是否需要使用它们所以我不知道如何使这些解决方案适应我的特别的问题,如果它甚至可能。

我非常确定&#34; -PERMITTING_COSTS / PERMITTING_PERIODS&#34;导致问题,但我认为只是检查除数将解决问题。这个函数似乎适用于0以外的其他每个值,但我需要考虑PERMITTING_PERIODS = 0的情况。

我非常感谢能得到的任何帮助。提前谢谢!

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

2 个答案:

答案 0 :(得分: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);

将为您的值分配足够的空间以便将其推送到向量中。

答案 1 :(得分:0)

在引用的链接中给出的答案(即“如何消除”除以模板代码中的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;
}