CPP: Gleich und doch nicht gleich

  • Themenstarter Themenstarter felikz
  • Beginndatum Beginndatum
F

felikz

Guest
hallo
ich habe folgendes problem:

wenn ich mit RegQueryValueEx den Wert von einem RegEintrag hole (REG_SZ), und das dann vergleiche mit einem char der eigentlich genau denselben inhalt hat wie der RegEintrag, wenn ich das mit if( x == y) vergleiche, und es eigentlich wirklich genau dasselbe ist, wird immer so gehandelt als wäre es ungleich.

woran liegt das / wie müsste der quellcode aussehen damit ich korrekt einen Registry Wert mit einem anderem char vergleichen kann?
 
ich denke mal, in deinem beispiel sind x und y char-arrays, d.h. deren typ ist char* oder char[]... wenn man sich jetzt mal klar macht, was die beiden sind, dann ist das problem sofort klar: es sind beides zeiger, die auf verschiedene speicherstellen zeigen. dabei ist egal, was dort steht, ein x == y vergleicht immer nur die zeiger selbst...
und lösen kannst du das ganze, indem du (soweit es möglich ist) die char-arrays durch std::string ersetzt... damit sparst du dir eine menge ärger und auch der vergleich mit dem operator == ist dadurch möglich...
 
Oder fals man unbedingt auf std::string verzichten will kann man auch einfach ne Schleife machen die jeden Array-Eintrag vergleicht. Dann noch ne bool-Varibale die bei einem Fehler auf "false" gesetzt wird und schon klapps wunderbar. ;-) Allerdings sehr umständlich, müsstest du halt in ne Funktion packen.
 
Original von M@rex
Oder fals man unbedingt auf std::string verzichten will kann man auch einfach ne Schleife machen die jeden Array-Eintrag vergleicht. Dann noch ne bool-Varibale die bei einem Fehler auf "false" gesetzt wird und schon klapps wunderbar. ;-) Allerdings sehr umständlich, müsstest du halt in ne Funktion packen.

du meinst sowas wie:

if ( x[1] == y[1] )
{
if ( x[2] == y[2] )
{
und so weiter......}}

oder?
 
Original von M@rex
Oder fals man unbedingt auf std::string verzichten will kann man auch einfach ne Schleife machen die jeden Array-Eintrag vergleicht. Dann noch ne bool-Varibale die bei einem Fehler auf "false" gesetzt wird und schon klapps wunderbar. ;-) Allerdings sehr umständlich, müsstest du halt in ne Funktion packen.


Bla.

int memcmp ( const void * buffer1, const void * buffer2, size_t num );

Cheers, Ray.
 
naja, für "strings" gibts wenn dann noch strncmp... auch wenn memcmp sicher gehen würde, strncmp wäre die passendere lösung ;)
allerdings wüsste ich keinen grund, wieso man auf std::string verzichten sollte...
 
Original von Der Meister
naja, für "strings" gibts wenn dann noch strncmp... auch wenn memcmp sicher gehen würde, strncmp wäre die passendere lösung ;)

Die Leute konstruieren ja leider für alle Arrays seltsame Funktionen, daher memcmp. strncmp ist bei Strings natürlich schneller. :-)
 
Wenn ich mir das bounds checken vor dem Vergleich spare, sehe ich das als schneller an. Aber das ist wohl Ansichtssache...

Cheers
 
memcmp macht immer einen vergleich, um nicht schon am ende zu sein...
strncmp macht dies auch und zusätzlich noch den test auf '\0'... dürfte also eher nicht schneller sein ;)
 
Ich habe nicht gesagt, daß der Vergleich selbst schneller ist.

Wenn ich zwei Strings mit strncmp vergleiche, kann es mir eigentlich egal sein, wie gross ich den Bereich wähle, da ja eh nur höchstens bis zum Terminator geprüft wird. Daher muss ich vorher nicht extra prüfen bzw. speichern, wie lang meine Zeichenkette(n) ist/sind. Ich kann im faulsten Fall sogar einfach die größte mögliche Länge eines Strings in meinem Problem angeben.

Bei memcmp wird jedoch u.U. der komplette Bereich überprüft. Das heisst: in diesem Falle und wenn hinter dem Terminator noch weitere Daten stehen, und der Bereich größer ist als der Abstand vom ersten Zeichen bis zum Terminator, wird das Ergebnis verfälscht. Deswegen muss ich irgendwie sicherstellen, daß nur bis zum Terminator überprüft wird, also muss ich extra Code einbauen, der das bewirkt. Das kostet je nach Problem mehr oder weniger Zeit. Im Allgemeinen bekommt man das mit strncmp/strcmp dann schneller. Das hängt natürlich auch vom Problem und den Eingaben und man kann sicher Fälle für oder gegen diese Aussage konstruieren, aber im Allgemeinen wird das schneller laufen. Das weiss ich aus leidvoller Erfahrung mit Mooshak. :D
 
Im Allgemeinen bekommt man das mit strncmp/strcmp dann schneller.
klar, hängt vom jeweiligen problem ab, allerdings würde ich mich nicht darauf verlassen, dass strncmp da immer (oder meist) schneller ist. der alleinige funktionsaufruf ist es jedenfalls nicht und ich glaube eher nicht, dass der zusätzliche aufwand bei bei memcmp diesen vorteil immer auffrisst... aber das müsste man wohl im einzelnen testen und ist wie gesagt von problem zu problem verschieden... mir ging es bis jetzt aber immer um die funktion alleine ;)

Ich kann im faulsten Fall sogar einfach die größte mögliche Länge eines Strings in meinem Problem angeben.
falls du damit die größe des (kleineren) arrays meinst, ja... das ist auch der sinn der sache, denn auf '\0' als terminator kann man sich nicht immer verlassen... die ganzen buffer-overflows (die meist eben genau durch so ein problem entstehen) beweisen das...
 
also danke schon mal

mein problem wurde gelöst!
ich benutze jetzt memcmp!!!


thanx
 
Zurück
Oben