Programm liefert unerwartetes Ergebnis

  • Programm liefert unerwartetes Ergebnis

    hallo zusammen,

    anhand des Hillegass versuche ich zur Zeit mir Cocoa-Programmierung bzw. Objective-C beizubringen. Ich bin also ein blutiger Anfänger.

    Im "Chapter 3" gibt es ein Beispiel (Foundation Tool), das bei mir (mit XCode) eine anderes Ergebnis liefert, als im Buch.
    Es ist ziemlich kurz, daher setzte ich es einfach mal komplett ein.

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. int main (int argc, const char * argv[])
    3. {
    4. NSMutableArray *array;
    5. int i;
    6. NSNumber *number;
    7. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    8. array = [[NSMutableArray alloc] init];
    9. for ( i = 0; i < 10; i++ )
    10. {
    11. number = [[NSNumber alloc] initWithInt:(i*3)];
    12. [array addObject:number];
    13. [number release];
    14. }
    15. NSLog(@"array = %@", array);
    16. [array release];
    17. [pool release];
    18. return 0;
    19. }
    Alles anzeigen


    Das Ergebnis sollte laut Buch so aussehen:

    Quellcode

    1. ...
    2. values = (
    3. 0 : 0
    4. 1 : 3
    5. 2 : 6
    6. ...
    7. 8 : 24
    8. 9 : 27
    9. )}
    10. ...


    Bei mir sieht es so aus:

    Quellcode

    1. ...
    2. values = (
    3. 0 : <CFNumber 0x301200 [0xa01900e0]>{value = +0, type = kCFNumberSInt32Type}
    4. 1 : <CFNumber 0x301200 [0xa01900e0]>{value = +3, type = kCFNumberSInt32Type}
    5. 2 : <CFNumber 0x301200 [0xa01900e0]>{value = +6, type = kCFNumberSInt32Type}
    6. ...
    7. 8 : <CFNumber 0x301200 [0xa01900e0]>{value = +24, type = kCFNumberSInt32Type}
    8. 9 : <CFNumber 0x301200 [0xa01900e0]>{value = +27, type = kCFNumberSInt32Type}
    9. )}
    10. ...


    1. Was bedeutet das alles?

    2. Habe ich einen Fehler gemacht?

    3. Kann das daran liegen, dass XCode den Code anders verarbeitet als Project Builder ? (ich würde das ja eher ausschließen, bin mir aber nicht sicher)
    Habe Mut, Dich Deines eigenen Verstandes zu bedienen.
    (Immanuel Kant)
  • nein, das stimmt schon so. Der Punkt ist nur, dass das Buch nen Fehler hat, bzw. auf ner älteren OS-X version geschrieben wurde. Denn du legst ja mit

    Quellcode

    1. number = [[NSNumber alloc] initWithInt:(i*3)];
    eine Instanz von NSNumber an. Und die bleibt auch so im Array gespeichert. Wenn die Ausgabe jetzt so aussieht:

    Quellcode

    1. <CFNumber 0x301200 [0xa01900e0]>{value = +0, type = kCFNumberSInt32Type}
    Dann ist das nur eine exakte Beschreibung des Cocoa-Objekts. Es ist eine CFNumber (entspricht NSNumber) die im Speicher an der adresse 0x301200 liegt, ihr Wert ist 0 und diese wird als 32-bit integer gespeichert. Für den typ könnte es auch ne bool sein oder ne float...
  • Hallo M.A.X.

    vielen Dank für die schnelle Antwort.
    ganz klar ist mir das noch nicht alles, aber das wird es wohl erst im Lauf der Zeit.

    Ich hätte da noch eine Frage zu dem Beispiel:

    Bei mir wird eine weitere Source angelegt lottery_Prefix.pch
    Ist das eine Art Vorlage für alle angelegten Source-Files ?
    Wozu dienst das ?

    Und noch eine Frage, wenn wir schon dabei sind

    Warum kann ich ProjectBuilder (liegt auf einer Partition, auf der noch Jaguar installiert ist) unter OS X 10.3 nicht öffnen ?
    Das Icon hüpft nur kurz im Dock und das wars dann.

    Vielen Dank noch mal für Deine Hilfe
    Habe Mut, Dich Deines eigenen Verstandes zu bedienen.
    (Immanuel Kant)
  • Original von D.Mon
    Ich hätte da noch eine Frage zu dem Beispiel:
    Bei mir wird eine weitere Source angelegt lottery_Prefix.pch
    Ist das eine Art Vorlage für alle angelegten Source-Files ?
    Wozu dienst das ?

    Das ist ein so genannter precompiled Header. Dadurch wird das Compilieren eines Projektes enorm beschleunigt.
    Original von D.Mon
    Warum kann ich ProjectBuilder (liegt auf einer Partition, auf der noch Jaguar installiert ist) unter OS X 10.3 nicht öffnen ?

    Für 10.3 ist Xcode Pflicht. Die Developer Tools von 10.2 basieren wie 10.2 auf dem gcc-3.1. Der Panther (10.3) basiert auf gcc-3.3. Die einzelnen gcc Versionen sind im Bereich C++ ABI nicht kompatibel.

    Michael
  • Man kann das auch noch kompakter schreiben

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. int main (int argc, const char * argv[])
    3. {
    4. int i;
    5. NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    6. NSMutableArray *array = [[NSMutableArray alloc]init];
    7. for(i=0; i < 10; i++)
    8. [array addObject:[NSNumber numberWithInt:i*3]];
    9. NSLog(@"array = %@", [array description]);
    10. [array release];
    11. [pool release];
    12. return 0;
    13. }
    Alles anzeigen
    cu
    Peter
  • hallo zusammen,

    vielen Dank Euch allen für Eure Hilfe.
    Die Hinweise helfen mir ungemein, die Materie besser zu verstehen.
    Das Buch ist ja icht gerade ganz leichte Kost, besonders, wenn man - wie ich - von C keine Ahnung hat und mit c++ auch erst angefangen hat
    .
    Vielleicht kann mir ja auch noch einer erklären, wie ich die c++ - Anweisung

    Quellcode

    1. cout << zahl << " ist eine Primzahl !" << endl;
    als eine NSLog-Methode (sagt man das so?) ausdrücken kann.
    Habe Mut, Dich Deines eigenen Verstandes zu bedienen.
    (Immanuel Kant)
  • hallo zusammen,
    Original von gritsch NSLog(@"Dies ist eine Primzahl: %i",intZahl);
    Also mal ganz langsam zum mitdenken - ok?

    NSLOG ---> gib aus // Frage, funktioniert das auch mit GUI, also InterfaceBuilder so?
    ( ... ) ---> Das was augegeben werden soll
    @ ---> das folgende ist ein Objekt // heisst das, ein String ist immer ein Objekt ?
    "Dies ist eine Primzahl: %i" ---> das ist die Ausgabe, wobe "%i" eine Variable ist.
    und jetzt kapier ichs nimmer:
    intZahl ---> das soll jetzt wohl den Variableninhalt liefern, aber die Variable heisst "zahl", muss ich dann nicht "NSLog(@"Dies ist eine Primzahl: %i",zahl)" schreiben ?
    ----
    Ich werde das natürlich später mal ausprobieren, aber es würde mich wundern, wenn es klappt.
    Der Rest vom Code ist in c++ geschrieben, aber wenn ich das tichtig verstehe, ist diese Zeile astreines C; kann man das einfach so mischen ?
    Auch dem Tip mit "man printf" werd ich natürlich folgen.
    Habe Mut, Dich Deines eigenen Verstandes zu bedienen.
    (Immanuel Kant)
  • ::NSLOG ---> gib aus // Frage, funktioniert das auch mit GUI, also InterfaceBuilder so?
    Nein funkt net. Das gibt nur in die konsole aus. In die Gui schreibst du in NSTextView oder NSTextFields (oder anderes).

    ::( ... ) ---> Das was augegeben werden soll
    NSLog ist eine funktion und also kommen die übergabeparameter zwischen die klammern.

    ::@ ---> das folgende ist ein Objekt // heisst das, ein String ist immer ein Objekt ?
    "test" Das ist ein C-String
    @"test" Das ist ein Obj-C-StringObject

    ::"Dies ist eine Primzahl: %i" ---> das ist die Ausgabe, wobe "%i" eine Variable ist.
    ja. Und %i bedeutet dass es ein integer ist!

    ::intZahl ---> das soll jetzt wohl den Variableninhalt liefern, aber die Variable heisst "zahl", muss ::ich dann nicht "NSLog(@"Dies ist eine Primzahl: %i",zahl)" schreiben ?
    du hast vollkokmmen recht! Ich habe nur intZahl geschriben damit man sieht dass das ein integer sein muss!
  • Hallo,
    schreib doch mal diesen Code in den Action-Handler eines Buttons und lass die App in Xcode laufen.

    Quellcode

    1. NSLog(@"Hello, World!\n");
    2. int i = 3;
    3. NSLog(@"%i ist eine Primzahl\n", i);
    4. float f = 47.13;
    5. NSLog(@"f hat den Wert %g und i ist %i", f,i);


    Das Ergebnis sieht dann sinngemäß so aus:

    Quellcode

    1. 2004-03-21 21:09:59.987 Hallo[1444] Hello, World!
    2. 2004-03-21 21:09:59.988 Hallo[1444] 3 ist eine Primzahl
    3. 2004-03-21 21:09:59.988 Hallo[1444] f hat den Wert 47.13 und i ist 3
    cu
    Peter