Übergabe von mehrdimensionalen Feldern



  • Hallo!

    Ich habe einen Fehler bei der Übergabe eines 2-d Feldes an eine Fkt.

    Irgendwas scheint am Übergabeformat nicht zu stimmen.
    Aber was bitte ist falsch: int tabelle[7] [7] ist wohl vom Typ int** und die Startadresse des Arrays liegt doch auf tabelle.
    Ich versteh also echt nicht was da nicht passt!

    Grüße,
    Harri

    void mischen(int**);
    
    void _main(void)//nicht aufregen, das Programm ist nicht fürn PC, daher void _main
    {
    //...
    int tabelle[7][7];
    mischen(tabelle);
    //...
    }
    
    void mischen(int **tabelle)
    {
    	int i=0, j=0;
    	randomize();
    
    	for(i=0;i<MAX;i++)//MAX=7
    	{
    		for(j=0;j<MAX;j++)
    		{
    			tabelle[i][j]=random(5);
    		}
    	}
    }
    


  • void mischen(int tabelle[7][7])
    

    zweite 7 kann auch wegbleiben. stimmt schon, int**!=int[7][7]



  • auch wenn das array zweidimensional wird bleibt das ein normaler pointer !



  • jop.
    bei mehr dimensionalen arrays wird die letzte dimension zuerst in den speicher abgelegt

    schreibe einfach mal ein 2D array mit int werden voll und sie dir dass im speicher an.

    daher muss deine funktion wissen wie gross die letzte dimension ist, sonst weiss sie ja nicht wann die erte zeile ferig ist.

    achja, du hast einen Pointer auf einen Pointer deklariert
    das kommt im zusammenhang mit arrays schon vor aber nur dann wenn du ein array voll mit pointern hast, und einen pointer der auf ein element dieses arrays zeigt.



  • Aber was bitte ist falsch: int tabelle[7] [7] ist wohl vom Typ int** und die
    Startadresse des Arrays liegt doch auf tabelle.
    Ich versteh also echt nicht was da nicht passt!

    Das Problem was du bei der Übergabe hast ist das das 2 dim. Feld in einen "Pointer auf ein Array" zerfällt. Sprich in "int (*tabelle)[7]". Deshalb meckert der Compiler. Da die Deklaration von Arrays und Pointern nix gemeinsam haben. Ein Pointer ist ein "Zeiger auf einen Typ T" und ein Feld ist eine "Reihung von Daten vom Typ T". Der Feldname steht hierfür den Ort im Speicher wo es Platz für eine bestimmte Menge von Daten gibt( schon reserviert!) und ist gleichzeitig die Adresse des ersten Elementes. Der Pointer hingegen ist eine Variable, die auf ein zusammenhängendes oder einzelnes Stück Speicher zeigen kann, dem aber explizit noch eine Adresse zugewiesen werden muss.
    Ehrlich gesagt weiß ich nicht ob dir das jetzt was bringt. 😉 Es hilft im C Standard nachzulesen, was ein Array und einen Pointer ausmacht. Was ein veränderbarer lvalue ist etc.
    Die FAQ der de.comp.lang.c kannst du auch noch zu rate ziehen da steht glaube ich dazu was drinnen.

    bye

    tt



  • Danke für die Antowrten.
    Leider weiß ich immer noch nicht wie ich nun d. Array übergeben soll.
    Als int* kann ich es nicht übergeben, weil ich dann nicht auf die 2. Dimension zugreifen kann.

    Wie soll ichs denn nun anstellen?

    EDIT: Mensch Harry, du bist blind 😃
    Schon in der ersten Antwort steht ja die Lösung.

    Aber trotzdem: Kennt jmd. von ecuh ein gutes Tut. wo etwas über mehrdim. Felder steht?
    Achja, nochwas: bei Strings würde die Schreibweise char** aber schon stimmen, oder???

    Grüße,
    Harri



  • Hallo!

    Du übergibst der Funktion einen Zeiger auf ein zweidimensionales Array.
    So müste es gehen:

    #define MAX 7
    
    void mischen(int *tabelle[][]);
    
    void _main(void)//nicht aufregen, das Programm ist nicht fürn PC, daher void _main
    {
    //...
    int tabelle[MAX][MAX];
    mischen(tabelle);
    //...
    }
    
    void mischen(int *tabelle[][])
    {
        int i=0, j=0;
        randomize();
    
        for(i=0;i<MAX;i++)//MAX=7
        {
            for(j=0;j<MAX;j++)
            {
                tabelle[i][j]=random(5);
            }
        }
    }
    

    Gruß
    Michael


Anmelden zum Antworten