2016-11-08 2 views
0

Ich arbeite an einem Programm, wo ein Benutzer weiterhin Zahlen eingeben, die in einem Array gespeichert werden, wenn das Array voll ist Ich versuche, das ursprüngliche Array in ein neues zu kopieren und weiter zu füllen Sie das Array, aber ich kann es überhaupt nicht funktionieren. Hier ist mein Code so weitVersuchen, Array-Größe dynamisch zu erhöhen

+6

Verwenden Sie stattdessen ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). – TartanLlama

+3

Der Ausdruck 'new double * [size]' ordnet 'double' ein Array von' size * * pointers * zu. Bei einem 32-Bit-System führt dies zu Problemen. –

+1

Und bitte näher auf Ihr Problem? * Wie * kannst du es überhaupt nicht "zur Arbeit bringen"? Bitte [lesen Sie, wie Sie gute Fragen stellen können] (http://stackoverflow.com/help/how-to-ask). –

Antwort

0

Ich kann es, indem die Doppelzeiger zeigen auf die Doppel, anstelle von Arrays von Doppelzeiger zu kompilieren erhalten

int size; 
cout << "Please enter how many numbers you want to enter: "; 
cin >> size; 
double *array = new double[size]; 
//      ^--- not pointers to doubles 
cout << "Please enter your numbers: "; 
for(int i = 0; i < size; i++) { 
    cin >> array[i]; 
    if(i == size-1) { 
     int newSize = 2*size; 
     double *arrayb = new double[newSize]; 
     //       ^--- not pointers 
     for(int i = 0;i<size;i++) { 
      arrayb[i] = array[i]; 
     } 
     delete [] array; 
     array = arrayb; 
     size = newSize; 
    } 
} 

Sie haben im ersten neuen Speicher für die Daten genügend Speicher zugewiesen. ABER Wenn Sie einen vor dem Ende des aktuellen Werts von size erhalten, verdoppeln Sie den zugewiesenen Speicherplatz. Und make size = newSize. Die äußere for-Schleife wird niemals enden, es sei denn, es wird eine Ausnahme ausgelöst, z. B. eine bad::alloc, die irgendwann passieren wird.

1

Wenn Sie die maximale Größe Ihrer Sammlung vor der Ausführung nicht kennen, müssen Sie Array vermeiden. Wie TartanLlama sagt, können Sie einen std :: vector verwenden. Mit Vector können Sie Elemente beliebig hinzufügen. Aber es gibt viele Container mit unterschiedlichen Zugriffsmethoden. Siehe diesen Link einen ersten Blick haben, wie Ihre Container wählen: In which scenario do I use a particular STL container?

+0

Sie sollten einen geeigneten Behälter wählen. http://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container – alirakiyan

0

Wenn Sie die Kompilierungsfehlern lesen, sehen Sie, das Problem:

g++ -std=c++17 -fPIC -g -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds -O2 -Weffc++  14226370.cpp -o 14226370 
14226370.cpp: In function ‘int main()’: 
14226370.cpp:11:37: error: cannot convert ‘double**’ to ‘double*’ in initialization 
    double *array = new double*[size]; 
            ^
14226370.cpp:17:49: error: cannot convert ‘double**’ to ‘double*’ in initialization 
      double *arrayb = new double*[newSize]; 

Sie erstellen ein Array von Zeigern zu verdoppeln und zu versuchen, einen einzelnen Zeiger zu initialisieren beide zu verdoppeln, auf Fälle.

Mit Blick auf die Art, wie Sie diese verwenden, sollten Sie wahrscheinlich schreiben new double[size] und new double[newSize].