Anfängerfrage - bitte nicht hauen >> wie komme ich an Felder der Objekte des Array?

  • Anfängerfrage - bitte nicht hauen >> wie komme ich an Felder der Objekte des Array?

    Hallo,
    bitte nicht hauen .. eine bestimmt doofe Anfängerfrage...

    Hier ein kleiner Codefetzen:
    Wenn ich das durch den Debugger jage, dann habe ich am Ende der Zeile 6 ein "tolles" Array mit Einträgen von 0 ..4, in denen auch der richtige Inhalt drinsteht.
    Adresse ist so definiert:
    @interface Adresse : NSObject

    {
    NSString* name;
    NSString* strasse;
    NSString* ort;
    }
    Ist ja nur zum Üben...
    Im Debugger bekomme ich auch ein Objekt in Zeile 9 zurück - aber wie um alles in der Welt komme ich wieder an den Feldinhalt?

    C-Quellcode

    1. NSMutableArray *anschriften = [NSMutableArray arrayWithCapacity:20];
    2. NSUInteger i;
    3. for (i=0; i<5; i++) {
    4. [anschriften addObject: [Adresse adressewithName:@"Falk Gottschalk"]];
    5. }
    6. i = [anschriften count];
    7. printf ("counter = %lu\n", (unsigned long)i);
    8. for (i=0; i<5; i++) {
    9. eineAdresse = [anschriften objectAtIndex:i];
    10. printf("%lu Name = %s\n", (unsigned long)i, [eineAdresse name]);
    11. }
    Alles anzeigen

    Bei dem printf in Zeile 11 kann ich auch "eineAdresse.name" schreiben, kein Unterschied.

    Kann ja nur eine Kleinigkeit sein ... aber irgendwie .. hmmm..

    (Programmiererfahrung in anderen Sprachen habe ich - aber Objective-C ist irgendwie total anders,
    Falls mal jemand Fragen zu ABAP von SAP hat - da wäre ich dann der Guru...)

    Danke!!
  • kmr schrieb:

    Nimm's nicht persönlich, aber an Deinem Code ist so ziemlich alles falsch, was man falsch machen kann. Hast Du mal über ein bisschen Einsteigerliteratur nachgedacht?
    Sieht doch, bis auf den Fehler in Zeile 10, soweit ok aus. Was soll denn bitte "so ziemlich alles falsch" sein? ?(

    Ok, der Code macht nicht viel Sinn, aber darum ging es ja auch nicht.
  • @falkgottschalk -> Hier mal dein Code, etwas aufgeräumter und mit dem Vorschlag von @macmoonshine:

    Quellcode

    1. // Array erzeugen, dem Einträge hinzugefügt werden können
    2. NSMutableArray *anschriften = [NSMutableArray new];
    3. NSUInteger i;
    4. for (i = 0; i < 5; i++) {
    5. // Neues Adressobjekt hinzufügen
    6. [anschriften addObject: [Adresse adressewithName:@"Falk Gottschalk"]];
    7. }
    8. // Anzahl der Objekte im Array ausgeben
    9. NSLog(@"Adressen-Anzahl: %i", [anschriften count]);
    10. for (i = 0; i < [anschriften count]; i++) {
    11. // Objekt im Array an Index 'i'
    12. Adresse *eineAdresse = [anschriften objectAtIndex:i];
    13. // Ausgabe vom aktuellen Zähler und der zugehörigen Adresse
    14. NSLog(@"%i. Name = %@", i, [eineAdresse name]);
    15. }
    Alles anzeigen
    @kmr -> Wieso findest du den Code so schlimm? Abgesehen davon, dass zum Teil C Code darin war passte das ja doch... Es macht wenig sinn, aber das ist doch jedem mal so ergangen...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DBocksteger ()

  • DanielBocksteger95 schrieb:

    @falkgottschalk -> Hier mal dein Code, etwas aufgeräumter und mit dem Vorschlag von @macmoonshine:
    @kmr -> Wieso findest du den Code so schlimm? Abgesehen davon, dass zum Teil C Code darin war passte das ja doch... Es macht wenig sinn, aber das ist doch jedem mal so ergangen...
    Danke. Außer der Tatsache, dass ich das gesuchte Feld mit "NSlog" und nicht mit "printf" ausgeben muss, hat sich ja faktisch nichts geändert....
    (Weitere Anmerkungen an alle siehe unten...)
  • kmr schrieb:

    Ok, meine Antwort war nicht sehr hilfreich. Guck doch mal hier rein. Wenn Du das durchgelesen hast, wirst Du wissen was ich meine. Und Du wirst Objective-C können. ;)
    Danke für den zweiten Anlauf - aber auf der Seite war ich auch schon.
    Es sind jede Menge insgesamt sehr hilfreicher Themen hinterlegt - aber mein konkretes Problem aus dem Bastel-Programm wird auf der Seite eben NICHT behandelt - ich habe dort nirgendwo irgendetwas von NSMutableArray gefunden und erst recht keinen Hinweis, dass man deren Inhalt mit PRINTF nicht ausgeben kann. Und ich würde auch nicht behaupten, dass man alleine durch Lesen dieser Seite(n) Objective-C lernen könnte, dafür fehlen zu viele Grundlagen.

    @All: danke für hilfreichen Beiträge.
    Dieser Mini-Thread ist aber ein schönes Beispiel dafür, wie man als Anfänger in Objective-C - egal von wo man kommt - an Kleinigkeiten scheitern kann.
    • Wo steht dass man einen NSString zwar mit NSLog ausgeben kann aber nicht mit printf?
    • Woher soll man wissen dass man ein NSMutableArray ganz profan und dynamisch mit "new" initialisieren kann wenn das nicht einmal die offizielle Klassenreferenz von Apple hergibt?
    • Und wenn man in den "Getting started"-Dokumenten und dem "Saale Code" von Apple nirgendwo ein Beispiel findet das die Anwendung beschreibt?



    Wie erwähnt komme ich von anderen Programmiersprachen, was ein Fluch und Segen zugleich ist. Tagsüber mache ich ABAP, das ist die Programmiersprache von SAP. Da gibt es auch ABAP-OO, ABAP Objects und Objektorientiert, Klassen, Methoden, Vererbung usw. Ich muss mir aber da beispielsweise keinen Kopf machen ob ich bestimmte Daten nur links oder nur rechts verwenden kann, eine notwendige Konvertierung macht die Laufzeitumgebung dann schon selber. (Konkret macht es keinen Unterschied ob ich - innerhalb der Systemgrenzen - eine Zeichenfolge einer definierten Länge, also eine CHAR-Folge habe oder einen Nullterminierten Unicode-String, der theoretisch Gigabyte lang sein könnte.Ich kann prinzipiell beide ziemlich gleich behandeln.)

    Ich habe schon einen Haufen Links zu Coding-Fetzen oder Tutorials, diverse Ebooks und auch "echte" Bücher.
    Die Veränderungshäufigkeit der Sprache und der IDE scheint sehr hoch zu sein, viele Beispiele aus Büchern "Veröffentlicht 2014" laufen auf dem aktuellen System nicht mehr.

    Ja, es ist nicht einfach irgendwie diesen Xcode-"Pudding" an die Wand zu nageln.

    Es werden noch weitere Fragen kommen, keine Sorge.
  • falkgottschalk schrieb:


    Dieser Mini-Thread ist aber ein schönes Beispiel dafür, wie man als Anfänger in Objective-C - egal von wo man kommt - an Kleinigkeiten scheitern kann.
    • Wo steht dass man einen NSString zwar mit NSLog ausgeben kann aber nicht mit printf?
    • Woher soll man wissen dass man ein NSMutableArray ganz profan und dynamisch mit "new" initialisieren kann wenn das nicht einmal die offizielle Klassenreferenz von Apple hergibt?
    • Und wenn man in den "Getting started"-Dokumenten und dem "Saale Code" von Apple nirgendwo ein Beispiel findet das die Anwendung beschrei

    Bei allem Verständnis für Deine Frustration, ein Großteil Deines Problems war hausgemacht:
    • NSString ist eine Objektklasse. Mit printf kannst Du sicherlich gut Primitives ausgeben, für die Ausgabe eines Objektes, von dem Du "nur" den Pointer hast, ist es nicht geeignet. Ich glaube nicht, dass dies in irgendeiner anderen objekt-orientierten Sprache anders ist. Dieser Umstand ergibt sich implizit aus den Datentypen und wenn Du in den "String Programming Guide" schaust, findest Du auch entsprechendes dokumentiert.
    • Schaust Du in die Class Reference von NSMutableArray, dann stelltst Du fest, dass dieses eine Kindklasse von NSArray und diese wiederum von NSObject ist. Und siehe da: Letztere implementiert die Methode "new", die natürlich an ihre Unterklassen vererbt wird. Es macht also durchaus Sinn, beim Studium der Klassenreferenzen in die Superklassen zu schauen.
    • Der schon genannte "String Programming Guide" führt Beispiele zur Formatierung / Ausgabe von Strings auf, ausserdem ist Google (fast) immer eine gute Idee. Beides ändert aber nichts daran, dass ich immer noch das Durcharbeiten einer einführenden Lektüre für sinnvoll halte. So richtig aus Papier und mit Beispielen, die man nachvollzieht ... old school eben. Dann erschliessen sich auch einem Umsteiger viele Dinge quasi von selber und manche Probleme stellen sich erst gar nicht. BTDT.
    Aber bei so einem kleinen Lapsus in Deinem Beispiel-Programm kannst Du doch ganz zufrieden sein! Und nein, ich mache mir keine Sorgen, es könnten keine Fragen mehr kommen ... hab' ich doch selber genug :D

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • falkgottschalk schrieb:

    Wo steht dass man einen NSString zwar mit NSLog ausgeben kann aber nicht mit printf?
    Das steht wahrscheinlich nicht explizit in der Dokumentation. printf ist eine C-Funktion. In C gibt es keine Objective-C-Objekte. Das Format %s erwartet einen Zeiger auf char. Die Methode name liefert aber einen Zeiger auf ein Objekt der Klasse NSString; oder anders char * ist was anderes als NSString *.
    „Meine Komplikation hatte eine Komplikation.“
  • MyMattes schrieb:

    Bei allem Verständnis für Deine Frustration, ein Großteil Deines Problems war hausgemacht:Aber bei so einem kleinen Lapsus in Deinem Beispiel-Programm kannst Du doch ganz zufrieden sein! Und nein, ich mache mir keine Sorgen, es könnten keine Fragen mehr kommen ... hab' ich doch selber genug :D

    Mattes
    Danke, aber bis sich bei mir im Zusammenhang mit Xcode Zufriedenheit einstellt, wird es tendenziell noch ein wenig dauern...

    Sicherlich ist Google immer eine gute Idee - hat aber bekanntlich den Nachteil, dass man ein Stichwort eingeben muss. :D
    Und genau hier sind wir wieder bei meinem Kardinalproblem: wo fängt man an mit Suchen?


    macmoonshine schrieb:

    falkgottschalk schrieb:

    Wo steht dass man einen NSString zwar mit NSLog ausgeben kann aber nicht mit printf?
    Das steht wahrscheinlich nicht explizit in der Dokumentation. printf ist eine C-Funktion. In C gibt es keine Objective-C-Objekte. Das Format %s erwartet einen Zeiger auf char. Die Methode name liefert aber einen Zeiger auf ein Objekt der Klasse NSString; oder anders char * ist was anderes als NSString *.
    Auch Dir vielen Dank.
    Wenn man den NSString in seine Bestandteile zerlegt, dann dürfte da aber auch ein (uni)Char drinsein. :))
    Ja, die Erklärung ist gut. Aber nativ wie ich hin ging ich davon aus, dass Apple das Printf da entsprechend zurechtgefummelt hat, so von wegen "Hey, das Feld ist ja ein Pointer auf einen Unicode-Zeichen-Haufen, kein Dinge, wandele ich mal eben um",

    Ich merke schon, Xcode ist und bleibt ein Tal der Tränen für Umsteiger...
  • falkgottschalk schrieb:

    MyMattes schrieb:

    Bei allem Verständnis für Deine Frustration, ein Großteil Deines Problems war hausgemacht:Aber bei so einem kleinen Lapsus in Deinem Beispiel-Programm kannst Du doch ganz zufrieden sein! Und nein, ich mache mir keine Sorgen, es könnten keine Fragen mehr kommen ... hab' ich doch selber genug :D

    Mattes
    Danke, aber bis sich bei mir im Zusammenhang mit Xcode Zufriedenheit einstellt, wird es tendenziell noch ein wenig dauern...
    Sicherlich ist Google immer eine gute Idee - hat aber bekanntlich den Nachteil, dass man ein Stichwort eingeben muss. :D
    Und genau hier sind wir wieder bei meinem Kardinalproblem: wo fängt man an mit Suchen?


    macmoonshine schrieb:

    falkgottschalk schrieb:

    Wo steht dass man einen NSString zwar mit NSLog ausgeben kann aber nicht mit printf?
    Das steht wahrscheinlich nicht explizit in der Dokumentation. printf ist eine C-Funktion. In C gibt es keine Objective-C-Objekte. Das Format %s erwartet einen Zeiger auf char. Die Methode name liefert aber einen Zeiger auf ein Objekt der Klasse NSString; oder anders char * ist was anderes als NSString *.
    Auch Dir vielen Dank.Wenn man den NSString in seine Bestandteile zerlegt, dann dürfte da aber auch ein (uni)Char drinsein. :))
    Ja, die Erklärung ist gut. Aber nativ wie ich hin ging ich davon aus, dass Apple das Printf da entsprechend zurechtgefummelt hat, so von wegen "Hey, das Feld ist ja ein Pointer auf einen Unicode-Zeichen-Haufen, kein Dinge, wandele ich mal eben um",

    Ich merke schon, Xcode ist und bleibt ein Tal der Tränen für Umsteiger...

    Mich dünkt Dein OOP Wissen ist noch ziemlich maginal.

    Ein NSString ist definitiv kein einfacher Pointer auf einen unicode char string.... Das ist ein reinrassiges Object mit allem was dazu gehört.

    Du solltest erstmal ein wenig Grundlagen lernen auch wenn du schon so lange dabei ist, scheint mir da einiges auf der Strecke geblieben.

    Nichts für ungut

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • falkgottschalk schrieb:

    Wenn man den NSString in seine Bestandteile zerlegt, dann dürfte da aber auch ein (uni)Char drinsein. :))
    Das mag ja sein. Dennoch kommt printf damit nicht zurecht, weil es keine Objective-C-Objekte kennt. Mit Zeiger auf unichar kommt das Format %s übrigens auch nicht zurecht.

    falkgottschalk schrieb:

    Ich merke schon, Xcode ist und bleibt ein Tal der Tränen für Umsteiger...
    Wenn du versuchst, einfach Konzepte von anderen Plattformen oder Programmiersprachen zu übertragen, machst du es dir natürlich schwer. Wenn man sich systematisch damit beschäftigt, sollte das kein Problem sein. Ein großer Teil der Foren-Mitglieder besteht übrigens aus Umsteigern (mich eingeschlossen).

    Ein (kostenloses) Einstiegsbuch hat die kmr ja bereits genannt.
    „Meine Komplikation hatte eine Komplikation.“
  • falkgottschalk schrieb:

    Es sind jede Menge insgesamt sehr hilfreicher Themen hinterlegt - aber mein konkretes Problem aus dem Bastel-Programm wird auf der Seite eben NICHT behandelt - ich habe dort nirgendwo irgendetwas von NSMutableArray gefunden und erst recht keinen Hinweis, dass man deren Inhalt mit PRINTF nicht ausgeben kann. Und ich würde auch nicht behaupten, dass man alleine durch Lesen dieser Seite(n) Objective-C lernen könnte, dafür fehlen zu viele Grundlagen.
    Dann hast Du die Seite, bzw. das dazugehörige Buch, nicht gelesen. Hättest Du in Kapitel 1 angefangen, wäre Dir NSLog ein Begriff. Und hättest Du das Kapitel 2 gelesen, würdest Du nicht so haarsträubend sinnentleerte Kommentare ablassen.

    falkgottschalk schrieb:

    Dieser Mini-Thread ist aber ein schönes Beispiel dafür, wie man als Anfänger in Objective-C - egal von wo man kommt - an Kleinigkeiten scheitern kann

    Dieser Mini-Thread ist ein schönes Beispiel dafür, dass Du zu faul bist, Dir die elementarsten Grundlagen anzueignen, und die Schuld lieber Apple, Objective-C oder der Dokumentation in die Schuhe schiebst.

    falkgottschalk schrieb:


    [list]Wo steht dass man einen NSString zwar mit NSLog ausgeben kann aber nicht mit printf?[/list]

    Siehe oben.

    falkgottschalk schrieb:

    Woher soll man wissen dass man ein NSMutableArray ganz profan und dynamisch mit "new" initialisieren kann wenn das nicht einmal die offizielle Klassenreferenz von Apple hergibt?
    Ach!? Gibt sie nicht? Ich sehe in der Dokumentation, dass NSMutableString eine Subklasse von NSString ist, die wiederrum eine Subklasse von NSObject ist. Die init-Methode von NSString ist beschrieben als "Returns an initialized NSString object that contains no characters.". Die alloc-Methode von NSObject ist beschrieben als "Returns a new instance of the receiving class.". 1 und 1 zusammenzählen ist freilich schwieriger als allen anderen die Schuld zu geben.

    Im Übrigen steht dies auch alles in der oben zitierten Grundlagenliteratur. Und zwar ausführlich und in Deutsch..

    falkgottschalk schrieb:

    Und wenn man in den "Getting started"-Dokumenten und dem "Saale Code" von Apple nirgendwo ein Beispiel findet das die Anwendung beschreibt?
    Das wird ein Versehen von Apple sein, dass die ausgerechent Deine Hallo-Welt-Anwendung nicht in der Dokumentation bedacht haben. Ich würde einen bösen Brief an Apple schreiben, und warte mal ab, eventuell präsentieren die Deinen Code dann auf der WWDC, zusammen mit einer aufrichtigen Entschuldigung.

    falkgottschalk schrieb:

    Ich habe schon einen Haufen Links zu Coding-Fetzen oder Tutorials, diverse Ebooks und auch "echte" Bücher.
    Die Veränderungshäufigkeit der Sprache und der IDE scheint sehr hoch zu sein, viele Beispiele aus Büchern "Veröffentlicht 2014" laufen auf dem aktuellen System nicht mehr.
    Struktur ist nicht so Deine Stärke? Jedes in dem oben referenzierten Buch enthaltene Beispiel lässt sich kompilieren und ausführen. Jedes einzelne.


    falkgottschalk schrieb:

    Ja, es ist nicht einfach irgendwie diesen Xcode-"Pudding" an die Wand zu nagelnb
    Was aber beileibe kein Fehler von Xcode ist.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von kmr ()

  • kmr schrieb:

    Und hättest Du das Kapitel 2 gelesen, würdest Du nicht so haarsträubend sinnentleerte Kommentare ablassen.

    Dieser Mini-Thread ist ein schönes Beispiel dafür, dass Du zu faul bist, Dir die elementarsten Grundlagen anzueignen, und die Schuld lieber Apple, Objective-C oder der Dokumentation in die Schuhe schiebst.



    Struktur ist nicht so Deine Stärke? ...
    Schade, dass es immer wieder Foren gibt, in denen Leute mit einer desolaten Mischung aus Arroganz und Überheblichkeit interessierte Einsteiger vertreiben.
    Nicht jeder hat von Geburt an einen göttlichen Status der Unfehlbarkeit und des Allwissenden.

    Bleibt nur zu hoffen dass jeder, der so daherkommt, auch mal irgendwann irgendwo an eine Einsteiger-Grenze stößt und von einigen Leuten nur blöde Sprüche zu hören bekommt.
  • @kmr: Uii, was ist denn mit Dir los? Hattest Du einen schlechten Tag?

    @falkgottschalk: Nimm Dir einen guten Whiskey und ein lecker Zigärrchen und arbeite wirklich mal das o.a. Buch in Ruhe durch. Du wirst sehen, dass dann Einiges klarer wird und sich ab und an ein Aha-Effekt einstellt.
    Ich bin gegen Signaturen!!!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von beage ()