dynamisches 3D-Array



  • Ich versuche gerade, ein dynamisches 3D-Array mit den Maßen A_Temp[Projekt->Anzahl][N_F][N_F] zu bauen. Zwar habe ich es auf ähnliche Weise schon in 2D geschafft, aber nun komme ich nicht mehr voran.
    N_F ist eine Konstante, Projekt->Anzahl jedoch nicht.
    Ob

    int*** A_Temp;// = NULL;
    
    A_Temp = new int**[Projekt->Anzahl];
    
    for( unsigned int i = 0; i < Projekt->Anzahl; i++ )
    {A_Temp[i] = new int*[N_F];}
    
    for( int i = 0; i < N_F; i++ )
    {A_Temp[i] = new int*[N_F];}
    

    oder

    int*** A_Temp;// = NULL;
    
    A_Temp = new int**[S_Projekt0->Anzahl];
    
    for( unsigned int i = 0; i < Projekt->Anzahl; i++ )
    
    {
    for( int j = 0; j < N_F; j++ )
    {A_Temp[i][j] = new int*[N_F][N_F];}
    }
    

    , die Fehlermeldung ist stets
    "error C2440: '=': 'int ()[11]' kann nicht in 'int *' konvertiert werden".
    Mir läuft leider die Zeit davon, das nochmal fundiert anzugehen und aus den einschlägigen tutorials und FAQs bin ich auch kein Stück schlauer geworden. Wahrscheinlich isses sowieso simpelst und selbst wenn nicht, hoffe ich, jemand von Euch kann mir in der Sache helfen.

    Dank und Grüße
    yofu



  • Ich bin mir nicht 100% sicher, aber ist da nicht 1x ein * zuviel beim?

    int*** A_Temp;// = NULL;
    
    A_Temp = new int**[S_Projekt0->Anzahl];
    
    for( unsigned int i = 0; i < Projekt->Anzahl; i++ )
    
    {
    for( int j = 0; j < N_F; j++ )
    {A_Temp[i][j] = new int[N_F][N_F];}  //hier die Aenderung
    }
    

    Warum ich so denke? Nun, man schreibt ja auch nicht int* i= new *int; sondern int* i= new int; weil new eh schon einen Zeiger zurueckliefert oder irre ich mich da?



  • In zeitkritischen Anwendungen dauert das Anlegen über new, new und nochmal new zu lange.
    Hier kann man auch einfach den ganzen Speicher auf einmal als unsigned char allokieren mit Größe x*y*z*sizeof(datentyp) und den dann neu in ein 3d Array verzeigern.

    Verge



  • Du mußt die Unter-Dimensionen in einer doppelten Schleife anlegen:

    int*** A_Temp;// = NULL;
    
    A_Temp = new int**[Projekt->Anzahl];
    
    for( unsigned int i = 0; i < Projekt->Anzahl; i++ )
    {
      A_Temp[i] = new int*[N_F];
      for(unsigned int j = 0; j < N_F; j++ )
       A_Temp[i][j] = new int[N_F];
    }
    

    Und analog dazu auch wieder freigeben.

    (oder du mappst die Datenstruktur runter auf einen eindimesnionalen Bereich und rechnest dann von Hand die Koordinaten um:

    int* A_Temp = new int[Projekt->Anzahl*N_F*N_F];
    
    //Zugriff A_Temp[i][j][k] -> A_Temp[i*Projekt->Anzahl*N_F + j*N_F + k]
    


  • Vielen Dank für die Hilfe. Die Lösung von CStoll funktioniert natürlich blendend, und zeitkritisch ist dieser Programmabschnitt glücklicherweise nicht.


Anmelden zum Antworten