2016-09-08 4 views
0

Ich bin neu in C++ und Microsoft Visual Studio und ich arbeite derzeit an einem Labor für meine Datenstrukturen Klasse, ich habe meinen Code fertig, aber wenn ich mein Programm erstellen und ausführen, wirft es diesen Fehler:Nicht genügend Speicherzuweisung?

std::bad_alloc at memory location 0x0018C9C0. 

Ich googelte diesen Fehler und ich fand, dass dieser Fehler ausgelöst wird, wenn nicht genügend Speicher für das Programm reserviert ist oder das Programm versucht, eine unendliche Menge an Speicher für etwas zuzuordnen. Ich habe versucht, mehr Speicher in den Programmeigenschaften zu reservieren, aber das schien nicht zu helfen. Wenn ich meinen Code überblicke, kann ich nichts finden, was diesen Fehler verursachen würde. Hier ist mein Code als Referenz:

#include <iostream> 
#include <iomanip> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    string value; 
    string linesArray[200]; 
    int i = 0; 
    int j = 0; 
    int finalLine = 158; 

    getline(cin, line, '\n'); 
    getline(cin, line, '\n'); 

    /* First Line */ 
    for (i; i < finalLine; ++i) { 
     getline(cin, line, '\n'); 

     for (j; j <= 24; ++j) { 
      if (j = 0) { 
       line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' ')); 
      } 
      line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' ')); 
     } 
     linesArray[i] = value; 
     cout << linesArray[i] << endl; 
    } 

    return 0; 
} 

Ich habe versucht, einen Zeiger zu schaffen, die Adresse zu finden, die es in dem Fehler zeigt, aber ich konnte es nicht finden. Jede Hilfe wird sehr geschätzt.

EDIT: Sorry, dass ich mich nicht klar gemacht habe, meine Eingabe ist eine TXT-Datei im Format eines CSV. Ich nehme die Informationen auf und auf die erste Spalte jeder Zeile platziere ich 30 Leerzeichen abzüglich der Länge des Wertes und auf den Rest der Werte platziere ich 20 Leerzeichen abzüglich der Länge des Wertes, außer es gibt keinen Wert, in dem ich setze eine Null mit 19 Leerzeichen.

Beispiel Eingabe:

Albania,14,29365,43301,,,,,,,13,27867,41066,,,,,,,1,1498,2235,,, 
+6

'if (j = 0)' das ist eindeutig falsch. Vielleicht meinst du 'if (j == 0) ' – Ari0nhh

+1

Nur ein Sicherheitsdetail, aber ich schlage vor, finalLine als const zu deklarieren, damit du sicher bist, dass es sich nicht irgendwo in der Schleife ausdehnt. (Soweit ich sehe es nicht, aber es ist mehr eine Sicherheitsmaßnahme und es gibt Ihnen eine Sache weniger Sorgen) –

+0

Ihre erste Vorgehensweise sollte sein, Ihren Code in einem Debugger ausführen und bestimmen, wo in Ihrem Code Fehler tritt auf. – kfsone

Antwort

2

ändern diese:

if (j = 0) { 

dazu:

if (j == 0) { 

für einen Start. Und versuchen Sie es erneut ...

Ich vermute nicht, dass Ihr Code so viel Speicher zuweist, um std::bad_alloc Ausnahme zu werfen.


Wenn Sie das tun j = 0jedes Mal auf den Stern Ihrer * erstellen Sie eine Endlosschleife ...


Beachten Sie, dass nach der Korrektur, dass ich zwei Verwarnungen erhalten expression result unused, wenn mit -Wall Flag kompilieren, die nicht die Ursache des Problems sind, aber es wäre schön zu verstehen, dass:

for (j; j <= 24; ++j) { 

braucht nicht j dort und produzieren die Warnung haben, schreiben Sie es wie folgt aus:

for (; j <= 24; ++j) { 

da Sie wollen es j nicht initialisiert werden.

+1

Unendliche Schleife überläuft Stapel nicht Infinite * Rekursion * tut – Ari0nhh

+0

Korrekt @ Ari0nhh, aktualisiert! – gsamaras

+0

Ich änderte es, aber es wirft immer noch den Fehler, aber die Position geändert, so denke ich, es kann geholfen haben ein Problem –

1

wir Wert für line="xyz,abc", nach Ihrem Code prüfen lassen, für j==0, funktioniert der Code und und die line wird Aktualisierungswert haben, in der ',' ersetzt wird, wird im Anschluss an die für die 'line' nach dem ersten replace, löscht

xyz       c 

jetzt für die zweite Iteration, während die Variable line ersetzen Sie finden die ',' dh line.find(','), die nicht in der line String ist und die std::find()' wird std::string::npos zurückkehren, ist dies wo Sie Ausnahmen behandeln müssen, die folgende URL sagt, dass string::replace Sie, dass für pos Parameter

Position of the first character to be replaced. If this is greater than the string length, it throws out_of_range.

Ich glaube, Sie jetzt haben finden können.

1

Die ersten zwei getlines sind bedeutungslos, sie werden von der getline in der i Schleife überschrieben. Der Wertstring erhält auch niemals einen Wert zugewiesen. Dann nehmen Sie einige Eingaben, die anscheinend ein spezielles Format haben müssen - weil das Ersetzen von Zeilen nichts Sinnvolles für irgendeinen String macht, den ich schreiben könnte. Wenn wir verstehen wollen, was Sie versuchen, müssen wir das Format Ihrer Eingabe-Strings kennen.

Insert print-Anweisungen für beide Ihre Schleifenvariablen i und j und der Linienzug nach jeder Operation, wie folgt aus:

/* First Line */ 
for (i; i < finalLine; ++i) { 
    getline(cin, line, '\n'); 
    line = line.replace(line.find(','), line.find_first_of(','), string(30 - line.find(','), ' ')); 
    cout << "[i=" << i << "] " << line << endl; 
    for (j; j <= 24; ++j) { 
     line = line.replace(line.find(','), line.find_first_of(','), string(20 - line.find(','), ' ')); 
     cout << "[j=" << j << "] " << line << endl; 
    } 
    linesArray[i] = line; 
    cout << linesArray[i] << endl; 
} 

Auch zog ich die erste Zeile aus dem j ersetzen Schleife.

Wenn ich den Code ausgeführt wurde die erste ersetzen Gibberish, die mehr Bedeutung auf Ihre speziell formatierten Zeichenfolgen haben könnte. Dann stürzte es auf den ersten j = 0 in der Innenschleife. Also, kurz gesagt, drucken Sie die Ergebnisse jeder Operation und Sie werden viel einfacher sehen, was vor sich geht.