2012-03-14 61 views
1

我做了一個MegaInt類,它可以處理非常大的數字並且重載了幾個運算符。不幸的是,我被卡住了,我的代碼崩潰了。在C++中重載運算符 - 編譯但崩潰

每個MegaInt OJB具有矢量值和一個布爾標誌。一個數的每個位置被放置在載體(即4325是矢量值= {5,2,3,4}),以及是否其符號(+或 - )爲1或0。

這裏有點的代碼...

 #include <vector> 
     #include <string> 
     using namespace std; 

     class MegaInt{ 
      friend class main; 
      private: 
       vector<int> value; 
       bool sign; //true is pos, false is neg 

      public: 
       MegaInt(vector <int> x, bool y); 
       MegaInt(string s); 
       MegaInt(const MegaInt& m); 
       MegaInt & operator*=(const MegaInt &rhs); 

       #include <iostream> 
       using namespace std; 
       #include "MegaInt.h" 
       #include <math.h> 

       MegaInt::MegaInt(string s){ 
        int pos = s.length()-1; 

        while (pos >= 0){ 
         if(pos == 0 && s[pos] == '-'){ 
          sign = false; 
          break; 
         } 
         else if (pos == 0 && s[pos] == '+'){ 
          sign = true; 
          break; 
         } 
         else{ 
          sign = true; 
         } 
         if(s[pos] >= 48 && s[pos] <= 57) 
          value.push_back(s[pos]-48); 
         else{ 
          value.clear(); 
          break; 
         } 
         pos --; 
        } 
        chopoffleadingOs(); 
       } 
       MegaInt::MegaInt(const MegaInt& m){ 
        value = m.value; 
        sign = m.sign; 
       } 

       MegaInt operator*(const MegaInt& x, const MegaInt& y){ 
        int multi = 0; 
        int temp; 
        vector<int> total; 

        for(int i = x.value.size()-1; i>=0; --i){ 
         for(int j = y.value.size()-1, k = 0; j>=0; --j, ++k){ 
          temp = x.value[i] * y.value[j]; 
          if (total.size() <= (i + multi + 1)) 
                total.resize(i + multi + 1 + 1); 
               total[i + multi] += (temp % 10); 
               temp = (temp - total[i])/10; 
               total[i + multi + 1] += temp; 
                } 
                multi++; 
                } 

             reverse(total.begin(), total.end()); 

       return newTotal; 
       } 

我主要似乎被卡在重載乘法部分。其餘的我認爲我得到了。

感謝, 諾亞

回答

1

一個可能的問題是在這裏:

total[i+multi]+=(8%10); 

您使用total載體,但它尚未分配的內存。這可以通過resize函數來完成:

total.resize(MAX_SIZE); 

一個好辦法找到意想不到的崩潰是使用調試器。如果您在調試器中運行該程序,它會在發生問題時停止,以便檢查變量並查看崩潰的位置以及可能導致崩潰的位置。

編輯:

如果你不知道total向量的大小事先,你必須動態調整它:如果可能的話

if (total.size() <= (i + multi + 1)) 
    total.resize(i + multi + 1 + 1); // An extra +1 because vectors are zero-indexed 

total[i+multi]+=(8%10); 
// ... 
+0

我剛剛改變了總數[i + multi] + =(8%10);總計[i + multi] + =(temp%10); – 2012-03-14 06:51:34

+0

好吧生病嘗試 – 2012-03-14 06:52:00

+0

@ Noah_noobProgrammer99我在回答中使用了錯誤的函數,它應該是'resize'而不是'reserve'。我已經更新了我的答案。 – 2012-03-14 07:02:25

0

總是更好地提供完全編譯樣本;如果有時間,人們可以更容易地嘗試抽樣。不要發佈所有內容 - 只是展示問題所需的最低限度。

使用調試 - 跟蹤你的代碼通過嵌套的for循環,並檢查你得到什麼值指標爲載體。 (當您使用Eclipse時,雙擊左邊的空白邊以設置斷點,用於運行到斷點,突出顯示要觀察的變量或表達式,然後右鍵單擊該選擇,然後選擇'Watch'from menu to add it to the watch window。

如果你在學習C++,我會推薦一些更友好的東西 - 我個人建議Visual C++ Express(它是免費的)。)

+0

KK我豎起的休息碼。我運行調試器並陷入了嵌套循環中的模塊部分。我仍然很新的C + +,並無法找到爲什麼這不起作用 – 2012-03-14 07:05:39

+0

大聲笑哎呀我想我誤解了那部分..我試過了它,但我仍然不確定錯誤告訴我什麼。另外我將如何使用Watch窗口?對不起,我還是這個新手。我正在使用eclips。並感謝您的幫助! – 2012-03-14 07:48:00

+0

錯誤代碼: 沒有可用於「ntdll!LdrQueryProcessModuleInformation()at 0x772b15de」的源代碼「 – 2012-03-14 07:49:07