2016-07-16 49 views
-1

這裏是有問題的代碼,我已經從我的程序拉到塊:如何解決與div相關的運行時錯誤爲零?

#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時,我的程序仍然存在運行時錯誤,因此我想我必須在別處尋找錯誤。謝謝您的幫助!

+1

您正試圖爲空向量編制索引。 – user2357112

+2

順便說一句,如果您使用Google [[signal 11'](https://www.google.com/search?q=signal+11)),您會發現所有結果都是關於訪問不是你的,而不是零除。 – user2357112

+0

調試器在您逐步完成代碼時會告訴您什麼?當你遇到一個你不認識的錯誤時,你應該做的第一件事就是Google(或Bing)*確切的錯誤信息*。 –

回答

1

問題在於功能,它是由else語句在main函數調用內:

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

將分配爲你的價值觀被推到載體足夠的空間。

0

在引用的鏈接中給出的答案(即「如何消除」除以0模板代碼中的錯誤「)在這裏同樣適用。其他答案是在模板的背景下給出的,但這完全不相關。樣本原則也適用於非模板代碼。關鍵原則是計算除法,但如果分母爲零,則需要計算零值而不是除法。

所以我們要計算-PERMITTING_COSTS/PERMITTING_PERIODS,但PERMITTING_PERIODS爲0時,使用值0代替除法。Fine:

int main() 
{ 
     calcExpenses(permittingConstructionCosts, 
        (PERMITTING_PERIODS == 0 ? 0: -PERMITTING_COSTS)/ 
        (PERMITTING_PERIODS == 0 ? 1: PERMITTING_PERIODS), 
        -CONSTRUCTION_COSTS/CONSTRUCTION_PERIODS); 
     return 0; 
} 
相關問題