Erklärung eines kleinen Codebeispiels...



  • Was muss ich denn machen, um den Inhalt des Übergeben Arrays zu ändern?

    Ich will eine Getter-Methode für eine Klasse schreiben, welche ein Feld zurückliefert:

    class MeineKlasse
      private:
        int einFeld[3];
      public:
        int* getFeld(){return einFeld;};
    end;
    

    wenn ich dann aber sowas mache kommt ein Fehler:

    aIntFeld = Instanz.getFeld();

    ich habs auch schon damit veruscht:
    aIntFeld = ( (int[])Instanz.getFeld() );
    Das is wohl laut ANSI standard vrboten.

    Wie liefere ich den Inhalt eines Feldes zurück?



  • DerAnfänger2005 schrieb:

    Wie liefere ich den Inhalt eines Feldes zurück?

    Am besten so (Deklaration deiner Methode):

    getFeld(int * p_Feld);
    

    Du musst dann nur noch den Inhalt deiner Eigenschaft einFeld nach p_Feld kopieren.

    Da du aber hier C++ verwendest (mal davon abgesehen, dass du dazu im falschen Forum bist), warum verwendest du dann nicht die Standard-Container-Klassen von C++? Wie z. B. vector<>.



  • hmmm... Das hatte ich auch schon probiert. Gab auch was zurück...nur halt nicht das richtige...

    Wie muss ich den in der Funktion die Parameter an den Pointer übergeben? Vielleicht ist da mein Fehler.

    Ich hab bisher immer sowas gemacht:

    getFeld(int * p_Feld)
    {
      p_Feld = einFeld;
    }
    

    Ist das richtig so?

    PS: Ich will mit OpenGL arbeiten. Dafür brauch ich Arrays.



  • Nein so ist es nicht richtig, denn damit weißt du ja nur die Adresse von einFeld auf den lokalen Pointer p_Feld zu.

    Du musst wie gesagt, den Inhalt von einFeld an die Adresse, auf die p_Feld zeigt, kopieren:

    //zum Beispiel mit memcpy()
    memcpy(p_Feld, einFeld, sizeof(int) * 3); //sizeof(int) * 3 ist die Speichergröße in Byte, die dein Array einFeld belegt
    


  • 😮 So krass!?

    Geht das nur in ANSI C so kompliziert, oder ist das in C++ noch genauso?

    Also, ich sag mal ein Feld zurückliefern ist doch so grundlegend, dass es ohne externen Funktionsaufruf (memcpy) gehen muss.... 🙄



  • Du könntest bei deiner Variante natürlich auch casten:

    class MeineKlasse
      private:
        int einFeld[3];
      public:
        const int * getFeld() const {return (const int *)einFeld;};
    end;
    

    Das Casten ist aber immer mit Vorsicht zu genießen. Da sollte man schon wissen was man tut.

    Btw hab ich deinen Rückgabewert auch noch Konstant gemacht.

    Für dein eigentliches Problem könnte man auch noch anders vorgehen:
    Speichere deine Daten z. B. in einem vector<> und setze diesen um in ein Array, kurz bevor du die OpenGL-Funktion(en) nutzt, die das Array brauchen.

    Aber das hängt ganz davon ab wieviel du in deinem Code mit den Arrays machst und wie oft du OpenGL-Funktionen aufrufst, die das Array brauchen. Wenn es viele Aufrufe mit dem Array gibt, dann lass es so wie es ist.



  • Hmmm...soganz geht das auch net:

    class MeineKlasse
      private:
        int einFeld[3];
      public:
        int * getFeld() {return (int *)einFeld;};
    end;
    

    Irgendwann später:

    int color[3];
    
    color = ( (int[])EineInstanz->getFeld() ); //Hier Fehler!
    

    Und zwar sagt er:
    -error: ISO C++ forbids casting to an array type 'int[]'
    -error: incompatible types in assignement of 'int*' to 'int[3]'

    Das Leben ist so ungerecht....Es könnte alles soooo einfach sein 😞



  • Mir persönlich gefällt die gecastete Methode besser...nur wie gesagt gehts so net... Habt dz/ihr noch Ideen?



  • DerAnfänger2005 schrieb:

    Mir persönlich gefällt die gecastete Methode besser...nur wie gesagt gehts so net... Habt dz/ihr noch Ideen?

    Ja, so gehts nicht. Die Deklaration und Definition deiner Methode ist richtig, aber deine Verwendung und Zuweisung nicht.

    DerAnfänger2005 schrieb:

    Irgendwann später:

    int color[3];
    
    color = ( (int[])EineInstanz->getFeld() ); //Hier Fehler!
    

    Und zwar sagt er:
    -error: ISO C++ forbids casting to an array type 'int[]'
    -error: incompatible types in assignement of 'int*' to 'int[3]'

    Da meckert er natürlich rum!
    Wenn du deine Werte in das Array color[] kopieren willst, dann musst du meine erste Variante mit dem Parameter (ohne cast) verwenden. Wenn du es mit Zeiger und cast machen willst, dann muss das ganze so aussehen:

    int * color;
    ...
    color = EineInstanz->getFeld();
    

    DerAnfänger2005 schrieb:

    Das Leben ist so ungerecht....Es könnte alles soooo einfach sein 😞

    Du sagst es... (manchmal ist es aber auch einfacher als man denkt ;))



  • Wenn du deine Werte in das Array color[] kopieren willst, dann musst du meine erste Variante mit dem Parameter (ohne cast) verwenden.

    Also die memcpy() Sache... hmmm

    Wenns denn unbedingt sein muss... (In Delphi geht sowas irgendwie...flüssiger 😉 )



  • Du kannst es aber auch mit int * color probieren. Wäre auf jeden Fall weniger Speicherintensiv (wobei das bei 3 Elementen noch relativ egal ist).



  • Ich sollte vielleicht noch erwähnen, dass das Color beschaffen relativ zeitkritisch ist.

    Wenn ich 100 OpenGL Objekte habe und für jedes die Farbe hohlen muss, wärs schon schön, wenns flott ginge. Wie schnell ist den memcpy in dieser Hinsicht?



  • AJ schrieb:

    Du kannst es aber auch mit int * color probieren. Wäre auf jeden Fall weniger Speicherintensiv (wobei das bei 3 Elementen noch relativ egal ist).

    Hmmm...eigentlich könnte das funktionieren... Man kann halt nur nicht so konfortabel auf die Elemente zugreifen...



  • DerAnfänger2005 schrieb:

    AJ schrieb:

    Du kannst es aber auch mit int * color probieren. Wäre auf jeden Fall weniger Speicherintensiv (wobei das bei 3 Elementen noch relativ egal ist).

    Hmmm...eigentlich könnte das funktionieren... Man kann halt nur nicht so konfortabel auf die Elemente zugreifen...

    Sicher? 😃

    Probiers hald mal aus:

    ...
    int arr[3] = { 1, 3, 5 };
    int * ptr = arr;
    
    printf("%i = %i", arr[1], ptr[1]); // oder cout << arr[1] << " = " << ptr[1];
    ...
    

    DerAnfänger2005 schrieb:

    Ich sollte vielleicht noch erwähnen, dass das Color beschaffen relativ zeitkritisch ist.

    Wenn ich 100 OpenGL Objekte habe und für jedes die Farbe hohlen muss, wärs schon schön, wenns flott ginge. Wie schnell ist den memcpy in dieser Hinsicht?

    Wenn es zeitkritisch ist, dann solltest du so wenig wie möglich kopieren. memcpy() dürfte eine der schnellsten Varianten sein etwas von einem Speicherbereich zum anderen zu kopieren.



  • Habs ausprobiert und geht wie ich es mir vorgestellt habe.

    Danke! Du hast mir sehr geholfen. 👍



  • So...ich hab nochmal ne Frage:

    Ich bekomme ja jetzt den Pointer auf mein Feld. Jetzt möchte ich gerne Daten auslesen, aber irgendwie scheiter ich da:

    (Sender->getColor())[0] == 0.7)
    

    und

    Sender->getColor()[0] == 0.7)
    

    scheinen beide nicht richtig zu sein.

    Wie gehts richtig?



  • Könnte einer von euch mein Flehen erhören und eine Lösung sagen? Ich steh immer noch aufm schlauch...



  • Ich hab das

    GLflaot color[3];
    
    GLfloat* getColor() {return (GLfloat*)color;};
    

    Mit

    ( (GLfloat)Sender->getColor() )[0] == 0.7
    

    bekomme ich

    error: ISO C++ forbids casting to an array type 'GLfloat[]'
    

    Och menno...ich will doch nur testen, ob der x-te Wert im Feld gleich irgendwas ist...


Anmelden zum Antworten