arrayfrage
-
hallo!
ich habe ein problem mit einem array, ich möchte darin einen wert aendern, dabei stürzt das programm ab. wo liegt mein fehler?
mein code:
#include <iostream> #include <fstream> #include <stdlib.h> using namespace std; /*char *field [] = { "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx" }; */ int main () { char *field [] = {"xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx", "xxxxxxxx"}; int koord_x; cin>>koord_x; int koord_y; cin>>koord_y; cout<<field[koord_x][koord_y]<<endl; delete (field[koord_x][koord_y]); field[koord_x][koord_y] = 'l'; cout<<field[koord_x][koord_y]<<endl; int x; x = 0; int y; y = 0; while (x != 8) { while ( y != 8) { cout<<field[x][y]; y++; } cout<<endl; y = 0; x++; } cin.get(); cin.get(); }
-
lösch die Zeile mit dem delete...nur was Du per new angefordert hast, kannst Du mit delete freigeben.
-
das problem besteht immer noch, nach der ausgabe des wertes stürzt das programm mit undefiniertem verhalten ab...
-
Hi,
ich sehe 2 Alternativen für Dich:
A) (zu der würde ich dringend raten) Du nutzt einen vernünftigen Container#include <iostream> #include <vector> #include <string> using namespace std; int main () { vector<string> field; for(size_t i=0; i<8; ++i) field.push_back("xxxxxxxx"); size_t koord_x; // soll doch sowieso >= 0 sein, oder ? Dann sag es dem Compiler mit einem size_t ;) cin>>koord_x; // Sicherheitsabfrage, ob Input gültig war solltest Du noch machen size_t koord_y; cin>>koord_y; cout<<field[koord_x][koord_y]<<endl; field[koord_x][koord_y] = 'l'; // Wenn Du Überschreiben willst, brauchst Du nicht vorher zu löschen cout<<field[koord_x][koord_y]<<endl; // Hiernach kommt einiges an "Kraut&Rüben"-Code, de IMO noch überarbeitet werden sollteWenn Du wirklich etwas aus eine String entfernen möchtest (z.B. "Simon2" -> "Sion2"), solltest Du Dir die erase()-Funktion von string ansehen.
Insgesamt eine gute (wenn auch manchmal etwas knappe) InfoQuelle: www.cppreference.com .
Du arbeitest Dich gründlich in das Thema "Pointer/Arrays/const" ein.
("delete" ist KERNfalsch in dem Zusammenhang!)Gruß,
Simon2.
-
das problem ist nicht nur das delete, da deine elemente vom typ const char* sind. somit kannst du nichts darauf ändern..
-
der code ist nur testweise...
gut, dann mal noch 2 fragen
1. was macht vector<string> ? wie darf man sich das vorstellen? macht das gleich ein virtuelles 2d feld?
2. was ist size_t für ein typ?
-
fragenersteller schrieb:
der code ist nur testweise...
gut, dann mal noch 2 fragen
1. was macht vector<string> ? wie darf man sich das vorstellen? macht das gleich ein virtuelles 2d feld?
2. was ist size_t für ein typ?2 Gegenfragen
1. Hast Du irgendein Tutorial zur Hand ? Es ist im Netz und zahllosen Büchern bereits alles Wichtige und Gute dazu geschrieben worden, so dass ich mich jetzt nicht 2 Stunden hinsetze, um es nochmal einzutippen.
2. Was ist "ein virtuelles 2d feld" ? ... ich bin mir aber ziemlich sicher, dass es weder mein noch Dein Code erzeugt (Deiner versucht ein Array auf char-Pointer zu nutzen, meiner einen vector von strings).
Gruß,
Simon2.
-
Hi,
Einen vector<typ> kann man sich wie eine liste von objekten vom typ <typ>
vorstellen, man kann hinzufügen, entfernen usw...In deinem fall wären das 8 char[8] variablen, die du dann indizieren kannst...
mit den ersten arrayklammern [] wird dein Objekt indiziert, mit den zweiten
der char in dem char*.size_t ist ein
typedef unsigned long size_t;
der zum definieren von groessen in zeichenketten oder speicherbereichen
benutzt wird... kannst die ihn aber auch einfach als unsigned long vorstellen...Gruß,
benth
-
benth schrieb:
...char[8] ...
Wieso nicht string ?
benth schrieb:
...
size_t ist eintypedef unsigned long size_t;
...MÖP falsch !

Der Standard legt nicht fest, wie size_t implementiert wird, sondern nur, dass er "für Adress-Indizierungen geeignet" sein muss. Auf anderen Systemen ist size_t bestimmt anders definiert (wobei IIRC nicht einmal sichergestellt ist, dass size_t aus einem anderen Datentype "besteht", sondern theoretisch ein ganz eigener Datentyp sein kann).Gruß,
Simon2.
-
Ich hatte das jetzt auf ANSI-C bezogen,
du hast aber recht, der typ kann auch ne andre definition haben.
-
schreibe in den while schleifen statt "!=8" eine "!= 7"