[C++] Zweidimensionales dynamisches std::string-Array
-
Schau Dir doch mal folgendes 2d dyamisches Array an, vielleicht hilft es Dir
bei der Fehlersuche.#include <iostream> using namespace std; int main(int argc, char* argv[]) { int Zeilen = 3 ; int Spalten = 4 ; int **array; array = new int * [ Zeilen ] ; for( int i = 0 ; i < Zeilen ; ++i ) { array[i] = new int [Spalten]; for( int j = 0 ; j < Spalten ; ++j ) { array[i][j] = i + j ; } } delete[]array; return 0; }
-
Beim Debuggen bricht das Programm an dieser Stelle ab
-
Das ganze wird innerhalb eines Konstruktors aufgerufen
RamMachine::RamMachine() { this->accumulator = 0; this->programCounter = 0; this->indexRegister = new int(Config::getInstance()->getMaxIndexRegister()); for (int j = 0; j < Config::getInstance()->getMaxIndexRegister() ; j++) { indexRegister[j] = 0; } this->memoryRegister = new int(Config::getInstance()->getMaxMemoryRegister()); for (int h = 0; h < Config::getInstance()->getMaxMemoryRegister() ; h++) { memoryRegister[h] = 0; } this->programCode = new string[Config::getInstance()->getMaxProgramCode()]; this->byteCode = new string*[Config::getInstance()->getMaxProgramCode()]; for (int i = 0; i < Config::getInstance()->getMaxProgramCode() ; i++) { this->byteCode[i] = new string [Config::getInstance()->getMaxByteCode()]; } }Dabei werden die Werte für die Größe der Array aus einer Singleton-Klasse Config herausgelesen.
-
Mit
vectorwäre das nicht passiert.
-
Beschreib mal dein Problem. Mein 2D-Nutzlos gefährliches Pointergefrikel funktioniert nämlich:
#include <iostream> #include <string> using std::string; using std::cout; using std::endl; int main() { string **dynarray = new string *[2]; for (int i = 0; i < 2; ++i) dynarray[i] = new string[13]; for (int i = 0; i < 2; ++i) for (int j = 0; j < 13; ++j) { dynarray[i][j] = "something"; } for (int i = 0; i < 2; ++i) for (int j = 0; j < 13; ++j) { cout << j << endl; cout << dynarray[i][j] << endl; } for (int i = 0; i < 2; ++i) delete[] dynarray[i]; delete[] dynarray; }
-
Wie würde das mit vector aussehen?
Ich nehme an im Header die Deklaration:
vector< vector<string> > byteCode;Und in der cpp-Datei(bzw. im Konstruktor) die Bestimmung der Größe:
byteCode.resize(Config::getInstance()->getMaxProgramCode()); for(int i = 0; i < Config::getInstance()->getMaxProgramCode(); i++) { byteCode[i].resize(Config::getInstance()->getMaxByteCode()); }Kommt das in etwa hin?
-
Das ganze möchte ich folgendermaßen nutzen:
Ich habe ein eindimensionales Array mit strings. Dieses möchte ich zur weiteren verarbeitung in einzelne Tokens zerlegen, um später zu entscheiden wie weiter damit umgegangen werden soll.
-
Mhenlo schrieb:
Das ganze möchte ich folgendermaßen nutzen:
Ich habe ein eindimensionales Array mit strings. Dieses möchte ich zur weiteren verarbeitung in einzelne Tokens zerlegen, um später zu entscheiden wie weiter damit umgegangen werden soll.
Also hast du Paare? (Einmal den string und einmal die Tokens)
Vermutlich eine kranke Idee, aber wie wärs mit einem Vektor von std::pair,wo das erste im Pair der String ist und das zweite ein Vektor der Tokens? Oder sogar eine Map, mit dem string als Key und den Tokens als Vektor als Wert?
-
Du wolltest hier [] statt () (und etwas später auch)?
this->indexRegister = new int(Config::getInstance()->getMaxIndexRegister());
-
Das sind zurzeit jeweils 7 zueinandergehörende Strings.
-
Zeig mal die Funktion, die die Eingabe in Tokens zerlegt. Vielleicht gibt es ja noch sinnvollere Datenstrukturen.
-
Mhenlo schrieb:
Das sind zurzeit jeweils 7 zueinandergehörende Strings.
Wie gesagt, bei Paaren würde ich zu einer Map greifen.
-
Danke manni66,
auf den Fehler hät ich selber kommen können... aber manchmal scheint man wohl Tomaten auf den Augen zu haben

Es funktioniert nun alles wie gewünscht, danke allen für die Hilfe.
Gruß,
Mhenlo
-
Mhenlo schrieb:
Danke manni66,
auf den Fehler hät ich selber kommen können... aber manchmal scheint man wohl Tomaten auf den Augen zu haben

Es funktioniert nun alles wie gewünscht, danke allen für die Hilfe.
Ich hoffe doch du hast jetzt
vectorgenommen.
-
Noch nicht, werde es mit aber gleich mal zur Brust nehmen
