Hackerboard WikiHaboBlog

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

CPP: Gleich und doch nicht gleich

Diskussion: CPP: Gleich und doch nicht gleich im Forum Code Kitchen, in der Kategorie Software Home; hallo ich habe folgendes problem: wenn ich mit RegQueryValueEx den Wert von einem RegEintrag hole (REG_SZ), und das dann vergleiche ...

Antwort
Alt 18.05.05, 21:03   #1 (permalink)
felikz
Guest
 
Likes:
Standard CPP: Gleich und doch nicht gleich


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?

  Mit Zitat antworten
Alt 19.05.05, 08:39   #2 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

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...
Der Meister ist offline   Mit Zitat antworten
   
HaBOT
 

Werbung ist gerade online    
Alt 19.05.05, 14:13   #3 (permalink)
 
Registriert seit: 02.11.04
M@rex Leistung: Facit NTK
Likes: 0
Standard

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.
M@rex ist offline   Mit Zitat antworten
Alt 19.05.05, 15:16   #4 (permalink)
felikz
Guest
 
Likes:
Standard

Zitat:
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?
  Mit Zitat antworten
Alt 19.05.05, 15:57   #5 (permalink)
Ray
 
Registriert seit: 06.08.02
Ray Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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.
Ray ist offline   Mit Zitat antworten
Alt 20.05.05, 01:09   #6 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

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...
Der Meister ist offline   Mit Zitat antworten
Alt 20.05.05, 03:06   #7 (permalink)
Ray
 
Registriert seit: 06.08.02
Ray Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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. :-)
Ray ist offline   Mit Zitat antworten
Alt 20.05.05, 18:50   #8 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

schneller? denk ich eher nicht... aber einfacher zu handhaben
Der Meister ist offline   Mit Zitat antworten
Alt 21.05.05, 01:39   #9 (permalink)
Ray
 
Registriert seit: 06.08.02
Ray Leistung: Facit NTK
Likes: 0
Standard

Wenn ich mir das bounds checken vor dem Vergleich spare, sehe ich das als schneller an. Aber das ist wohl Ansichtssache...

Cheers
Ray ist offline   Mit Zitat antworten
Alt 21.05.05, 17:47   #10 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

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
Der Meister ist offline   Mit Zitat antworten
Alt 22.05.05, 04:07   #11 (permalink)
Ray
 
Registriert seit: 06.08.02
Ray Leistung: Facit NTK
Likes: 0
Standard

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.
Ray ist offline   Mit Zitat antworten
Alt 22.05.05, 11:19   #12 (permalink)
 
Registriert seit: 05.04.04
Der Meister Leistung: Facit NTK
Likes: 0
Standard

Zitat:
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

Zitat:
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...
Der Meister ist offline   Mit Zitat antworten
Alt 22.05.05, 13:36   #13 (permalink)
Ray
 
Registriert seit: 06.08.02
Ray Leistung: Facit NTK
Likes: 0
Standard

Damit kann ich leben. ;-)
Ray ist offline   Mit Zitat antworten
Alt 22.05.05, 22:33   #14 (permalink)
felikz
Guest
 
Likes:
Standard

also danke schon mal

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


thanx
  Mit Zitat antworten
Antwort
   

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » CPP: Gleich und doch nicht gleich
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Pc geht an und gleich wieder aus solemboom Die Problemzone 5 20.02.07 22:17
.avi gleich auf DVD?? King Music- & Filmbox 0 17.04.04 15:07
Gleich mal 2 Fragen !! nebula Music- & Filmbox 2 07.10.03 16:23
gleich 2 probleme auf einmal Bobbal Windows 4 25.08.03 17:50
neudabei & gleich was fragen... [generic] (In)security allgemein 4 15.11.01 09:54


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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61