Problem mit mehrdimensionaler Array-Größe



  • Wenn du einen Mehrdimensionalen Array haben willst musst du folgendes machen:

    int **xy;
    *xy = new int[10];
    for(int i = 0; i < 10; i++)
    {
        xy[i] = new int[10];
    }
    
    //irgendwas machen
    
    for(int i = 0; i < 10; i++)
    {
        delete[] xy;
    }
    
    delete[] *xy;
    


  • eher so

    for(int i = 0; i < 10; i++)
    {
        delete[] xy[i];
    }
    


  • Okay..., danke, für eure schnelle Antwort. Ich werde es gleich mal ausprobieren. Werde mich dann nochmal melden, ob es geklappt hat, aber wenn ihr es sagt, dann wird das schon stimmen. 😉

    EDIT:

    Also ich habe es nun so gemacht, wie ihr es oben beschrieben habt. Das Programm lässt sich nun kompilieren, aber nachdem ich die Werte für das Array eingetragen habe, z.B. 7 Felder für die Breite und 5 für die Höhe, dann kommen erstmal zwei Fehlermeldungen, dass die Anweisung 0x00401210 auf den Speicher 0x00000000 verweist und direkt danach kommt noch ein Fenster, und zwar das die Ausnahme "unknown software exception" (...) in der Anwendung an der Stelle ... aufgetreten ist.

    Ich vermute, dass ich das Array falsch durchlaufe und an irgendwelchen Feldern eine 0 reinschreiben möchte. Könnt ihr mir sagen, ob meine Vermutung richtig ist und wie ich das Array dann am besten durchlaufe? Danke schonmal...

    MfG Apo



  • Mach mal aus

    // Spielfeld durchlaufen
                for(i = 0; i < hoehe; i++)
                {
                    for(j = 0; j < breite; j++)
                        pSpielfeld[j][i] = 0;   // Hier kommt noch einer
                    cout << endl;
                }
    

    das hier:

    // Spielfeld durchlaufen
                for(j = 0; j < breite; j++)
                {
                    for(i = 0; i < hoehe; i++)
                        pSpielfeld[j][i] = 0;   // Hier kommt noch einer
                    cout << endl;
                }
    

    Könnte daran liegen, zumindest ist die Art, so ein 2-dimensionales Array zu durchlaufen, ungewöhnlich wie du es hast. Habe aber leider gerade nichts zum Testen zu Hand. Falls es immer noch nicht geht, poste mal nochmal deinen ganzen verbesserten Code, dann wird der Fehler evtl schon bei deiner Speicherplatzallokierung (new) liegen.



  • Guten Morgen Leute,

    also ich es nun mal so gemacht, wie du es mir gesagt hast, aber es funktioniert leider immer noch nicht. Hier ist nochmal mein Quellcode:

    // Header-Dateien
    #include <iostream>
    using namespace std;
    
    int main()
    {
        // deklarieren der Variablen
        int  breite     = 0;
        int  hoehe      = 0;
        int** pSpielfeld = NULL;
        int  i, j;
    
        // Eingabe
        cout << "Breite: ";
        cin >> breite;
        cout << "Hoehe: ";
        cin >> hoehe;
    
        // Eingabeauswertung
        if(breite < 0 || breite > 9 && hoehe < 0 || hoehe > 9)
        {
            cout << "Du hast eine ungueltige Eingabe getaetigt." << endl;
            cin.get(); cin.get();
            return 1;
        }
        else
        {
            // Speicher reservieren
            *pSpielfeld = new int[breite];
    		for(i = 0; i < hoehe; i++)
    			pSpielfeld[i] = new int[10];
    
            // testen ob Speicher reserviert werden konnte
            if(pSpielfeld)
            {
                // Spielfeld durchlaufen
                for(j = 0; j < breite; j++)
                {
                    for(i = 0; i < hoehe; i++)
                        pSpielfeld[j][i] = 0;
                    cout << endl;
                }
    
                // Spielfeld ausgeben
                for(j = 0; j < breite; j++)
                {
                    for(i = 0; i < hoehe; i++)
                        cout << pSpielfeld[j][i] << " ";
                    cout << endl;
                }
    
                // Speicher wieder freigeben
    			for(i = 0; i < hoehe; i++)
    				delete[] pSpielfeld[i];
    
                delete[] *pSpielfeld;
            }
        }
    
        cin.get(); cin.get();
        return 0;
    }
    

    Ich hoffe das ihr versteht, was ich mit dem Programm bezwecken möchte. Danke schonmal...

    MfG Apo



  • mach doch mal aus dem

    *pSpielfeld = new int[breite];
    

    ein

    pSpielfeld = new int*[breite];
    


  • Und lass beim letzten delete-Befehl das * weg.



  • und schau dir mal in der Win32 FAQ an, wie man die Konsole "besser" geöffnet lässt (@cin.get(),cin.get()) 😉



  • Hi,

    hat zwar nix mit deinem Problem direkt zutun, aber den Else-Zweig nach dem return 1 kannste dir schenken. Entweder bricht dein Programm die Main Funktion ab, oder der Code nach dem Anweisungsblock der If-Abfrage wird ausgeführt.

    Gruß Chris



  • Apocalypse schrieb:

    // Speicher reservieren
        *pSpielfeld = new int[breite];
        for(i = 0; i < hoehe; i++)
            pSpielfeld[i] = new int[10];
    

    Entweder du initialisierst mit new *int[hoehe], oder du läufst die Schleife nur bis breite durch. Sonst krachts bei der Ausführung, wenn hoehe > breite.



  • Hey..., danke es funktioniert nun. Es lag wirklich an den beiden Fehlern!

    MfG Apo *freu*


Anmelden zum Antworten