2013-04-26 63 views
3

我在課堂上遇到了一個程序問題,甚至老師也無法找到問題。我們正在做一個程序,要求用戶在停止時輸入兩倍,它掃描陣列並分開正面和負面,將它們放入不同的陣列。C++:當試圖用雙重填充動態向量時出現問題

我們注意到,當我們使用float的時候,程序會爲更多的數字工作,但是如果我們輸入的太多,並且如果我們在只有幾個數字後使用double的話,它仍然會出錯。我的意思是,程序做得很好,但是當它顯示結果時,數組中有一些奇怪的數字。這裏是使用雙精度的代碼:

#include <iostream> 
using namespace std; 

void filling(double *, int &); 
void sortPositiveNegative(double *, double *, double *, int, int &, int &); 
void display(const double *, int); 

int main() { 
    double * vecteur = new double; 
    double * positive = new double; 
    double * negative = new double; 
    int counter = 0, counterPos = 0, counterNeg = 0; 

    cout << "Filling of the real number vector " << endl; 
    filling(vecteur, counter); 

    cout << endl << "Display of the real number vector " << endl; 
    display(vecteur, counter); 

    cout << endl << "Sort of the positive and negative in the real number vector: " << endl; 
    sortPositiveNegative(vecteur, positive, negative, counter, counterPos, counterNeg); 

    cout << endl << "Display of the positive real number : " << endl; 
    display(positive, counterPos); 

    cout << endl << "Display of the negative real number : " << endl; 
    display(negative, counterNeg); 

    system("PAUSE"); 
    return 0; 
} 

void filling (double *vecteur, int &counter) 
{ 
    bool validation; 
    char choice = 'Y'; 
    do 
    { 
     do 
     { 
      validation = true; 
      cout << "Please enter the value of case " << counter+1 << ": "; 
      cin >> vecteur[counter]; 
      if(cin.fail()) 
      { 
       cerr << "The number entered is not valid." << endl; 
       cin.clear(); 
       validation = false; 
      } 
      while(cin.get() != '\n'){} 
     }while(!validation); 
     counter++; 
     do 
     { 
      validation = true; 
      cout <<"Do you wish to continue? (Y/N): "; 
      cin >> choice; 
      if(toupper(choice) != 'Y' && toupper(choice) != 'N') 
      { 
       cerr << "We don't understand your choice, please try again." << endl; 
       cin.clear(); 
       validation = false; 
      } 
      while(cin.get() != '\n'){} 
     }while(!validation); 
    } 
    while(toupper(choice)=='Y'); 
} 

void sortPositiveNegative(double *vecteur, double *positive, double *negative, int counter, int &counterPos, int &counterNeg) 
{ 
    int i = 0; 
    for(i; i<counter;i++) 
    { 
     if(vecteur[i] >= 0) 
      positive[counterPos++] = vecteur[i]; 
     else 
      negative[counterNeg++] = vecteur[i]; 
    } 
} 

void display (const double *vecteur, int counter) 
{ 
    for(int i = 0; i<counter;i++) 
     cout << vecteur[i]<<endl; 
    cout << endl; 
} 

我的老師認爲這可能是一個記憶問題,但我們不知道爲什麼它這樣做。

在此先感謝。

+1

你使用什麼輸入會產生問題,它會產生什麼輸出? – Xymostech 2013-04-26 15:47:26

+4

你只分配一個double而不是其中的一個數組。你也在泄漏他們。 – avakar 2013-04-26 15:49:13

+0

這是OT,但我很驚訝你的老師看不到這麼簡單的事情。我希望(對於你和他教的其他所有學生)他那天的狀況很糟糕,這並不能反映他平時的C++技能...... – syam 2013-04-26 15:58:19

回答

7

確實存在內存問題,我不明白如何使用float可以修復它。例如,代碼的以下行分配僅一個雙鍵和不double數組:

double * vecteur = new double; 

然後,使用此vecteur,好像它是N個元素的陣列。這觸發了未定義的行爲。

要修復它,您將不得不根據需要分配儘可能多的值。例如,假設你需要10個,那麼你分配10這樣的:

double * vecteur = new double[10]; 

然而,由於你不知道提前元素的數量,則需要每次你想擴展陣列添加一個元素。如果你用C寫這個,我會建議你使用realloc()。但考慮到您使用C++,只需堅持std::vector<double>,它將自動管理內存。例如:

#include <vector> 

int main() 
{ 
    std::vector<double> vecteur; // Use vector to store array of doubles. 

    // Add as many elements as you want. 
    // Vector will resize itself if/when needed. 
    vecteur.push_back(.1); 
    vecteur.push_back(.2); 
    vecteur.push_back(.3); 
    vecteur.push_back(.4); 
    vecteur.push_back(.5); 
} 

希望它有幫助。祝你好運!

+0

就像我說的使用float不能解決問題,但我們可以在出現奇怪數字之前輸入更多數字。 – Redempter 2013-04-26 15:51:19

+0

@Redempter:這只是一個未定義的行爲。您的程序可能會立即崩潰(最好的情況),或者它可能繼續使用完全無效的數據(最壞的情況)。有人說你的電腦可能會爆炸 - 任何事情都可能發生。 – 2013-04-26 15:54:01

+1

@Redempter:這可能是因爲'float'小於'double',它在內存中產生會導致「奇怪數字出現」被稍後覆蓋......但實際上這種行爲是完全未定義的。 – LihO 2013-04-26 15:54:13

2
double * vecteur = new double; 

你爲一個分配空間doubile

filling(vecteur, counter); 

它傳遞給filling

cin >> vecteur[counter]; 

,並填寫直到用戶按下Y中一個已分配的內存單元去陣列之外對於。
double vs float並不重要。 float只是更小,因此會損壞內存較慢。但它仍然是腐敗的內存從vecteur[1]
開始我建議你使用std::vector<dobule>,而不是普通的指針,並與push_back

2
double * vecteur = new double; 
double * positive = new double; 
double * negative = new double; 

在這裏,您分配了一個雙重每次正好填補它。你存儲在你的「數組」中的第一項是好的,但其他任何事情都是未定義的行爲。

解決方法是實際分配儘可能多的項目,你需要:

double * vecteur = new double[MAXIMUM8NUMBER_OF_ITEMS]; 
double * positive = new double[MAXIMUM8NUMBER_OF_ITEMS]; 
double * negative = new double[MAXIMUM8NUMBER_OF_ITEMS]; 

或者更好的是,使用一個標準的集裝箱像std::vector

相關問題