2-D Array als PointerPointer??



  • Hallo zusammen,

    ich sitze gerade vor einem Rätsel. Mein Problem ist die Funktion "printMatrix". Der Zugriff auf die Matrix über den PointerPointer funktioniert nicht und mir ist nicht ganz klar wieso. Hab ich da was missverstanden??
    Wie kann ich denn anders meine Matrix an die Funktion "printMatrix" übergeben?

    Vielen Dank

    Gruß
    Fletscher

    #include <stdio.h>
    #include <stdlib.h>
    
    void printMatrix(float **, int);
    
    int main(void) {
    
    	static float matrix[2][2] = { {1.2f, 1.3f}, {3.2f, 4.5f}};
    	int size = 2;
    
    	printMatrix(matrix, size);
    
    	return 0;
    }
    
    void printMatrix(float **pmatrix, int size)
    {
    	int x, y;
    	for(y = 0; y < size; y++)
    	{
    		printf("\n");
    		for(x = 0; x < size; x++)
    		{
    			printf("%f ", *((*(pmatrix + x))+y) );
    		}
    	}
    }
    


  • Hallo Fletscher2,

    versuchs mal damit

    static float** matrix = new float*[2];
    matrix[0] = new float[2];
    matrix[1] = new float[2];
    // Matrix füllen
    //...
    

    Viele Grüße,
    MaBa



  • MaBa schrieb:

    static float** matrix = new float*[2];
    

    Was ist denn das?

    Manchmal kommt mir vor, ich sage nichts anderes mehr.



  • In C99 geht Folgendes:

    #include <stddef.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    void printMatrix(size_t size, float (*pmatrix)[size]);
    
    int main(void) {
      static float matrix[2][2] = { {1.2f, 1.3f}, {3.2f, 4.5f}};
      int size = 2;
    
      printMatrix(size, matrix);
    
      return 0;
    }
    
    void printMatrix(size_t size, float (*pmatrix)[size])
    {
      size_t x, y;
      for(y = 0; y < size; y++) {
        printf("\n");
        for(x = 0; x < size; x++) {
          printf("%f ", pmatrix[x][y]);
        }
      }
    }
    

    Wenn dein Compiler C99 nicht kann (etwa MSVC), wirst du die Adressierung wohl von Hand machen müssen (float *pmatrix; ... pmatrix[x * size + y]).

    Es ist wichtig zu verstehen, dass ein zweidimensionales Array ein Array von Arrays ist und kein Array von Zeigern.



  • static float** matrix = new float*[2];

    Ist das in Brainfuck geschrieben?



  • Doppelpointer finde ich jetzt nicht sooo ungewöhnlich. Das 2D-Array wird im Beispiel als Pointer auf einen Pointer erzeugt.

    Dynamisch könnte es so aussehen:

    float** matrix;
    matrix= new float*[cols];
    for (int loop = 0; loop < cols; loop++)
    matrix[loop] = new float[rows];
    


  • MaBa schrieb:

    Doppelpointer finde ich jetzt nicht sooo ungewöhnlich.]

    Schlecht geschlafen oder generell etwas verwirrt? Die Doppelpointer findet keiner schlimm, aber kein C-Compiler versteht deinen Code.
    🙂



  • Huch! Falsches Forum... Asche über mein Haupt.



  • MaBa schrieb:

    Huch! Falsches Forum... Asche über mein Haupt.

    Mach dir nichts daraus, passiert jedem hin und wieder.

    Fletscher2: MaBa's Vorschläge kannst du in C umsetzen, indem du man: malloc statt new verwendest.



  • Ein 2D-Feld so wie du es definiert hast ist kein PointerPointer.

    matrix entspricht der Adresse vom ersten Element [0][0] -> also nur ein einfacher Pointer.



  • Alles klar!
    Tausend Dank an euch!

    Gruß
    Fletscher



  • DirkB schrieb:

    Ein 2D-Feld so wie du es definiert hast ist kein PointerPointer.

    matrix entspricht der Adresse vom ersten Element [0][0] -> also nur ein einfacher Pointer.

    Unsinn. Ein Array ist kein Zeiger, ob es nun 1 oder mehrdimensional ist. Ausschließlich als Array deklarierte Funktionsargumente der 1. Dimension sind implizit Zeiger.



  • Wutz schrieb:

    Ein Array ist kein Zeiger,...

    Habe ich auch gar nicht behauptet. 🙂

    Wutz schrieb:

    Ausschließlich als Array deklarierte Funktionsargumente der 1. Dimension sind implizit Zeiger.

    Mit 'entspricht' meinte ich jenen Fall. (Nur nicht so schön ausgedrückt. 😞 )


Log in to reply