[C++] Klassenvariable an andere Klasse übergeben (2D Array)

  • Ich fange langsam echt an an C++ zu verzweifeln ...
    Also, folgendes, erstmal der Code.

    Also, zuerst wird in der Klasse gameClass eine Instanz der Klasse calculateMoveClass angelegt.
    Nun versuche verzweifelt über den Konstruktor einen Referenz oder einen Pointer (ist mir eigentlich egal, welches von beiden) an die Funktion init() der Klasse calculateMoveClass zu übergeben.

    Google spuckte nach einigem Suchen folgendes aus.

    Code
    void test( int* t ) {
      t[0] = 1;
      t[1] = 2;
    }

    Ok, versuchen wir das mal.

    Zitat

    /opt/progs/c++/messalla/src/game.h:48: Fehler: keine passende Funktion für Aufruf von »calculateMoveClass::init(short int [2][6])«
    /opt/progs/c++/messalla/src/calculateMove.h:27: Anmerkung: Kandidaten sind: void calculateMoveClass::init(short int*)

    Das sagt mir, dass der Funktionsaufruf nicht zur Funktion passt.
    Wie schaffe ich es nun, diesen Pointer (oder die Referenz) in der andere Funktion zu haben?

    Post Scriptum:
    Bitte nicht über evtl. chaotischen Code meckern, ist nunmal mein Stil =)

  • Also, die Sache ist eigentlich ganz einfach, du hast wahrscheinlich nur bei den Pointern noch kleinere Defizite.

    Dein Problem ist, dass die Funktion calculateMoveClass::init einen Pointer auf den primitiven Typ "short" erwartet. Du übergibst aber der Funktion einen Pointer der wiederrum auf einen Pointer auf den primitiven Typ short zeigt.

    Hier mal der Hinweis:

    Code
    short points[...][...];
    // ist nichts anderes als
    short* points[...];
    // oder
    short** points;
    /* mit _einem_Unterschied_
     * du holst dir mit den eckigen Klammern und einer Zahl darin
     * direkt Speicher, was du bei short** points nicht tust
     */

    Wenn du das verstanden hast, brauchst du nur die Methode so anpassen:

    Code
    void calculateMoveClass::init(short** points)
    {
       // do something
    }

    Und schon sollte es funktionieren.
    Aber Vorsicht: wenn du die Größe der Matrize nicht übergibst, musst du aufpassen nicht über die Grenzen zu laufen. Auf gut deutsch, dass hier darfst du nicht:

    Code
    void calculateMoveClass::init(short** points)
    {
       points[2][6] = ... // falsch
       points[1][5] = ... // richtig, "letztes" Element
       points[0][0] = ... // richtig, "erstes" Element
       // oder anders rum
       ... = points[1][3];
    }
  • Ja, du hast recht, ich bin mit der Pointersache noch nicht so richtig vertraut :)
    Ersteinmal vielen Dank, dass du dir die Zeit nimmst und versuchst mir zu helfen.
    Leider läuft das ganze so auch nicht :(

    Zitat

    /opt/progs/c++/messalla/src/game.h:48: Fehler: keine passende Funktion für Aufruf von »calculateMoveClass::init(short int [2][6])«
    /opt/progs/c++/messalla/src/calculateMove.h:53: Anmerkung: Kandidaten sind: void calculateMoveClass::init(short int**)

    Hast du noch eine andere Idee?

  • Ok, hab da ein bisschen Müll erzählt.

    Ich hab das gerade mal ausprobiert, und so wie es aussieht braucht der Compiler bei einer solchen statischen Matrix die Größe. Es reicht also nicht "short** variable" zu übergeben, sondern die Größe muss mit angegeben werden: "short variable[2][6]".
    Dann funktioniert das problemlos.

    Komischerweise funktioniert es bei einem normalen Array auch ohne die Größe:

    Also ich weiß jetzt auch nicht genau warum der Compiler bei einer Matrix die Größe benötigt. Muss ich mich mal informieren...

  • Ok, thx, leider wird das dann ja nicht als Pointer übergeben, oder?
    Ich brauch das ganze aber als Pointer, das ist das Problem ...

    Edit:
    Juhu !!! Ich habs hinbekommen, läuft nun über eine Referenz und ein Typedef.
    Hier die Lösung für alle Interessierten.

    Code
    typedef short tPoints[2][6];
    
    
    /* ... */
    public:
    	tPoints points; // Points of each player
    
    
    /* ... */
    void calculateMoveClass::init(tPoints &points)

    Trozdem Vielen, Vielen Dank für deine Hilfe.