array referenz an Methode



  • Schönen guten Tag,

    ich versuche die Referenz dieses Arrays -" int feld[7][4][2] "- an eine Methode zu übergeben.
    Ich habe es so versucht:

    int feld[7][4][2];
    // Initialisierung des feldes...
    // ...
    int result = methode(&feld);
    

    der Methodenkopf sieht so aus;

    int methode(int *f);
    

    Die Fehlermeldung ist folgende:

    error C2664: 'CMyEventReceiver::CMyEventReceiver(irr::core::position2d<T> *,int *)' : cannot convert parameter 2 from 'int (*__w64 )[7][4][2]' to 'int *'

    Ich habe leider keine Idee wie es besser geht.
    Kann mir jemand helfen?



  • Ne du versucht eine Adresse zu uebergeben.

    &feld[0][0][0] // das ist die Adresse des ersten ints!
    


  • Danke, damit ist zumindest die Fehlermeldung weg.

    Und wie kann ich nun damit weiterarbeiten?
    Zumindest kann ich in der methode nicht f[0][1][2] nutzen

    error C2109: subscript requires array or pointer type



  • @Thomas: Das ist keine Lösung, sondern bestenfalls ein Workaround um das Problem herum.

    @Staati: Eindimensionale Arrays können als Pointer angesprochen/konvertiert) werden, bei mehrdimensionalen Arrays geht das nicht mehr (das hängt mit den technischen Gegebenheiten der Pointer-Arithmetik und der Speicheraufteilung von Arrays zusammen). Damit deine Funktion so ein Array schluckt, benötigt sie einen passenden Prototyp:

    int methode(int* val[7][4]);
    

    (mit Thomas' Ansatz erhältst du einen nackten Zeiger auf den Speicherbereich des Arrays - und mit dem Wissen, daß die einzelnen Zeilen deines Arrays hintereinander abgelegt werden, könntest du dich dort durchhangeln)



  • Danke für die Antwort.
    Könntest du mir ein Beispiel posten? Ich versteh nicht ganz wie du das meinst.



  • Naja das kann man nicht sagen was hier sinnvoll ist, wenn man nicht die Aufgabe kennt. Ich halte es im Allgemeinen nie fuer sinnvoll Arrays mit mehr als 2 Dimensionen zu erstellen.
    Koennt ja auch sein, dass die Methode bewusst den Speicher linear interpretieren soll... [was nicht der Fall ist was der letzte Post des OP zeigt]



  • typedef int (*ptr)[4][2];
    int methode(ptr feld)          // feld  ist ein Zeiger (ptr) oder int(*)[4][2]
    {
            feld[0][0][0] = 7;    // Damit schreibst Du 7 ins Feld[0][0][0] ausserhalb der methode!
            return feld[0][0][0]; // 7 wird zurückgegeben, 7 stammt aus Feld ausserhalb der Methode 
    }        
    
    int main()
    {
    
            int feld[7][4][2]; 
    	int a =  methode(feld);
    
            return 0;
    }
    

    🙂



  • Danke!

    Nun habe ich aber ein neues Problem 🙂
    Ich habe hier im Forum diesen Code-Schnipsel gefunden:

    int main()
    {
        // Einen Zeiger auf ein Int-Array mit 5 Elementen anlegen
        int (*pArr)[5] = 0;
    
        // Den Zeiger auf ein zweidimensionales Array zeigen lassen.
        // Wichtig: Die zweite Dimension muss mit der Array-Größe
        // übereinstimmen, mit der der Zeiger deklariert wurde
        // pArr = new int [5][2]; wäre z.B. illegal, da ein Zeiger auf ein
        // Array mit 5 Elementen nicht in einen Zeiger auf ein Array mit
        // 2 Elementen konvertiert werden kann.
        pArr = new int[2][5];
        pArr[0][0] = 42;
        // ...
        // Am Ende aufräumen nicht vergessen
        delete [] pArr;
    }
    

    Geht das mit 3 dimensionalen Arrays?
    Ich würde gerne aus dem Array das ich am Anfang definiert habe

    int field[7][4][2];
    

    später im Programm nach bedarf:

    field[7][2][4];
    

    machen...

    Ich weiss mehrdimensionale arrays sind wahrscheinlich ne schlechte Lösung, und ich hätte nen vector nehmen sollen, aber nu is der Weg zurück länger als wenn ich es so weitermache..


Log in to reply