Einlesen eines 3D Arrays -> Speicherfehler



  • Hallo,
    ich will einen 3Array mit schleifen einlesen.
    Alles compiliert auch und läßt sich ausführen doch dann stellt Windows xp ein Problem fest 😡

    Von den 3 Dimensionen sollen die größe von 2 erst während der Laufzeit feststehen:

    // Array Anlegen
          pixel= new unsigned char **[heigthi];
    
          for(int a=0;a<heigthi;a++){
          pixel[a]  = new unsigned char*[widthi];
    
          for(int b=0; b<widthi;b++){
    
                            pixel[a][b]= new unsigned char [3];
                  }
         }
    
    //Array von Datei filein einlesen 
       for(int a = heigthi-1; a >= 0; a--){
    
         for(int b = widthi-1;b >= 0; b--){
    
                         pixel[2][b][a] = fgetc(filein);   
                         pixel[1][b][a] = fgetc(filein);
                         pixel[0][b][a] = fgetc(filein);   
                         }
    
                   }
    

    Durch auskommenteiren habe ich erfahren dass der Fehler nicht auftritt wenn:
    -ich anstatt
    for(int b = widthi-1;b >= 0; b--)
    for(int b = widthi-32;b >= 0; b--)
    schreibe ( in diesem konkretten fall war widthi=429)

    -oder wenn ich pixel[1][b][a] = fgetc(filein);
    pixel[0][b][a] = fgetc(filein);
    weglasse

    Und die Variabeln widthi und heigthi verändern sich währen dem ganzen Programm nicht.

    Ich verstehe nicht wie da ein Speicherfehler zustande kommen kann!
    Wäre sehr dankbar wenn jemand mir weiter helfen kann weil ich einfach nicht den Fehler finde.



  • Also erstmal. Ein 3D Array macht man einfach nicht. 😉

    pixel[2][b][a] = fgetc(filein);
    pixel[1][b][a] = fgetc(filein);
    pixel[0][b][a] = fgetc(filein);

    Warum gibts du hier 0,1,2 am Anfang an? Das hat ja die Grösse heigthi und nicht 3..
    a und be sind ja auch falsch. Im übrigen. Ist das alles, was du einliest? Das ist ja nicht gerade viel..

    Was kriegst du denn für einen Fehler? Genau?
    Ich könnte mir gut vorstellen, dass du irgendwo auf ausserhalb der Array Grenzen darauf zugreifst.

    Und wegen dem Speicherleck. Zeig mal her, wie du den Speicher wieder freigibst. Da kann man viel falsch machen. 😉

    btw:
    Wenn du schreibst, dass 429 eine Grösse ist. Wie gross ist den dein Array? Das kann sehr schnell seehr gross werden. 🙂



  • Ja danke des mit dem außerhalb des Arrays hat schon gestimmt.
    Hatte alles vertauscht^^

    Des Array sollte einfach nur die Farbwerte von einem Bitmap speichern,
    also bei normalen Bider so ca 500 * 600*3.

    Was mir nicht sicher ob ich des so richtig lösche wenn ich einfach nur

    delete pixel;
    //oder?
    delete []pixel;
    

    Jetz werden auch endlich alles richtig eingelsen, danke !



  • Du musst für JEDES new das passende delete anwenden.

    Wenn du ein Array anforderst, dann brauchst du den delete[] Operator.

    Also brauchst du in etwa die gleiche Schleife, wie beim erstellen nocheinmal, um alles wieder freizugeben. Und (hier) immer mit delete[].

    Also in etwa so:

    //Immer schön von innen nach ausse freigeben.
          for(int a=0;a<heigthi;a++)
          {
              for(int b=0; b<widthi;b++)        
                 delete[] pixel[a][b];
              delete[] pixel[a];
          } 
          delete[] pixel;
    

Anmelden zum Antworten