Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NicoWe

Treue Seele

  • »NicoWe« ist der Autor dieses Themas

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

1

16.07.2007, 14:49

char[] zu double konvertieren?

Hallo

Ich habe eine Frage. Und zwar möchte ich (mit GetWindowText) den Inhalt eines Child-Fensters abfragen und wenn eine Zahl im String vorhanden ist, diese in double konvertieren.
Ich hab mir eine Funktion gemacht, die ein dynamisches Array in einen double konvertieren soll.
1. Wie krieg ich die Einträge im Array raus?
2. gibt es einfachere Möglichkeiten als:

C-/C++-Quelltext

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
double konvert(char in[])
{
    int Einträge; // Wie kann ich die rauskriegen?

    int Nachkomma = 0;
    int Vorkomma = 0;
    double Ergebnis = 0;
 
    // Einträge auf Komma überprüfen

    for(int i = Einträge; i >= 0; i--)
    {
        if(in[i] == ',' || in[i] == '.')
            Nachkomma = Einträge - i-1; // Ein Nachkomma ist das Komma

    }
    Vorkomma = Einträge-Nachkomma+1; // Wieder Komma berücksichtigen


    for(int i = Vorkomma; i>= 0; i--)
    {
        if(i == Vorkomma)
            Ergebnis += in[i];  // Erste Stelle vor dem Komma zählt normal

        else
            Ergebnis += in[i] * (10^i); // Zehner zählen zehnfach, Hunderter hundertfach, etc.

    }

    // Das gleiche auch für nachkommastellen, nur antstatt Potenz, Wurzel

    for(int i = Einträge-Nachkomma; i<= Einträge; i++)
    {
            Ergebnis += in[i] * (10Wurzel mit i); // Zehntel, Hundertstel, etc.

    }
}
    


Danke im schon mal für alle Antworten :)
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

16.07.2007, 15:27

schau dir mal std::stringstream an, das sollte was passendes bieten ;)

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

16.07.2007, 15:28

So wie ich dich verstanden habe, brauchst du nur eine Funktion für das Konvertieren String -> Double. Ich zitiere erstes Suchergebnis bei Google:

Quellcode

1
2
3
4
5
6
7
#include <stdlib.h>
typedef char* string;

string strVar = "27";
double dVar = 0;

dVar = atof(strVar);

Sprich, es gibt in der Standardbibliothek die Funktion "atof", die genau das leistet, was du brauchst.

NicoWe

Treue Seele

  • »NicoWe« ist der Autor dieses Themas

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

4

16.07.2007, 15:53

Yuhu

Es funktioniert! :D :D
Hab bei google "char zu double konvertieren C++" angegeben. :?

EDIT
Doch nicht. Es funktioniert nur, wenn ich den string selber definiere.
Wenn ich mit GetWindowText den Inhalt des Childs in die Variable einlese, kommt die Messagebox
Childfenster.exe hat einen Fehler festgestellt und muss beendet werden
und die S(biep)e mit Problembericht senden etc.

EDIT2
@grek42: Ich kenn mich mit sstream nicht so gut aus, weißt du wo ich eine Funktionssammlung o.ä. finde(MSDN und Google geben nichts für mich verständliches her)
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

16.07.2007, 16:55

Der C++ Weg um Zahlen<->String zu konvertieren ist die verwendung von std::stringstream und nicht irgendwelche veralteten Funktionen aus C-Zeiten. Stringstream kann alles und macht alles sicher, C-Funktionen können wenig und machen alles unsicher!

C-/C++-Quelltext

1
2
3
4
5
std::stringstream stream;
double d;

stream << "3.1415";
stream >> d;
@D13_Dreinig

6

16.07.2007, 17:27

Sind aber zum teil schneller ...

C-/C++-Quelltext

1
2
3
4
5
#include <sstream>

std::ostringstream ss("3.4212");
double value;
ss >> value;
kannst sogar kontrollieren ob es möglich war in einen double zu konvertieren ... guck am einfachsten mal bei google.de nach C++-Referenz ...

atof geht aber auch ... kannst nur nicht zwischen fehlschlag und der eingabe "0" unterscheiden usw ...

C-/C++-Quelltext

1
2
3
#include <cstdlib>

double value = std::atof("3.4212");
...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

16.07.2007, 18:42

Jo, is trotzdem veraltet und C++ bietet eine bessere Lösung wenn man auf die paar ms Verzögerung verzichten kann.

Hier nochmal mögliche Lösungen von Zahl<->String:

std::stringstream:

Grundlegende Vorgehensweise:

C-/C++-Quelltext

1
2
3
4
5
std::stringstream stream;
double d;

stream << "3.1415";
stream >> d;


Per lexical_cast:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template< typename Dest, typename Source >
Dest lexical_cast( const Source& src )
{
    std::stringstream cnv;
    Dest result;

    if ( !( cnv << src && cnv >> result && ( cnv >> std::ws ).eof() ) )
    {
        throw std::logic_error( "lexical_cast failed" );
    }

    return result;
}

int main()
{
    double d = lexical_cast< double >( "3.1415" );
}


Oder per boost::lexical_cast:

C-/C++-Quelltext

1
double d = boost::lexical_cast< double >( "3.1415" );


C Funktionen

atof, atoi, atol:

C-/C++-Quelltext

1
double d = atof( "3.1415" );


sprintf:

C-/C++-Quelltext

1
2
3
double d = 3.1415;
char buf[ 10 ];
sprintf( buf, "%g", d );


sscanf:

C-/C++-Quelltext

1
2
float f = 0;
sscanf( "3.1415", "%f", &f );


strtod, strtol, strtoul:

C-/C++-Quelltext

1
2
char *pos = 0;
double d = strtod( "3.1415", &pos );
@D13_Dreinig

NicoWe

Treue Seele

  • »NicoWe« ist der Autor dieses Themas

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

8

16.07.2007, 18:42

Yepe

Diesmal funkioniert es sogar OHNE Problembericht etc.! :D *freu*

Und ich hab verstanden, wie's sich mit stringstreams verhält! :D *freu*

Danke!

EDIT
Ich benutze stringstream. Auch wenn es schnellere Möglichkeiten gibt(sstream hab ich gerade verstanden, und wie soll in mein Motto "Learning bei doing" durchsetzen, wenn ich "doing" auslasse ;) )
Trotzdem danke für die Funktionsübersicht!
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

16.07.2007, 19:16

Wegen der schönen Funktionsübersicht muss die Arbeit von David_pb belohnt werden, ab damit ins FAQ!

Dieser Thrad wurde wieder aus dem FAQ entfernt, da ich wahrscheinlich zu vorschnell war ^^.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

23.07.2007, 08:17

Zitat von »"Nightvision"«


atof ist selbstverständlich veraltet und sollte aus gründen der sicherheit natürlich nicht mehr verwendet werden. Wer es aber trotzdem etwas schneller als mit der stringstream-variante haben möchte, für den ist strtod sicher eine gute variante. Auch dabei kann man eine fehlerabfrage einbauen. Hier ein Beispiel wie wir es verwenden:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
(...)
double _value;
char* _pStr_end;

// check for legal float value
_value = (double)(strtod(pStr_stringToConvert,&_pStr_end));
if(*_pStr_end != '\0') {
  // error handling
  (...)
}
(...)


Entdeckt strtod ein 'falsches' Zeichen, dann wird die Funktion abgebrochen und der gelieferte Zeiger bleibt an der Fehlerstelle stehen. Läuft alles durch, dh. im String war wirklich ein float, dann bleibt der Zeiger am Stringende stehen.

Wie erwähnt, das ist ein Beispiel aus einem Gerätetreiber bei dem es um Geschwindigkeit ging ohne gleich Assembler zu verwenden.

Werbeanzeige