new/delete dynamische arrays



  • Hallo!
    Ich schreibe gerade das Programm Reversi. Für die KI möchte ich temporäre dyn. Arrays erstellen.

    Problem:
    -bei der initialisierung des 2. dyn arrays kann ich die nuller-elemente nicht initialisieren (laufen die schleifen ab 0 los, stürzt das prog ab)
    -beim löschen des 1.arrays nach dem löschen des 2.array ebenfalls absturz

    die wichtigsten programmteile sind angehängt.

    viele grüße und vielen dank für jede hilfe!
    fabian

    #include <iostream>
    
    using namespace std;
    
    int main(){
    
        // Variablen
    
        int nx = 8;
        int ny = 8;
    
        // Dynamisches Feld im Heap erzeugen
        //     Realisierung mit Pointer-to-Pointer und new/delete
        //     nachzulesen unter:
        //     http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c++_intro/html/node167.html
    
        int **a2d;
        a2d = new (int *);
        for (int i = 0; i < ny; i++)
            a2d[i] = new int[nx];
    
        // alle Felder mit 0 initiieren
    
        for (int i = 0; i < nx; i++){
            for (int j = 0; j < ny; j++){
                a2d[i][j]=0;
            }
        }
    
        cout << "Feld1 erzeugt und initialisiert" << endl;system("Pause");
    
            int ** t_a2d;    
            t_a2d = new (int *);
            for (int i = 0; i < ny; i++)
                t_a2d[i] = new int[nx];
    
        cout << "Feld2 erzeugt" << endl;system("Pause");
    
                // alle Felder mit 0 initiieren
    
            for (int i = 1; i < nx; i++){                                 //Warum hier erst ab 1 möglich????
                     for (int j = 1; j < ny; j++){
                         t_a2d[j][i]=0;
                     }
            }
    
            cout << "Feld2 erzeugt und mit null initialisiert" << endl;system("Pause");
    
            for (int i = 1; i < nx; i++){
                     for (int j = 1; j < ny; j++){
                         t_a2d[j][i]=a2d[j][i];
                     }
            }
    
            cout << "Feld2 erzeugt mit Feld1 initialisiert" << endl;system("Pause");
    
             for (int i = 0; i < ny; i++)
                delete [] t_a2d[i];
            delete [] t_a2d;
            cout << "Feld2 gelöscht" << endl;      system("Pause"); 
    
         // Dynamisches Feld1 aus dem Heap Löschen
    
        for (int j = 0; j < ny; j++)
            delete [] a2d[j];
        delete [] a2d;
    
        cout << "Feld1 gelöscht" << endl;    system("Pause");
        system("Pause");   
        return 0;
        }
    


  • In Zeile 22 holst du Speicher für genau einen int-Zeiger. In der darauf folgenden Schleife tust du aber so, als ob du ny int-Zeiger hättest.



  • hmm, unter http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c++_intro/html/node167.html stand es so:

    int main(void)
        {
          int zeilen, spalten;
          // matrix Zeiger auf double-Zeiger,
          // d.h. matrix kann bel. viele Zeilen enthalten,
          // die jeweils bel. viele Spalten enthalten koennen
          double ** matrix;
    
          cout << "Zeilen der Matrix: ";
          cin >> zeilen;
    
          cout << "Spalten der Matrix: ";
          cin >> spalten;
    
          // falsch, da matrix[i] vom Typ "double *" und nicht vom Typ 
          //   double [spalten]!
          //   matrix = new double[zeilen][spalten];
          matrix = new (double *)[zeilen];
    
          for (int i = 0; i < zeilen; i++)
          {
            matrix[i] = new double[spalten];
            for (int j = 0; j < spalten; j++)
              matrix[i][j] = i*spalten + j;
          }
    
          for (int i = 0; i < zeilen; i++)
            delete [] matrix[i];
          delete [] matrix; 
    
          return 0;
        }
    

    da [zeilen] nach new (int*) von meinem compiler nicht akzeptiert wurde, hab ich es weggelassen und es hat solange funktioniert bis ich ein 2. array programmiert habe.

    wie kann ich es zum laufen bringen?

    Fabi



  • Hallo,

    hast du wirklich [zeilen] geschrieben oder [ny].
    zeilen kann ja nicht funktionieren, weil du keine Variable mit dem Namen zeilen deklariert hast.
    Das Problem ist das unten benannte.

    MfG
    DDR-RAM



  • compiler antwort auf das matrix programm:

    In function `int main()':
    22: error: array bound forbidden after parenthesized type-id
    22: note: try removing the parentheses around the type-id
    


  • mit den variablennamen gibt es keine problem, das problem ist, das dort überhaupt klammern hinter (int*) stehen

    die o.g. compiler-zeilenangaben stimmen nicht, hier korrigiert:

    In function `int main()': 
    18: error: array bound forbidden after parenthesized type-id 
    18: note: try removing the parentheses around the type-id
    


  • Dann ersetze deine Zeile 22 durch:

    a2d = new int*[ny];
    

    und deine Zeile 39 durch

    t_a2d = new int*[ny];
    

    Hoffe das hilft.

    MfG
    DDR-RAM



  • wow, läuft!

    VIELEN DANK für die schnelle Hilfe!

    Fabian


Anmelden zum Antworten