Return C Array

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

  • Markus
    Klar, sobald ich mich damit auseinandersetzen muss lese ich was Einführendes. :)
    Doch bis dahin: auch die Umwandlung eines NSArray in ein C-Array nur zum Weitergeben an die OpenGL API Funktionen wird nicht signifikant einschränken. :P

    zerm
    Nein.
    Ich will mit reinen C-Arrays, Instanzvariablen, malloc() im Setter und free() im Dealloc arbeiten.
    Beziehungsweise würde es wollen. Den Umweg über C++ finde ich albern.
    (Ob ich jetzt -retain und -release oder malloc() und free() eintippe ist doch echt wurscht.)

    Amin
    AFAIK wird NSValue mit dem C-Array oder dem Struct nicht in die Speicherverwaltung eingreifen.
    Mit [NSValue valueWithPointer:&structPointer];, [NSValue valueWithNonretainedObject:&structPointer]; oder [NSValue value:&structPointer withObjCType:@encode(void *)]; wird nur die Referenz zugewiesen.
    Um das Memory Management des übergebenen Pointers muss man sich dennoch selbst kümmern.
    «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
  • Darf ich auch mal was sagen?

    Quellcode

    1. 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};
    2. NSValue *v = [NSValue valueWithPointer:fCubeVertices];
    3. fVertices = [v pointerValue]; // @property(assign) GLfloat *fVertices


    Wenn ich im Debugger nachsehe ist kein Wert in fVertices.
  • Lucas de Vil schrieb:


    Amin
    AFAIK wird NSValue mit dem C-Array oder dem Struct nicht in die Speicherverwaltung eingreifen.
    Mit [NSValue valueWithPointer:&structPointer];, [NSValue valueWithNonretainedObject:&structPointer]; oder [NSValue value:&structPointer withObjCType:@encode(void *)]; wird nur die Referenz zugewiesen.
    Um das Memory Management des übergebenen Pointers muss man sich dennoch selbst kümmern.

    Und wozu übergibt man dann das Encoding?
    Probier es mal und durchdenke das.
    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"?
  • Vyax schrieb:

    Darf ich auch mal was sagen?

    Quellcode

    1. 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};
    2. NSValue *v = [NSValue valueWithPointer:fCubeVertices];
    3. fVertices = [v pointerValue]; // @property(assign) GLfloat *fVertices


    Wenn ich im Debugger nachsehe ist kein Wert in fVertices.

    Wie der Name -valueWithPointer: zum Ausdruck bringt, speicherst du dann auch einen Pointer. Das ist dann wie in C By-Reference. Du musst einen Value speichern, dann ist es auch By-Value:
    NSValue *value = [NSValue initWithBytes:myVerticesArray objCType:@encode(int[24])];

    int *array2;
    [value getBytes:array2];

    BTW: Die dritte Möglichkeit, die in Objective-C/Cocoa nicht einfällt, ist NSData. Man muss nur über ausreichend Unkenntnis verfügen, dann fällt einem nichts Besseres ein.
    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"?
  • Es gibt kein initWithBytes:objCType: und auch kein getBytes:

    Quellcode

    1. NSValue *value = [NSValue valueWithBytes:fCubeVertices objCType:@encode(GLfloat[24])];
    2. [value getValue:fVertices];


    Bei getValue: bekomm ich ein EXC_BAD_ACCESS.
    Es ist schlimm, dass fVertices ein GLfloat * ist?
  • Vyax schrieb:

    Es gibt kein initWithBytes:objCType: und auch kein getBytes:

    developer.apple.com/library/ma…e/initWithBytes:objCType:

    Und du wunderst dich echt noch über die 'Qualität' der Hilfe? :rolleyes:

    Aber ja, es gibt kein getBytes:
    Ist es da so schwer von allein auf getValue: zu kommen, wenn die Methodensignatur fast vorgekaut wurde? 8|
    «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
  • Amin Negm-Awad schrieb:

    NSValue *value = [NSValue initWithBytes:myVerticesArray objCType:@encode(int[24])];

    Kopiert der? Ich muss mal bei Gelegenheit die Doku lesen. Danke fuer den Hinweis.

    Vyax schrieb:

    Darf ich auch mal was sagen?

    Quellcode

    1. 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};
    2. NSValue *v = [NSValue valueWithPointer:fCubeVertices];
    3. fVertices = [v pointerValue]; // @property(assign) GLfloat *fVertices


    Wenn ich im Debugger nachsehe ist kein Wert in fVertices.

    Und wieder bleibt fCubeVertices auf dem Stack. Der Pointer ist nach Ende des Scopes nicht mehr gueltig.
    C++
  • Vyax schrieb:

    Ich bin doch auf getValue: gekommen, aber ich bekomme ein EXC_BAD_ACCESS an dieser Stelle.

    Nein.

    C-Quellcode

    1. 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};
    2. NSValue *value = [NSValue valueWithBytes:fCubeVertices objCType:@encode(GLfloat[24])];
    3. GLfloat fVertices[24];
    4. [value getValue:fVertices];
    5. NSLog(@"Value... %f", fVertices[3]);

    2012-07-24 13:24:23.232 DemoApplications[2009:503] Value... 1.000000


    Läuft. Du machst also irgendetwas verkehrt und hast es nicht einmal nötig, uns den dazugehörigen Code zu zeigen.
    I'm off.

    zerm
    Gute Frage. Irgendwas tut es.
    An initialized NSValue object that contains value, which is interpreted as being of the Objective-C type type. The returned object might be different than the original receiver.
    «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
  • Quellcode

    1. GLfloat fVertices[24];
    2. [value getValue:fVertices];


    Das funktioniert, aber das Array soll eine variable Größe haben.

    Quellcode

    1. @property(assign) GLfloat *fVertices;
    2. [value getValue:fVertices];
  • C-Arrays, variable Größe, ohne malloc(), memcpy() und Ähnlichem? Is klar. :pinch:
    (und wann hattest du vor, uns dieses winzig kleine nahezu unwichtige Detail mitzuteilen? 8|)
    «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
  • Hab ich doch gesagt.
    Und in vorherigen Posts hab ich auch angegeben, dass fVertices ein GLfloat * ist.

    Quellcode

    1. NSValue *value = [NSValue valueWithBytes:fCubeVertices objCType:@encode(GLfloat[24])];
    2. GLfloat f[24];
    3. [value getValue:f];
    4. fVertices = malloc(sizeof(fCubeVertices));
    5. memcpy(fVertices, fVertices, sizeof(fCubeVertices));


    So, jetzt gehts.
  • zerm schrieb:

    Amin Negm-Awad schrieb:

    NSValue *value = [NSValue initWithBytes:myVerticesArray objCType:@encode(int[24])];

    Kopiert der? Ich muss mal bei Gelegenheit die Doku lesen. Danke fuer den Hinweis.[…]

    Ja, deshalb benötigt er ja das Encoding. Daraus ermittelt er die Größe.

    Quellcode

    1. int array[5];
    2. array[4]=98;
    3. NSValue *value = [NSValue valueWithBytes:array objCType:@encode(int[5])];
    4. array[4]=11; /////////
    5. int array2[5];
    6. [value getValue:array2];
    7. NSLog( @"%d", array2[4]);

    -> 98
    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"?
  • Vyax schrieb:

    Muss man auch die Arrays, die ohne malloc() erzeugt wurden mit free() freigeben?

    Wie erzeugst du sie denn ohne malloc()?

    Es gibt grundsätzlich immer die Möglichkeit, dass eine C-Funktion etwas herausgibt, welches von dir freigegeben werden muss. C kennt ja keinen Autorelease-Pool und auch keine Smart-Pointer und Automatic-Reference-Counting läuft auch nicht auf C.

    Das ergibt sich im Zweifelsfall aus der Doku.
    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:

    Vyax schrieb:

    Es gibt kein initWithBytes:objCType: und auch kein getBytes:

    developer.apple.com/library/ma…e/initWithBytes:objCType:

    Und du wunderst dich echt noch über die 'Qualität' der Hilfe? :rolleyes:

    Aber ja, es gibt kein getBytes:
    Ist es da so schwer von allein auf getValue: zu kommen, wenn die Methodensignatur fast vorgekaut wurde? 8|

    Zumal ich es schon im Thread zitiert hatte …

    Aber in meinem Beispiel fehlt in der Tat das alloc bzw. ich hätte den CA verwenden müssen. Halt "Typed in Safari". So viel Transferleistung erwarte ich allerdings wirklich vom OP.
    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"?
  • Vyax schrieb:

    Hab ich doch gesagt.
    Und in vorherigen Posts hab ich auch angegeben, dass fVertices ein GLfloat * ist.

    Quellcode

    1. NSValue *value = [NSValue valueWithBytes:fCubeVertices objCType:@encode(GLfloat[24])];
    2. GLfloat f[24];
    3. [value getValue:f];
    4. fVertices = malloc(sizeof(fCubeVertices));
    5. memcpy(fVertices, fVertices, sizeof(fCubeVertices));


    So, jetzt gehts.

    Wozu der memcpy()? Übrigens ist es einerlei, ob es int oder float ist.
    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"?