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 sollte
    

    Wenn 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 ein

    typedef 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"


Anmelden zum Antworten