Design-Problem
-
Hallo,
aus dem mitgelieferten Demo-Code ( c, ohne klassen) für das Datenbanksystem möchte ich mir nun die allgemeine Klasse stricken.
in lasse::open() wird erwartet, daß´der Name des DatenFile mit strcpy dem keyBuf zugewiesen wird:typedef char BTI_CHAR; ..... klasse::open(){ strcpy((BTI_CHAR *)_keyBuf, _filename); // ... }das strcpy als zweiten param einen "const char *" erwartet, habe ich _filename als
BTI_CHAR _filename[255];deklariert. Im Konstruktor möchte ich _filename auf eine leeren Wert setzen:
*_filename = 0x0;und
_filename[0] = 0x0;müsste das Gleiche sein?? , ergibt jedenfalls keinen Fehler.
Da die Dateinamen aus ASCII-Files als string eingelesen werden ( sollen).
WIe bekomme ich dann in der function ::setDateiname() den neuen Wert zuweisen?void ::setDateiname(string neuerName ){ *_filename = *neuerName; //??? was passiert wenn neuername nicht mehr existiert? //oder while (*filename++=*neuerName++);Ich schwimme da wohl heftig
Hannshabe ic
-
HannsW schrieb:
Hallo,
aus dem mitgelieferten Demo-Code ( c, ohne klassen) für das Datenbanksystem möchte ich mir nun die allgemeine Klasse stricken.
in lasse::open() wird erwartet, daß´der Name des DatenFile mit strcpy dem keyBuf zugewiesen wird:typedef char BTI_CHAR; ..... klasse::open(){ strcpy((BTI_CHAR *)_keyBuf, _filename); // ... }Hallo Hanns,
Warum eigentlich? Was ist '_keyBuf'? und wer garantiert Dir, dass '_filename' ncht länger ist, als das Memory auf das 'keyBuf' zeigt?
Das vorangestellte '' ist für Systemnamen reserviert und sollte im Code nicht benutzt werde. Membervariablen von Klassen werden i.A. mit nachgestelltem '' oder vorangestellten 'm' gekennzeichnet.HannsW schrieb:
das strcpy als zweiten param einen "const char *" erwartet, habe ich _filename als
BTI_CHAR _filename[255];deklariert. Im Konstruktor möchte ich _filename auf eine leeren Wert setzen:
*_filename = 0x0;und
_filename[0] = 0x0;müsste das Gleiche sein?? , ergibt jedenfalls keinen Fehler.
Das ist das gleiche.
HannsW schrieb:
Da die Dateinamen aus ASCII-Files als string eingelesen werden ( sollen).
WIe bekomme ich dann in der function ::setDateiname() den neuen Wert zuweisen?void ::setDateiname(string neuerName ){ *_filename = *neuerName; //??? was passiert wenn neuername nicht mehr existiert? //oder while (*filename++=*neuerName++);Von welchem Typ ist 'string'? Es ist grundsätzlich zu empfehlen std::string zu benutzen. Dann hast Du auch kein Problem mit der Länge und mit
std::string s; if( s.empty() ) // s ist leerkannst Du abfragen, ob was drin steht.
Gruß
Werner
-
Hmm, wenn ich dich richtig verstehe, willst du also einen String (std::string) in ein char Array kopieren? Das kannst du wie folgt machen
strcpy(filename, neuerName.c_str());Ansonsten ist es in C++ besser, du verzichtest ganz auf char Arrays, und nimmst grundsätzlich std::string. Wenn du ein nullterminiertes Zeichen Array brauchst, dann erhälst du das, wie oben zu sehen, mit der c_str Member Funktion.
-
Hallo Werner, und erst einmal Danke.
string: ich habe ein "using namespace std" im Code, sollte man bei codeBeispielen wohl angebwn, oder soinst das std:: dazusetzen. Ich merks mir.
die variablen habe ich auch als "m_" geändert.
m_keybuf sind auch 255 char, somit kein (!) problem, 255 (incl 0x0) zu kopieren.
bleibt das Problem in
void klasse::setDateiName ( std::string neuerName) { if ( ! neuerName.empty) { // leuchtet mir ein ! // wie kommt jetzt der string in *m_filename?? while ( *m_filename ++ = *neuerName ;;) ; // das geht nicht }Gruß Hanns
In der Vorschau sehe ich gerade groovemasters lösung:
void btrieve::setDateiname(string neuerDateiname){ if ( ! neuerDateiname.empty()){ strcpy (m_filename,neuerDateiname.c_str()); } }das kompiliert ok.
AUf die Arrays kannichnicht verzichten, da ich in der DatenLib nur eine Function habe, und die hat halt lauter arrays als parameter
Hanns
-
HannsW schrieb:
string: ich habe ein "using namespace std" im Code, sollte man bei codeBeispielen wohl angebwn, oder soinst das std:: dazusetzen. Ich merks mir.
nur zur sicherheit: in headerdateien am besten keine using direktiven verwenden (falls du das tun solltest, wenn sich meine befürchtung bewahrheitet)
AUf die Arrays kannichnicht verzichten, da ich in der DatenLib nur eine Function habe, und die hat halt lauter arrays als parameter
Hannsvector<char> schon in erwägung gezogen?
-
in den header-dateien schreibe ich std:: nur im code-file "using namespace std"
ansonsten werde ich versuchen groovemasters idee, nur strings zu benutzen, so unzusetzten, daß ich in der AUfruf-funktion zur datenbank auf die erforderlichen arrays wandle, was ja mit "meinstring.c_str()" ghene sollte:
-
das wars,Danke