1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

std::string nach NSString konvertieren

Dieses Thema im Forum "OS X-Developer" wurde erstellt von Nighthawk, 16.12.07.

  1. Nighthawk

    Nighthawk Linsenhofener Sämling

    Dabei seit:
    16.12.06
    Beiträge:
    2.558
    Die Frage steht eigentlich schon im Titel. Wie mach ich das?
     
  2. MacApple

    MacApple Lord Grosvenor

    Dabei seit:
    05.01.04
    Beiträge:
    3.470
    Code:
    const char *cString;
    std::string cppString;
    
    cppString = "Hallo Welt!";
    cString = cppString.c_str();
    
    NSString *objcString = [NSString stringWithCString:cString encoding:NSASCIIStringEncoding];
    Das musst Du in eine Objective-C++ Datei schreiben (Dateiendung .mm).

    MacApple
     
    Nighthawk gefällt das.
  3. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.255
    Das wird nichts. std::string darf Null-Bytes enthalten! Ohne Länge des Strings kann das nicht funktionieren, die entsprechende Methode von NSString, die einen garantierte Konversion erlaubt ist aber seit MacOS X 10.4 deprecated. Insofern muß erstmal überprüft werden, ob std::string keine Null-Bytes enthält.
     
    #3 tjp, 16.12.07
    Zuletzt bearbeitet: 17.12.07
  4. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Naja, Cocoa ist ja nicht alles im Leben, und glücklicherweise ist NSString "toll-free bridged" mit CFString

    Code:
    	std::string s;
    [...]
    	NSString * cocoaString;
    	
    	cocoaString = (NSString*)CFStringCreateWithBytes(kCFAllocatorDefault, (const UInt8*)s.c_str(), s.size(), kCFStringEncodingUTF8,false);
    Encoding sollte man natürlich entsprechend setzen.

    Alex
     
  5. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    @Alex:
    Da sagst du was. Ich habe mir nie Gedanken darüber gemacht, ob ein NSString resp. CFString ein \0 enthalten darf. Aber das darf es wohl.

    Allerdings wirft er dann eine Warning und NSlog() geht freilich auch nicht mehr. Aber enthalten sein darf es wohl
    Code:
        NSString* with0 = @"hallo\0Welt";
        NSLog( @"%@", with0 );
        NSLog( @"%d", [with0 length] );
     
  6. Nighthawk

    Nighthawk Linsenhofener Sämling

    Dabei seit:
    16.12.06
    Beiträge:
    2.558
    Danke schonmal für die Tips :)

    So langsam dreh ich hier am Rad. Cocoa-Oberflächen über Objective-C++ für C++-Programme zu schreiben ist grausam...
     
  7. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    CFShow() funktioniert aber noch. NSLog () habe ich nicht probiert.

    Alex
     
  8. ifthenelse

    ifthenelse Fießers Erstling

    Dabei seit:
    07.12.06
    Beiträge:
    129
    Und in ein NSTextField per setStringValue: reinschreiben geht auch. Und es wird auch angezeigt. Und editieren geht auch.

    Kann es sein, dass NSStrings (bzw. CFStrings) mit dem guten, alten Pascal-Strings "verwandt" sind, d.h. nicht Zero-terminated sind, sondern einen Counter für die Anzahl der Zeichen beinhalten?

    Gruss, Jörg
     
  9. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Das würde ich so nicht sagen. CFStrings und NSStrings sind Objekte, die eben eine Länge haben, genau wie std::string

    Alex
     
  10. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    Das würde auch ich (fast) nicht so genau sagen.

    1. Du weißt nicht, was sich dahinter verbirgt. Wozu auch? Don't try the Kapsel.

    2. Mutmaßlich wird es eine Liste von Kacheln sein. Das ist ja der große Vorteil von immutable Skalaren. Ein einfaches Beispiel:
    Code:
    NSString* firstName = @"Amin";
    NSString* completeName = [firstName stringByAppendingString:@" Negm-Awad"];
    Muss man da wirklich ein einziges Byte der Strings kopieren? Oder reicht es aus, im letztendlichen String-Objekt einfach zwei Zeiger auch Kacheln unterzubringen? (Es befinden sich drei String-Objekte im Sourcetext.)

    Das hast du so häufig: Du denkst, dass eine Abstraktion (hier: Immutable Strings) etwas kostet und siehst nicht, dass es etwas bringt. Auch wenn es etwas Devotes hat: Vertraue darauf, dass bei Apple ganz gute Leute sitzen, jedenfalls Leute, die mehr Manpower haben als du. Dann ist die Antwort klar: Nutze, was sie dir geben. (Was übrigens auch Vorteile bezüglich der Optimierung im nächsten Release hat. –- Kostenlos!)
     
  11. Amin Negm-Awad

    Amin Negm-Awad Süsser Pfaffenapfel

    Dabei seit:
    01.03.07
    Beiträge:
    665
    ja, C++ ist grausam. ;)
     
  12. Nighthawk

    Nighthawk Linsenhofener Sämling

    Dabei seit:
    16.12.06
    Beiträge:
    2.558
    :-D
    Aber wir hatten uns nunmal vorgenommen, plattformunabhaengig zu schreiben, weswegen wir um C++ nicht herum kommen...

    Uebrigens: Vielen Dank fuer das tolle Objective-C/Cocoa-Buch. Ohne wuerde ich wahrscheinlich komplett verzweifeln :)
     
  13. ifthenelse

    ifthenelse Fießers Erstling

    Dabei seit:
    07.12.06
    Beiträge:
    129
    Ähm, na ja, reine Neugier?

    BTW: Ich habe als Kind auch die Legobausteine aus den Bausätzen für Häuser, Flugzeuge etc. zusammengeworfen und ganz andere Dinge daraus zusammen gebaut ;)

    Gruss, Jörg
     
  14. ifthenelse

    ifthenelse Fießers Erstling

    Dabei seit:
    07.12.06
    Beiträge:
    129
    Warum dann nicht Java? Nicht das Java so toll wäre (im Vergleich zu Objective C). Aber bevor man sich mit C++ rumqäult :cool:

    Gruss, Jörg
     
  15. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.255
    Die Qual entsteht immer dann, wenn man Dinge verwenden muß, die nicht wirklich zusammenpassen. Cocoa und C++ ist ein Unding, Objective-C und die diversen C++ Frameworks geht ebenfalls nicht wirklich. Objective-C++ ist etwas unausgegohrenes, da es nicht wirklich mit modernen C++ Code harmoniert. Die Exceptions beider Sprachen werden wechselseitig nicht erkannt usw.
     
  16. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Es wird mit der neuen 64 Bit Runtime für Objective-C etwas besser. Da gibt es dann z.B. endlich unified exception handling für Objective-C und C++

    Alex
     

Diese Seite empfehlen