struct in NSMutableArray

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

  • Original von gritsch
    Original von wolf_10de
    Ich wollte dir nur kurz das Handling von NSValue zeigen, was du speicherst spielt keine Geige (int, struct) die zeiger kannst du ziehen wie Kaugummi, im schlimmsten Fall void ;)


    erinnert mich an youtube.com/watch?v=6pmWojisM_E

    ;)


    Ja den kenn ich ;-), spätestens dann weiß man wie Zeiger funktionieren.

    Aber nochmal auf das Thema zu kommen, ich denke du greifst auf die Elemente innerhalb einer Struct über den Offset zu
    also du addierst zu deinem Startwert (int, float, usw...) einfach mit sizeof den Offset um zum nächsten zu kommen (int, float, usw...) , ich habs auch nicht probiert, es könnte aber so funktionieren.
  • Original von wolf_10de
    Original von gritsch
    Original von wolf_10de
    Ich wollte dir nur kurz das Handling von NSValue zeigen, was du speicherst spielt keine Geige (int, struct) die zeiger kannst du ziehen wie Kaugummi, im schlimmsten Fall void ;)


    erinnert mich an youtube.com/watch?v=6pmWojisM_E

    ;)


    Ja den kenn ich ;-), spätestens dann weiß man wie Zeiger funktionieren.

    Aber nochmal auf das Thema zu kommen, ich denke du greifst auf die Elemente innerhalb einer Struct über den Offset zu
    also du addierst zu deinem Startwert (int, float, usw...) einfach mit sizeof den Offset um zum nächsten zu kommen (int, float, usw...) , ich habs auch nicht probiert, es könnte aber so funktionieren.


    nein, das wird nicht funktionieren (padding). einfach casten und feddisch:

    MyStruct *myVar = (MyStruct *)voidData;

    ... = myVar->str;
    ... = myVar->in;
    ... = myVar->day;
  • Original von gritsch
    Original von wolf_10de
    Original von gritsch
    Original von wolf_10de
    Ich wollte dir nur kurz das Handling von NSValue zeigen, was du speicherst spielt keine Geige (int, struct) die zeiger kannst du ziehen wie Kaugummi, im schlimmsten Fall void ;)


    erinnert mich an youtube.com/watch?v=6pmWojisM_E

    ;)


    Ja den kenn ich ;-), spätestens dann weiß man wie Zeiger funktionieren.

    Aber nochmal auf das Thema zu kommen, ich denke du greifst auf die Elemente innerhalb einer Struct über den Offset zu
    also du addierst zu deinem Startwert (int, float, usw...) einfach mit sizeof den Offset um zum nächsten zu kommen (int, float, usw...) , ich habs auch nicht probiert, es könnte aber so funktionieren.


    nein, das wird nicht funktionieren (padding). einfach casten und feddisch:

    MyStruct *myVar = (MyStruct *)voidData;

    ... = myVar->str;
    ... = myVar->in;
    ... = myVar->day;


    Ja oder so
  • Original von wolf_10de
    Original von gritsch
    Original von wolf_10de
    Original von gritsch
    Original von wolf_10de
    Ich wollte dir nur kurz das Handling von NSValue zeigen, was du speicherst spielt keine Geige (int, struct) die zeiger kannst du ziehen wie Kaugummi, im schlimmsten Fall void ;)


    erinnert mich an youtube.com/watch?v=6pmWojisM_E

    ;)


    Ja den kenn ich ;-), spätestens dann weiß man wie Zeiger funktionieren.

    Aber nochmal auf das Thema zu kommen, ich denke du greifst auf die Elemente innerhalb einer Struct über den Offset zu
    also du addierst zu deinem Startwert (int, float, usw...) einfach mit sizeof den Offset um zum nächsten zu kommen (int, float, usw...) , ich habs auch nicht probiert, es könnte aber so funktionieren.


    nein, das wird nicht funktionieren (padding). einfach casten und feddisch:

    MyStruct *myVar = (MyStruct *)voidData;

    ... = myVar->str;
    ... = myVar->in;
    ... = myVar->day;


    Ja oder so


    ne, nicht ODER ;)
  • Original von Lucas de Vil
    Ich glaube, die Funktionalität bezog sich auf:

    Quellcode

    1. MyStruct* struct = …
    2. NSValue* instance = [NSValue value:&struct withObjCType:@encoding( MyStruct )];
    3. [arr addObject:instance];
    4. void *p;
    5. [[arr objectAtIndex:0] getValue:&p];


    Damit wird dann der Zeiger so zurückgegeben, dass du damit arbeiten kannst.

    Da hättest du selbst drauf kommen können, wärest du mit den Grundlagen weit genug. :)

    Was lässt dich denn an der Klasse unzufrieden sein?

    //Gritsch war schneller.

    Genau genommen wird die Struktur zurückgegeben, der Zeiger übergeben. Objective-C behandelt Strukturen ja by-Value.
    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"?
  • Nur um das hier für spätere Generationen klipp und klar zu sagen:

    Wenn man +valueWithBytes:withObjCType: speichert, werden nicht Zeiger in der Instanz abgelegt, sondern die Struktur selbst. Alles andere wäre auch äußerst fies:

    Quellcode

    1. - (NSValue*)method
    2. MyStruct var = …;
    3. NSValue* value = [NSValue valueWithBytes:&var withObjCType:@encoding( MyStruct )];
    4. return value;
    5. }

    Würde nämlich sonst einen Dangling-Pointer im Rückgabewert zurück liefern.

    Dementsprechend liefert -getValue: auch nicht einen Zeiger zurück, sondern kopiert die Struktur an die Stelle von &var:

    Quellcode

    1. MyStruct var;
    2. [value getValue:&var];


    +++
    Dementsprechend muss man sich um die Speicherverwaltung gar nicht kümmern. Was Macmoonshine die Falten in die Stirn trieb, war nicht der Speicher der Struktur, sondern der Umstand, dass die Struktur selbst wiederum möglicherweise dynamisch Speicher holt, der nicht richtig behandelt wird. Das hat aber wie gesagt nichts mit NSValue zu tun, sondern ist bereits bei myStruct1 = myStruct2 problematisch.
    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"?
  • Also Leute. Immer hier auf Objective-C und seine Ueberlegenheit pochen, und dann soetwas :P

    Wenn ich das hier richtig sehe, ist wirklich der einzige vernuenftige Weg, eine eigene Klasse zu erstellen - da spricht ja im Prinzip auch rein gar nichts dagehen, oder?

    Das pointer-rumhantiere ist finsterstes C-Mittelalter. Das kann man im Embedded-Bereich machen, wenn man genau weiss, was man tut und braucht. In C++ packt man structs in std::vector oder was auch immer.
    C++
  • Original von zermelo
    Also Leute. Immer hier auf Objective-C und seine Ueberlegenheit pochen, und dann soetwas :P

    Wenn ich das hier richtig sehe, ist wirklich der einzige vernuenftige Weg, eine eigene Klasse zu erstellen - da spricht ja im Prinzip auch rein gar nichts dagehen, oder?

    Das pointer-rumhantiere ist finsterstes C-Mittelalter. Das kann man im Embedded-Bereich machen, wenn man genau weiss, was man tut und braucht. In C++ packt man structs in std::vector oder was auch immer.

    Wer hantiert mit Pointern herum? Hast du meinen Beitrag nicht gelesen? Ich kann auch nichts Unvernünftiges erkennen.
    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"?
  • Original von Amin Negm-Awad
    Original von zermelo
    Also Leute. Immer hier auf Objective-C und seine Ueberlegenheit pochen, und dann soetwas :P

    Wenn ich das hier richtig sehe, ist wirklich der einzige vernuenftige Weg, eine eigene Klasse zu erstellen - da spricht ja im Prinzip auch rein gar nichts dagehen, oder?

    Das pointer-rumhantiere ist finsterstes C-Mittelalter. Das kann man im Embedded-Bereich machen, wenn man genau weiss, was man tut und braucht. In C++ packt man structs in std::vector oder was auch immer.

    Wer hantiert mit Pointern herum? Hast du meinen Beitrag nicht gelesen? Ich kann auch nichts Unvernünftiges erkennen.

    Den Beitrag, wo man alles immer kopiert?
    C++
  • Original von zermelo
    Original von Amin Negm-Awad
    Original von zermelo
    Also Leute. Immer hier auf Objective-C und seine Ueberlegenheit pochen, und dann soetwas :P

    Wenn ich das hier richtig sehe, ist wirklich der einzige vernuenftige Weg, eine eigene Klasse zu erstellen - da spricht ja im Prinzip auch rein gar nichts dagehen, oder?

    Das pointer-rumhantiere ist finsterstes C-Mittelalter. Das kann man im Embedded-Bereich machen, wenn man genau weiss, was man tut und braucht. In C++ packt man structs in std::vector oder was auch immer.

    Wer hantiert mit Pointern herum? Hast du meinen Beitrag nicht gelesen? Ich kann auch nichts Unvernünftiges erkennen.

    Den Beitrag, wo man alles immer kopiert?

    In dem Betrag wird etwas kopiert? Irre.

    Aber auch egal. Deine Aussage war doch: "Das pointer-rumhantiere ist finsterstes C-Mittelalter." Ist mir schon klar, dass du davon schnell weglaufen möchtest. Also mal anders gefragt: Was hat dich zu der irrigen Annahme veranlasst, es würde mit Pointern hantiert – außer Unkenntnis natürlich.
    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"?
  • Original von Amin Negm-Awad
    Original von zermelo
    Original von Amin Negm-Awad
    Original von zermelo
    Also Leute. Immer hier auf Objective-C und seine Ueberlegenheit pochen, und dann soetwas :P

    Wenn ich das hier richtig sehe, ist wirklich der einzige vernuenftige Weg, eine eigene Klasse zu erstellen - da spricht ja im Prinzip auch rein gar nichts dagehen, oder?

    Das pointer-rumhantiere ist finsterstes C-Mittelalter. Das kann man im Embedded-Bereich machen, wenn man genau weiss, was man tut und braucht. In C++ packt man structs in std::vector oder was auch immer.

    Wer hantiert mit Pointern herum? Hast du meinen Beitrag nicht gelesen? Ich kann auch nichts Unvernünftiges erkennen.

    Den Beitrag, wo man alles immer kopiert?

    In dem Betrag wird etwas kopiert? Irre.

    Aber auch egal. Deine Aussage war doch: "Das pointer-rumhantiere ist finsterstes C-Mittelalter." Ist mir schon klar, dass du davon schnell weglaufen möchtest. Also mal anders gefragt: Was hat dich zu der irrigen Annahme veranlasst, es würde mit Pointern hantiert – außer Unkenntnis natürlich.

    Stimmt. Unkenntnis wars.
    C++
  • Original von zermelo
    Original von Amin Negm-Awad
    Original von zermelo
    Original von Amin Negm-Awad
    Original von zermelo
    Also Leute. Immer hier auf Objective-C und seine Ueberlegenheit pochen, und dann soetwas :P

    Wenn ich das hier richtig sehe, ist wirklich der einzige vernuenftige Weg, eine eigene Klasse zu erstellen - da spricht ja im Prinzip auch rein gar nichts dagehen, oder?

    Das pointer-rumhantiere ist finsterstes C-Mittelalter. Das kann man im Embedded-Bereich machen, wenn man genau weiss, was man tut und braucht. In C++ packt man structs in std::vector oder was auch immer.

    Wer hantiert mit Pointern herum? Hast du meinen Beitrag nicht gelesen? Ich kann auch nichts Unvernünftiges erkennen.

    Den Beitrag, wo man alles immer kopiert?

    In dem Betrag wird etwas kopiert? Irre.

    Aber auch egal. Deine Aussage war doch: "Das pointer-rumhantiere ist finsterstes C-Mittelalter." Ist mir schon klar, dass du davon schnell weglaufen möchtest. Also mal anders gefragt: Was hat dich zu der irrigen Annahme veranlasst, es würde mit Pointern hantiert – außer Unkenntnis natürlich.

    Stimmt. Unkenntnis wars.

    Das ist ja klar. Aber was hat dich zur Annahme veranlasst, es würde mit Pointern hantiert – außer Unkentnis natürlich
    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"?
  • hallo,

    ich euren Rat gefolgt und statt struct klasse gebaut, aber leider habe ich ein problem (sorry grundlagen :( ) ohh ist mir peinlich,

    klasse struct

    Quellcode

    1. @interface A : NSObject
    2. {
    3. NSString* st;
    4. BOOL bo;
    5. NSTimeInterval t;
    6. int i;
    7. }
    8. @property(nonatomic,readwrite,retain)NSString* st;
    9. @property BOOL bo;
    10. @property int i;
    11. @property NSTimeInterval t;
    12. @end
    13. @implementation A
    14. @synthesize st;
    15. @synthesize bo;
    16. @synthesize t;
    17. @synthesize i;
    18. end
    Alles anzeigen


    Quellcode

    1. @class A;
    2. @interface B : NSObject
    3. {
    4. A *a;
    5. }
    6. @end
    7. @implementation B
    8. -(void)initValues
    9. {
    10. [a setSt:@"string"];
    11. [a setBo:YES];
    12. [a setT:3.0];
    13. [a setI:4];
    14. }
    Alles anzeigen


    werden setter-getter da nicht automatisch erstellt? aber warum werden alle Variablen (pro.) nicht mit werten angelegt, immer NULL?

    bitte langsam Grrrrrrr, bitte wieder um eure Hilfe
  • Original von maya
    Original von gritsch
    in deinem initValues von B ist das a wohl noch nil (oder wo erzeugst du das?)


    danke für die antwort.
    gar nicht ich dachte das wars, oder?
    in java hätte ich wie
    A a = new A();

    aber hier weiss es nicht sorry


    Quellcode

    1. [a release];

    nicht vergessen