Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: OS X Entwicklerforum. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Montag, 6. Juni 2011, 14:02

Objective-C++ NSString in C-String umwandeln

Hallo liebe Community!

Ich habe ein Problem, und zwar wollte ich mal gucken, wie weit man Obj-C und C++ mixen kann und hab direkt ein kleines Beispiel gebastelt, welches ein Passwort überprüfen soll.
Als erstes wird der Text im Passwort-Feld als NSString ausgelesen, dann per cStringUsingEncoding: in einen C-String umgewandelt und dann an die Methode der C++-Klasse übergeben, die überprüft, ob das Passwort richtig ist. Nur leider kommt beim Überprüfen in der C++Klasse immer false heraus :(

Hier mal ein paar Code Auszüge:

// CViewController.h

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
#import <Cocoa/Cocoa.h>
#import "CClass.h"


@interface CViewController : NSObject {
	IBOutlet NSTextField *passwordField;
	IBOutlet NSTextField *label;
	CClass* myCClass;
}

- (IBAction)pushCheck:(NSButton *)sender;
@end



// CViewController.mm

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#import "CViewController.h"
#import "CClass.h"


@implementation CViewController

#pragma mark -
#pragma mark init/dealloc

- (id) init {
	self = [super init];
	if (self != nil) {
		myCClass = new CClass;
	}
	return self;
}

- (void) dealloc {
	delete myCClass;
	[super dealloc];
}



#pragma mark -
#pragma mark IBActions

- (IBAction)pushCheck:(NSButton *)sender {
	
	if(myCClass->checkPassword([[label stringValue] cStringUsingEncoding: NSUTF8StringEncoding])) {
		
		[label setStringValue:@"Richtig!"];
		/*
		passwordField.enabled = NO; // Wie funktioniert das in Cocoa?
		 */
		
	} else 
		[label setStringValue:@"Falsches Passwort!"];
	
}


@end



// CClass.h

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef _CClass_H_
#define _CClass_H_

#include <cstring>

using namespace std;


class CClass {

public:
	CClass();
	~CClass();
	
	bool checkPassword(const char* password);

};

#endif




// CClass.cpp

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstring>
#include "CClass.h"

using namespace std;


CClass::CClass() {
	// init
};

CClass::~CClass() {
	// dealloc
};

bool CClass::checkPassword(const char* password) {
	
	if(strcmp("sehr sicher", password) == 0)
		return true;
	else 
		return false;
	
};



Weiß jemand was ich falsch mache?
Ich habe die Vermutung, dass das Encoding was ich angegeben habe falsch ist.
Im Anhang ist auch nochmal das komplette Projekt.


Danke schonmal im Vorraus für jegliche Hilfe!! :)

PS: Hoffe ich habs ins Richtige Forum gepackt, war mir nicht ganz sicher :s
»ThePat« hat folgende Datei angehängt:
  • C++.zip (64,52 kB - 0 mal heruntergeladen)

Beiträge: 9 635

Wohnort: Suedtirol (Italien)

Beruf: Software-Entwickler

  • Private Nachricht senden

2

Montag, 6. Juni 2011, 15:20

funktioniert das nicht?

Quellcode

1
string([[passwordField stringValue] UTF8String])


mach eventuell mal ein

Quellcode

1
cout << string([[passwordField stringValue] UTF8String]) << endl;

3

Montag, 6. Juni 2011, 16:03

Cool, Danke, funktioniert! :)

Beiträge: 9 635

Wohnort: Suedtirol (Italien)

Beruf: Software-Entwickler

  • Private Nachricht senden

4

Montag, 6. Juni 2011, 16:03

Cool, Danke, funktioniert! :)


wenn passwordField aber nicht verbunden ist dann krachts ;-)

5

Montag, 6. Juni 2011, 16:38

Nebenbemerkung: In C++ gibt es std::string und einen == operator für Stringvergleich.
Du mixt Obj-C++ mit C++ mit C :P
C++

Beiträge: 9 635

Wohnort: Suedtirol (Italien)

Beruf: Software-Entwickler

  • Private Nachricht senden

6

Montag, 6. Juni 2011, 16:40

Nebenbemerkung: In C++ gibt es std::string und einen == operator für Stringvergleich.
Du mixt Obj-C++ mit C++ mit C :P


ich denke/hoffe er hat das C-zeugs mit C++-Zeugs ausgetausch!

++- ;-))

7

Montag, 6. Juni 2011, 16:46

Ich nöl auch gerne noch weiter rum: Klassennamen gross und mit "C" Präfix, das ist auch so eine Microsoft Unart, die diesen Ungarn nie verstanden haben :P
undCamelToe() macht man vielleicht bei Java :P Gut, dass Python das inzwischen auch ächtet, ich finde es unleserlich und furchtbar.
Der Stil der Standardbibliothek und auch Boost geben einem ja schon ganz gute Hinweise - warum sollte man es bei seinem eigenen Code ganz anders machen?
C++

8

Dienstag, 7. Juni 2011, 10:12

Nebenbemerkung: In C++ gibt es std::string und einen == operator für Stringvergleich.
Du mixt Obj-C++ mit C++ mit C :P

Das kam, weil ich nur wusste, wie man einen NSString in einen C-String umwandelt, deswegen hab ich dann auch die Standard C-Funktionen zum Vergleichen von Strings benutzt ;)
Habs aber dann direkt geändert, als gritsch mir gezeigt hat, wie man einen NSString auch als std::string umwandeln kann ;)

Und wegen den Klassennamen:
Ich finds so einfacher zu merken: Klassennamen groß und Variablen, Methoden, Funktionen etc. klein :)


LG ThePat

Social Bookmarks