• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

std::string nach NSString konvertieren

Nighthawk

Linsenhofener Sämling
Registriert
16.12.06
Beiträge
2.558
Die Frage steht eigentlich schon im Titel. Wie mach ich das?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
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
 
  • Like
Reaktionen: Nighthawk

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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.
 
Zuletzt bearbeitet:

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
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] );
FileMO.m:443: warning: embedded NUL in CFString literal
2007-12-17 16:20:45.220 LawFirm #9811[22505] hallo
2007-12-17 16:20:45.220 LawFirm #9811[22505] 10
 

Nighthawk

Linsenhofener Sämling
Registriert
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...
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
CFShow() funktioniert aber noch. NSLog () habe ich nicht probiert.

Alex
 

ifthenelse

Fießers Erstling
Registriert
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
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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?

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

Alex
 

Amin Negm-Awad

Süsser Pfaffenapfel
Registriert
01.03.07
Beiträge
665
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
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!)
 

Nighthawk

Linsenhofener Sämling
Registriert
16.12.06
Beiträge
2.558
ja, C++ ist grausam. ;)
:-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 :)
 

ifthenelse

Fießers Erstling
Registriert
07.12.06
Beiträge
129
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.

Ä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
 

ifthenelse

Fießers Erstling
Registriert
07.12.06
Beiträge
129
:-D
Aber wir hatten uns nunmal vorgenommen, plattformunabhaengig zu schreiben, weswegen wir um C++ nicht herum kommen...

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
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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.
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
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