Return C Array

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Return C Array

    Hallo Entwickler,

    wie kann ich ein C Array übergeben?

    Warum funktioniert dieser Code nicht?

    Quellcode

    1. + (GLfloat[24])cubeVertices
    2. {
    3. GLfloat fCubeVertices[24] = {-1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0};
    4. return fCubeVertices;
    5. }
  • Du wurdest schon einmal darauf hingewiesen, dass dies array auf dem Stack liegt, und daher nicht zurückgegeben werden kann.

    Lösung (unschön):

    Quellcode

    1. GLfloat *ret = (GLfloat)malloc(sizeof(fCubeVertices));
    2. memcpy(ret, fCubeVertices, sizeof(fCubeVertices));
    3. return ret;


    Das zurückgegebene Array muss dann mit free() wieder freigegeben werden!

    Das sind C Grundlagen! Bitte lies Dich da etwas ein ;)
    C++
  • Wie kann man eine "schöne" Lösung machen?

    Mein Anliegen:
    Eine Klasse GeometryObject soll bei der Initialisierung ein Array füllen.
    Eine Klasse ShapeManager liefert das Array.

    Quellcode

    1. fVertices = [ShapeManager cubeVertices];


    @zerm
    Würdest du dann die Methode zu cubeVertices:(GLfloat *)fVertices umschreiben und das Array als Parameter übergeben?
    Und dann ein neues Array mit den Werten erzeugen und per memcpy() in das übergebene kopieren?
  • Vyax schrieb:

    Wie kann man eine "schöne" Lösung machen?

    Mein Anliegen:
    Eine Klasse GeometryObject soll bei der Initialisierung ein Array füllen.
    Eine Klasse ShapeManager liefert das Array.

    Quellcode

    1. fVertices = [ShapeManager cubeVertices];


    @zerm
    Würdest du dann die Methode zu cubeVertices:(GLfloat *)fVertices umschreiben und das Array als Parameter übergeben?
    Und dann ein neues Array mit den Werten erzeugen und per memcpy() in das übergebene kopieren?


    packs doch in eine iVar und returne die dann (dann ist es halt keine klassenmethode aber das sollte ja kein problem sein oder?)
  • Du willst die Werte ja wahrscheinlich nicht verändern. Darum spricht doch nichts dagegen, irgendwo das Array als const zu definieren.

    Ich brauchen relativ häufig ein Quad - da hab ich dann meist eine Methode, die mir gleich ein VBO erstellt und das Vertex-Array nur lokal hält.

    Ansonsten ist halt malloc/free hässlich. Glücklicherweise habe ich ja C++ aber in Deinem Fall von C/Obj-C fällt mir da auch nichts besseres ein - Also wenn Du das Array öfter brauchst und jedesmal modifizieren willst, ist mein Vorschlag wahrscheinlich wirklich die beste Möglichkeit.

    PS: Returnvalue als GLfloat[24] geht ned, musst GLfloat* zurückgeben.
    PPS: Ich bin mir grade nicht sicher, ob ideone.com/cpWUk akzeptabel wäre, in C++ habe ich denke ich einige Verrsprechen bzgl const-refs auf temporaries, in C bin ich mir nicht sicher. Weiss das jemand?
    C++
  • @TE, um es kurz zusammen zu fassen:

    - Du willst 3D-Grafik mit OpenGL machen
    - Speichermanagement im Stil von C mit malloc/free ist eklig, das willst Du nicht
    - die Cocoa-Collections eignen sich überhaupt nicht für OpenGL
    - die C++-Container sind für so etwas wie gemacht, das Speichermanagement erfolgt automatisch

    Jetzt hast Du verschiedene Möglichkeiten: Du benutzt ein Highlevelframework, lernst trotzdem die C-Grundlagen oder Du lernst C++.

    Die Vorgehensweise mit C++: Du erstellst Dir Klassen für das Buffermanagement, die Speicherung der Vertexdaten erfolgt in einer STL-Collection (vector) und wenn Du den OpenGL-Buffer befüllst, übergibst Du die Adresse des ersten Elements.

    Quellcode

    1. typedef std::vector<VertexPODType> MyVertexArray;

    Jetzt schlägst Du zwei Fliegen mit einer Klappe: Du brauchst Dich nicht um das Speichermanagement und das Mitwachsen des Arrays zu kümmern (einfach push_back benutzen) und hast trotzdem einen C-Zeiger auf die Daten (&myArray[0]).
    Dass STL-Array kannst Du dann ganz bequem mit Referenzen oder einem Smartpointer herumreichen. Hm, das sind sogar drei Fliegen...

    Gruß, Markus

    P.S.: C++ ist wie Klavier spielen, es dauert ewig, bis man es kann, aber wenn Du einmal soweit bist...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Markus Müller ()

  • Markus Müller schrieb:

    - die Cocoa-Collections eignen sich überhaupt nicht für OpenGL

    Wieso nicht?

    Ich kann mir nicht vorstellen, dass sein Projekt so unglaublich riesig und anspruchsvoll wird, dass [[collection nsNumberObject] floatValue]; spürbare Performanceeinbußen verursachen wird.

    Markus Müller schrieb:

    P.S.: C++ ist wie Klavier spielen, es dauert ewig, bis man es kann, aber wenn Du einmal soweit bist...

    Ich bleibe bei der Violine.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • gritsch schrieb:

    Vyax schrieb:

    Mal eine Frage.

    Wird ein mit malloc() erzeugtes Array, das @property eines Objektes ist automatisch aufgelöst, wenn das Objekt aufgelöst wird?


    wenn du das free korrekt implemenentiert hast im dealloc.

    Was ist daran noch bezüglich des C-Arrays automatisch?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Lucas de Vil schrieb:

    Markus Müller schrieb:

    - die Cocoa-Collections eignen sich überhaupt nicht für OpenGL

    Wieso nicht?

    Ich kann mir nicht vorstellen, dass sein Projekt so unglaublich riesig und anspruchsvoll wird, dass [[collection nsNumberObject] floatValue]; spürbare Performanceeinbußen verursachen wird.

    Markus Müller schrieb:

    P.S.: C++ ist wie Klavier spielen, es dauert ewig, bis man es kann, aber wenn Du einmal soweit bist...

    Ich bleibe bei der Violine.


    weil es viel komplizierter und länger ist.

    array.at(0) bzw array[0] ist doch einiges kürzer als [[array objectAtIndex:0] floatValue]. vor allem beim reinschreiben: [array replaceObjectAtIndex:0 withObject:[NSNumber numberWithFloat:0.0]]
  • Amin Negm-Awad schrieb:

    gritsch schrieb:

    Vyax schrieb:

    Mal eine Frage.

    Wird ein mit malloc() erzeugtes Array, das @property eines Objektes ist automatisch aufgelöst, wenn das Objekt aufgelöst wird?


    wenn du das free korrekt implemenentiert hast im dealloc.

    Was ist daran noch bezüglich des C-Arrays automatisch?


    keine ahnung was er mit automatisch meint.
    wenn du aber iVar = malloc() schreibst dann reicht im dealloc eben in free() aus. oder was erwartet er?
  • gritsch schrieb:

    Amin Negm-Awad schrieb:

    gritsch schrieb:

    Vyax schrieb:

    Mal eine Frage.

    Wird ein mit malloc() erzeugtes Array, das @property eines Objektes ist automatisch aufgelöst, wenn das Objekt aufgelöst wird?


    wenn du das free korrekt implemenentiert hast im dealloc.

    Was ist daran noch bezüglich des C-Arrays automatisch?


    keine ahnung was er mit automatisch meint.
    wenn du aber iVar = malloc() schreibst dann reicht im dealloc eben in free() aus. oder was erwartet er?

    Er erwartet mutmaßlich, dass es wie bei jeder anderen Property mit ARC automatisch gelöscht wird. Selbst gemacht ist ja nicht automatisch.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • gritsch schrieb:

    Lucas de Vil schrieb:

    Markus Müller schrieb:

    - die Cocoa-Collections eignen sich überhaupt nicht für OpenGL

    Wieso nicht?

    Ich kann mir nicht vorstellen, dass sein Projekt so unglaublich riesig und anspruchsvoll wird, dass [[collection nsNumberObject] floatValue]; spürbare Performanceeinbußen verursachen wird.

    Markus Müller schrieb:

    P.S.: C++ ist wie Klavier spielen, es dauert ewig, bis man es kann, aber wenn Du einmal soweit bist...

    Ich bleibe bei der Violine.


    weil es viel komplizierter und länger ist.

    array.at(0) bzw array[0] ist doch einiges kürzer als [[array objectAtIndex:0] floatValue]. vor allem beim reinschreiben: [array replaceObjectAtIndex:0 withObject:[NSNumber numberWithFloat:0.0]]

    Streamlined Objects ab LLVM 4 …
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • zerm schrieb:

    Lucas de Vil schrieb:

    Ich kann mir nicht vorstellen, dass sein Projekt so unglaublich riesig und anspruchsvoll wird, dass [[collection nsNumberObject] floatValue]; spürbare Performanceeinbußen verursachen wird.

    OpenGL API Funktionen erwarten einen Pointer auf ein GLfloat Array. Willst Du Dein NSArray jedesmal durchlaufen und in ein C-Array umwandeln dafuer?

    -getValue: (NSValue)
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?