3dimensionales char-Array dynamisch anlegen



  • Ich muss ich Verlauf eines Programmes ein 3D char-Array anlegen.
    also in der Form

    char matrix[x][y][z]
    

    das eigentliche Problem dabei ist, dass alle drei Werte (x,y,z) erst während der Laufzeit ermittelt werden.
    Ich vermute, dass man hier mit malloc() arbeiten kann/muss, hab aber keine Ahnung wie ich das in diesem Fall anwenden kann 😕
    Danke schon mal für eure Hilfe 🙂



  • Die Speicherreservierung ist einfach.

    char *matrix;
    
    matrix = malloc(x*y*z);
    

    Ob du dann allerdings noch mit den [] drauf zugreifen kannst, ist eine andere Frage. Ich hab das noch nicht ausprobiert und ich weiß nicht wie das der Compiler sieht.

    Vielleicht gibts auch noch eine andere Möglichkeit. 😕



  • @AJ,
    das was du machst ist nur ein 1D Array 🙂

    @Trastaran,

    folgendes sollte aber funktionieren.

    char *matrix[3];
    
    matrix[0] = malloc( x );
    matrix[1] = malloc( y );
    matrix[2] = malloc( z );
    

    Jetzt funktioniert auch

    char elem = matrix[0][0][0];
    

    wunderbar.

    Bye Peter.



  • @AJ:
    es ist richtig, den Speicher für einen 1D Array ist ziemlich einfach! Aber, so wie du den Speicher freischaffen willst, so einfach gehts dan auch wieder nicht! Mit dieser Variante erzielst du nur gerade einen 1D Array! Mit Index für die 1. Dimension

    @Trastaran
    Ich denke, es wird schon etwas komplizierter. Ich versuche mal so etwas in der Art. Ob es die Eleganteste Lösung ist, kann ich nicht beurteilen. (Beispielcode):

    ...........
    	char ***Matrix;
    	short x=4,
    	      y=3,
    	      z=2;
    	short i,j;
    
    	/*Speicher freigeben für die 1. Dimension*/
    	Matrix=(char***)malloc(sizeof(char*)*x);
    
    	/*Die 2. u. 3. Dimension werden freigegeben*/		
    	for(i=0;i<x;i++)
    	{
    		//Für jedes Feld in der 1. Dimension werden n. Felder 
                      // für die 2. Dimension Freigegeben.
    
    		Matrix[i]=(char**)malloc(sizeof(char*)*y);   
    		for(j=0;j<y;j++)	//Das gleiche für die Felder der 2. D.
    		   Matrix[i][j]=(char*)malloc(sizeof(char)*z);
    	}
    
    ................
    
    	/*Speicherfreigabe in umgekehrter Reihenfolge*/
    	for(i=0;i<x;i++)
    	{
    		for(j=0;j<y;j++)
    			free(Matrix[i][j]); //Löschen der 3. Dimension
    		free(Matrix[i]); //Löschen der 2.
    	}
    	free(Matrix);   //3DArray komplett gelöscht!	   
    ..............
    

    Auf diese Weise, müsste es eigentlich funktionieren! Auch sollten die Einzelnen felder über den Index erreichbar sein (Matrix[n][n][n]).

    gruss

    (p.s. Alle Angaben ohne Gewähr) 🙂



  • @__Peter
    Das was du machst wäre aber nur ein 2 dimensionales Array ;). Das noch dazu nicht dem Zweck entspricht, den Trastaran will.

    Möglicherweise könnte es folgendermaßen funktionieren:

    int maxx, maxy, maxz;
    int x, y, z;
    unsigned int *matrix;
    
    maxx = maxy = maxz = 5;
    
    matrix = malloc(maxx * sizeof(unsigned int));
    for(x=0;x<maxx;++x)
    {
       matrix[x] = malloc(maxy * sizeof(unsigned int));
       for(y=0;y<maxy;++y)
       {
          matrix[x][y] = malloc(maxz * sizeof(char)); 
          //wobei sizeof(char) eigentlich überflüssig wäre
       }
    }
    

    Ich übernehme allerdings keine Gewähr dafür. Ist nur so eine Idee. Soviel ich weiß ist unsigned int die Größe eines Zeigers, darum hab ich es verwendet, falls ihr euch darüber wundert. Man könnte, glaub ich, auch sizeof(char 😉 schreiben. Ist wahrscheinlich auch verständlicher.
    Möglicherweise stimmt auch die Deklaration von matrix noch nicht ganz. Eventuell muss das char **matrix heißen. Wie gesagt, ich hab sowas noch nicht ausprobiert. Vielleicht findet sich ja einer, der sich besser auskennt damit 😕



  • @quorx
    😃 Da hatten wir wohl die gleiche Idee. Kann man sogar eine Angabe mit *** machen? 😮



  • @alle,

    na gut 😞 ... man sollte halt erst genau
    überlegen bevor man postet 🙂

    Aber dafür haben wir jetzt Beispiele für die
    Generierung von 1D, 2D und 3D Arrays zusammengetragen 🙂

    Bye Peter.



  • @AJ,
    Ja es ist möglich!
    @___Peter,
    Ist doch auch was!! jetzt braucht niemand mehr etwas zu dyn. Arrays posten 😉

    grüsse @alle



  • @quorx
    Und was ist mit 4D-Arrays? 😉


Anmelden zum Antworten