Zeichenfolge in Zahlen umwandeln?

Hi, hab ne (vieleicht etwas doofe) Frage:

Wie kann man Zeichenfolgen (also Strings) in Zahlen umwandeln?

Grund ist folgender:

Ich schreib grad ein Programm welches Registrywerte ausliest (und verändert). Jedoch stehen (sinnvollerweise) einige Zahlen nicht als DWORD drin sondern als Zeichenfolgen… Aber ich muss mit diesen werten rechnen und das geht mit strings nunmal nicht.

Ausgelesen werden die Werte als „unsigned char *“ und werden dann umgewandelt. Funktioniert bei Strings wunderbar (also wenn ich diese als String verwenden will) jedoch wenn ich diese in „Int“ oder änliches umwandeln will bekomme ich zwar verschiedene Zahlen raus, jedoch nie die die in der Registry stehen…

Umwandeln tu ich die Werte mit dem „reinterpret_cast-Operator“.

Thx im vorraus.

Hi, hab ne (vieleicht etwas doofe) Frage:

Wie kann man Zeichenfolgen (also Strings) in Zahlen umwandeln?

In „sauberem“ C++ ging das IIRC so ähnlich:

template T convert( string s ) {
 stringstream sst;
 T temp;

 sst \> temp;

 return temp;
}

Allerdings sollten im Standard-Header stdlib.h (bzw. cstdlib für C++) auch die Funktionen atoi, atol und strtol definiert sein. Die sind ganz angenehm verwendbar.

thx erstma für schnelle antwort :smile:

ich hab aber jetzt das Problem das ich beim compilieren folgenden fehler bekomme:

error C2783: ‚T __cdecl convert(class CString)‘ : Vorlagenargument fuer ‚T‘ konnte nicht hergeleitet werden

ich hab nicht so ganz rausbekommen wo ich die volagendefinition reinschreiben muss und habse daher in meiner Hauptquellcodedatei ("Programm"Dlg.cpp) am anfang nach den Include Befehlen eingesetzt.
Da aber „String“ nicht erkannt wurde hab ich einfach mal „CString“ draus gemacht :wink: (der fehler oben kommt aber auch bei „char“ etc.)

template T convert( CString s )
{
stringstream sst;
T temp;
sst > temp;
return temp;
}

im Quellcode rufe ich die Funktion folgendermaßen auf:

CString test1;
test1 = „23“;
convert( test1);

Also woran liegt es dasses nicht geht? Ich schätze mal der Ort wo die Vorlage definiert wird stimmt nicht oder?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

template T convert( CString s )
{
stringstream sst;
T temp;
sst > temp;
return temp;
}

im Quellcode rufe ich die Funktion folgendermaßen auf:

CString test1;
test1 = „23“;
convert( test1);

Also woran liegt es dasses nicht geht? Ich schätze mal der Ort
wo die Vorlage definiert wird stimmt nicht oder?

Das template weiss nicht, für welchen Typ es instantiert werden soll. Bei Templates, die das Argument lediglich im Rückgabetyp verwenden, musst du beim Aufruf ohnehin die Ausprägung angeben:

convert( test1 );

Gruß Markus

Das template weiss nicht, für welchen Typ es instantiert
werden soll. Bei Templates, die das Argument lediglich im
Rückgabetyp verwenden, musst du beim Aufruf ohnehin die
Ausprägung angeben:

convert( test1 );

Gruß Markus

Ah ja das war es :smile:

nur hab ich nu gleich 3 Fehler:

error C2065: ‚stringstream‘ : nichtdeklarierter Bezeichner
Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage ‚int __cdecl convert(class CString)‘
error C2146: Syntaxfehler : Fehlendes ‚;‘ vor Bezeichner ‚sst‘
Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage ‚int __cdecl convert(class CString)‘
error C2065: ‚sst‘ : nichtdeklarierter Bezeichner
Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage ‚int __cdecl convert(class CString)‘
warning C4552: ‚>>‘ : Operator hat keine Auswirkungen; Operator mit Seiteneffekt erwartet

er kommt also mit der ganzen funktion nicht zurecht…

btw: ich nutze C++ 6.0 (Autorenedition) und habe mein programm mit dem MFC-Anwendungs-Assistenten (exe) erstellt/begonnen.

hm ich werd mal nach den anderen funktionen suchen die vorher erwähnt wurden. :smile:

nur hab ich nu gleich 3 Fehler:

error C2065: ‚stringstream‘ : nichtdeklarierter Bezeichner
Siehe Verweis auf Instantiierung der kompilierten

Du musst den entsprechenden Header noch einbinden (#include ) und ggf. (wenn du nicht sowieso schon im std-namespace bist) entweder direkt danach „using std::stringstream“ schreiben oder im Code statt „stringstream“ „std::stringstream“ schreiben.

Du musst den entsprechenden Header noch einbinden (#include
) und ggf. (wenn du nicht sowieso schon im
std-namespace bist) entweder direkt danach „using
std::stringstream“ schreiben oder im Code statt „stringstream“
„std::stringstream“ schreiben.

aso :smile:

aber hatt sich jetzt eh erledigt, da ich einfach mal nach „atoi“ gesucht hab (in der C++ internen hilfe) und : gesucht -> gefunden -> ausprobiert -> es geht! :smiley:

nochmal big thx für die hilfe :smile:
(hätt ich hier schonmal eher gefragt, hätt ich mir 2 Tage grübeln ersparen können :wink: )

passt zwar nicht ganz zur überschrift aber ne Frage zum gleichen thema:

Das mit dem Werte umrechnen passt ja, aber was ist wenn ich DWORD werte aus der Registry auslesen will?

Die DWORD werte müssen ja erst noch irgendwie umgerechnet werden, in einem Beispiel, welches ich als Hilfestellung nutze wird dies folgendermaßen gemacht:

cout

passt zwar nicht ganz zur überschrift aber ne Frage zum
gleichen thema:

Das mit dem Werte umrechnen passt ja, aber was ist wenn ich
DWORD werte aus der Registry auslesen will?

Wenn ich das richtig verstehe, hast du im Array values ab Position 6 den Wert, den du brauchst. Das sollte so funktionieren:

DWORD var = *(DWORD*)&(values[6]);

Dazu muss man sagen, dass ich von der Windws-Registry absolute keine Ahnung habe, ich weiss also auch nicht, in welcher Form die Daten da rausfallen.

Wenn ich das richtig verstehe, hast du im Array values ab
Position 6 den Wert, den du brauchst. Das sollte so
funktionieren:

DWORD var = *(DWORD*)&(values[6]);

Dazu muss man sagen, dass ich von der Windws-Registry absolute
keine Ahnung habe, ich weiss also auch nicht, in welcher Form
die Daten da rausfallen.

ja in der Position 6 hab ich einen DWORD Wert aus der Registry ausgelesen, welcher in der Registry, einen wert von 0x00000001(1) hatt.

aber im Gegensatz zu Zeichenfolgen, werden die DWORDs nicht direkt gespeicher (ka warum).
Beispiel:

die Variable „pBuffer“ beinhalted den ausgelesenen wert.
Hier ein Bild wie der Variableninhalt aussieht wenn man eine Zeichenfolge (welche „German“ leuted :wink: ) ausliest:

http://deadmasters.home.t-link.de/c-1.jpg

wenn ich jedoch ein DWORD auslese welches einen Wert von 0x00000001(1) hatt kommt folgendes raus:

http://deadmasters.home.t-link.de/c-2.jpg

und die Bitfolge ändert sich auch bei verschiedenen DWords obwohl bei allen nur eine 1 drinsteht…

und eben dieses kauderwelsch muss ich irgendwie umrechnen, damit ich die 1 rausbekomm.

btw.: hab deinen code ausprobiert, aber da bekomm ich auch nur „kauderwelsch“ raus :wink: (welchen ich bisher auch mit allen anderen umwandlungen erhalten habe)

ja in der Position 6 hab ich einen DWORD Wert aus der Registry
ausgelesen, welcher in der Registry, einen wert von
0x00000001(1) hatt.

aber im Gegensatz zu Zeichenfolgen, werden die DWORDs nicht
direkt gespeicher (ka warum).
Beispiel:

die Variable „pBuffer“ beinhalted den ausgelesenen wert.
Hier ein Bild wie der Variableninhalt aussieht wenn man eine
Zeichenfolge (welche „German“ leuted :wink: ) ausliest:

http://deadmasters.home.t-link.de/c-1.jpg

0x00782030 ist höchstens ein Zeiger auf einen Speicherbereich, in dem eine String-Repräsentation vom entsprechenden Wert liegt.

wenn ich jedoch ein DWORD auslese welches einen Wert von
0x00000001(1) hatt kommt folgendes raus:

http://deadmasters.home.t-link.de/c-2.jpg

Und das ist dann wohl auch ein Zeiger.

Was passiert denn, wenn du

\*(DWORD\*)(values[valuesa]);

zum Auslesen benutzt?

Es würde vielleicht helfen, ein wenig Code zu sehen und die Typen der verschiedenen Variablen zu kennen.

0x00782030 ist höchstens ein Zeiger auf einen Speicherbereich,
in dem eine String-Repräsentation vom entsprechenden Wert
liegt.

wenn ich jedoch ein DWORD auslese welches einen Wert von
0x00000001(1) hatt kommt folgendes raus:

http://deadmasters.home.t-link.de/c-2.jpg

Und das ist dann wohl auch ein Zeiger.

Was passiert denn, wenn du

*(DWORD*)(values[valuesa]);

zum Auslesen benutzt?

Es würde vielleicht helfen, ein wenig Code zu sehen und die
Typen der verschiedenen Variablen zu kennen.

also das mit dem DWORd direkt auslesen hatte ich auchschon probiert, aber das Problem is das die „Registrywerteauslesefunktion“ zwingend eine „unsigned char *“ Variable braucht :confused:

naja hier mal Variablen:

DWORD dwsize;
CString value;
unsigned int *value2;
double value3;

HKEY openkeys[26];
short int openkeysa;

char *getvalues[46];
short int getvaluesa;

unsigned char *values[46];
short int valuesa;

(value2 is z.z. nur zum Testen)

und hier die auslese Funktion:

do
{
if (RegQueryValueEx(openkeys[openkeysa],getvalues[getvaluesa],NULL,NULL,NULL, &dwsize) == ERROR_SUCCESS)
; //MessageBox(„Stufe 1 erfolgreich“);
else
{
MessageBox(getvalues[getvaluesa],„Wert nicht gefunden/lesbar:“,MB_ICONWARNING);
break;
}
values[valuesa] = (unsigned char *)malloc(dwsize);

if (RegQueryValueEx(openkeys[openkeysa],getvalues[getvaluesa],NULL,NULL,values[valuesa], &dwsize) == ERROR_SUCCESS)
; //MessageBox(„Stufe 2 erfolgreich“);
else
{
MessageBox(getvalues[getvaluesa],„Wert nicht auslesbar:“,MB_ICONWARNING);
break;
}

kurze erklärung: die erste Funktion liest blos die größe des wertes aus und rechnet dann mit der Malloc Funktion die benötigte Puffergröße (von pBuffer) aus. Die 3. Funktion liest schlieslich den Wert aus und speicher ihn in die Variable „pBuffer“.
(Ka ab dieses Pufferausrechnen nen großen vorteil bringt, aber es wurde innem buch empfohlen :wink: )

btw: warum ich nicht gleich das Array statt der pBuffer Variable genommen habe weis ich auch nicht… :smiley:
habs jetzt geändert…

NEIN! Ich krieg die tür nichtmerh zu! 8[

hab lösung gefunden…

und die is so verdammt scheiße einfach 8[

ich hab diese Miniformel schon so oft „in der Hand“ gehabt…

omg… naja hier lösung:

DWORD value2;

value2 = *((unsigned int *)values[6]);

das ist alles…
die DWORD Variable hatt dan den entsprechenden Wert inside…

ich liebe es wenn man die komplieziertesden Dinge probiert und dann isses soetwas mehr als extrem einfaches…

soll ich mich nu eigentlich freuen oder soll ich Heulen? 8[

btw: Thx für die hilfe von euch :smile: