Arrays, Pointer, usw.



  • Hallo.
    Habe hier ein kleines Problem: Wie übergebe ich mehrdimensionale Arrays von Pointern? Bzw. wie soll man dann auf die Elemente in einer Funktion zugreifen?
    Hab hier mal ein wenig Code gemacht:

    #include <iostream>
    #include <math.h>
    void bla(int x,int y,int *** blab)
    {
    	for(y; y>=0; y--)
    	{
    		for(x; x>=0; x--)
    		{
    			printf(" %d ", *blab[y][x]);
    		}
    		printf("\n", NULL);
    	}
    }
    
    int main()
    {
    	int *jo[20][15];
    	int xyz[20][15];
    	for(int y = 0; y<20; y++)
    		for(int x = 0; x<15; x++)
    		{
    			xyz[y][x] =(int) sqrtf((y+x)*(y-x));
    			jo[y][x] = &xyz[y][x];
    		}
    
    	bla(15,20,(int***) jo);
    	return 0;
    }
    

    sollte doch eigentlich klappen 😞



  • Azrael, il Meraz schrieb:

    sollte doch eigentlich klappen 😞

    Ja, nein... was war nochmal die Frage?

    Nö, im Ernst: Probiers erst mal mit bla(int *ptr); dann mit bla(int **Ptr); und ausgeben mit printf("ptr %p\n", ptr[0]); usw.


  • Mod

    arrays sind keine pointer.

    void bla(int x,int y,int *(*blab)[15]);
    

    oder

    void bla(int x,int y,int *blab[][15]);
    

    und vergiss den cast.



  • camper schrieb:

    arrays sind keine pointer.

    void bla(int x,int y,int *(*blab)[15]);
    

    oder

    void bla(int x,int y,int *blab[][15]);
    

    und vergiss den cast.

    Die Lösung ist dann aber nicht mehr so dynamisch 😞 . Hängt das damit zusammen, dass der Compiler wissen muss, wie lang die Zeilen sein sollen?
    Gibt es keine andere möglichkeit?

    dabei dachte ich immer,
    a[b][c]
    wäre dasselbe wie
    ((a+b)+c)


  • Mod

    Azrael, il Meraz schrieb:

    dabei dachte ich immer,
    a[b][c]
    wäre dasselbe wie
    ((a+b)+c)

    Das ist es auch. Aber denk einfach mal über den Typ des Ausdrucks *(a+b) nach. C kennt eigentlich keine mehrdimensionalen arrays, stattdessen können die Elemente eines Arrays selbst Arrays sein...



  • deswegen dachte ich, dass meine version klappen würde - dass er die länge nicht braucht, weil das ja ein array von pointer ist. Ist wohl aber nicht so...



  • umgebaut (ungetestet) versuch mal so, den 'int *jo[20][15]' brauchste eigentlich nicht:

    void bla (int x,int y, void *blab)
    {
        int s;
        for (s=0; s<(x*y); s++)
            printf ("%d ", ((int*)blab)[s]);
    }
    
    int main()
    {
        int xyz[20][15];
        int y, x;
        for(x = 0; x<20; x++)
            for(y = 0; y<15; y++)
                xyz[x][y] = (int) sqrtf((y+x)*(y-x));
        bla(20,15,xyz);
        return 0;
    }
    

Anmelden zum Antworten