Float-Zahl ausgeben
-
Moin,
einfach Frage, bei der ich mich wohl mal wieder "etwas" blöd anstelle:
Wie gebe ich eine Zahl vom Typ Float aus?
Geht das mit SetDlgItemInt? Wenn man sich die Funktion anguckt, dürfte es ja eigendlich nicht gehen Int != Float und es geht auch nicht. Das habe ich ausprobiert. Aber wie kriege ich die Zahl vom Typ Float in ein statisches Textfenster?Ich glaube, mit wsprintf geht es auch nicht, zumindest steht im Petzold, dass w(v)sprintf nicht für Float gedacht sind. Aber wsprintf (und andere printf Befehle) würden mir die Zahl dann ja auch nicht in das statische Textfenster einfügen.
Also, wie kann ich das lösen?
Vielen Dank schonmal im vorraus.
Mit freundlichen Grüßen
Moadeh
-
Hmmm,
ich habe zwar kaum Ahnung von der WinAPI, aber vielleicht solltest du die float Zahl einfach in einen string umwandeln z.B über ein Stringstream.Gruß Chris
-
char buffer[256] = {0}; ::sprintf (buffer, "%f", meine_float_zahl); // alternativ geht auch %g ::SetDlgItemText (hMyDlg, IDC_MYEDIT, buffer);
-
Okay, Vielen Dank. Das funktioniert schonmal.
Da ich allerdings möchte, dass sich der Wert der über das static ausgegeben wird sich verändert, habe ich statt mit SetDlgItemText zu arbeiten, bei CreateWindow des static als zweiten Parameter buffer angegeben. Das static gibt den richtigen Wert aus und auch als Gleitkommazahl.
Bei !einem! statischen Textfenster geht das noch gut. Sobald ich aber einen zweiten Befehl von sprintf und CreateWindow einsetze, wobei sich keine Parameter der 1. und 2. überschneiden, nichtmals die Position der statics, stürtzt das Programm ab, sobald ich den Button drücken, der dazu führen soll die statics auszugeben.
Ich denke, es hängt damit zusammen, dass ich ja statt mit SetDlgItemText zu arbeiten, den Char-Typ direkt in das static eingefügt habe, da ich grade auch mal versucht habe, als zweiten Paramter einfach "0" einzugeben und plötzlich alles funktioniert hat. Wenn ich ja allerdings mit SetDlgItemText arbeite, reagiert der Button nicht mehr bzw. verändert die Ausgabe nicht, wenn eine Eingabe, die zur Errechnung der Zahl dient, verändert wird und der Buttondruck widerholt wird.
Wie kann ich das Problem lösen, ohne den Befehl SetDlgItemText zu benutzen?
Mit freundlichen Grüßen
Moadeh
-
Moadeh schrieb:
Okay, Vielen Dank. Das funktioniert schonmal.
Da ich allerdings möchte, dass sich der Wert der über das static ausgegeben wird sich verändert, habe ich statt mit SetDlgItemText zu arbeiten, bei CreateWindow des static als zweiten Parameter buffer angegeben. Das static gibt den richtigen Wert aus und auch als Gleitkommazahl.
Bei !einem! statischen Textfenster geht das noch gut. Sobald ich aber einen zweiten Befehl von sprintf und CreateWindow einsetze, wobei sich keine Parameter der 1. und 2. überschneiden, nichtmals die Position der statics, stürtzt das Programm ab, sobald ich den Button drücken, der dazu führen soll die statics auszugeben.
Ich denke, es hängt damit zusammen, dass ich ja statt mit SetDlgItemText zu arbeiten, den Char-Typ direkt in das static eingefügt habe, da ich grade auch mal versucht habe, als zweiten Paramter einfach "0" einzugeben und plötzlich alles funktioniert hat. Wenn ich ja allerdings mit SetDlgItemText arbeite, reagiert der Button nicht mehr bzw. verändert die Ausgabe nicht, wenn eine Eingabe, die zur Errechnung der Zahl dient, verändert wird und der Buttondruck widerholt wird.
Wie kann ich das Problem lösen, ohne den Befehl SetDlgItemText zu benutzen?
Mit freundlichen Grüßen
MoadehAlso tut mir leid ich habe nicht Verstanden was du dort machst. Ein paar Zeilen Code wären auf jedenfall hilfreich. Das einzige was ich verstanden habe ist das du nicht SetDlgItemText verwenden willst. Und da ist meine Frage warum?
schirrmie
-
Ich check auch nix.
-
Okay, tut mir Leid.
if (lParam == (LPARAM) Rechnen) { HWND static; float eingabe1, eingabe2, eingabe3; char *buffer; eingabe1 = GetDlgItemInt(hwnd, 312, NULL, eingabe1); eingabe2 = GetDlgItemInt(hwnd, 316, NULL, eingabe2); eingabe3 = GetDlgItemInt(hwnd, 320, NULL, eingabe3); float ergebniss = ...//Eine Rechnung die sich aus den eingaben zusammensetzt sprintf (buffer, "%f", ergebnis); static = CreateWindow ("static", buffer, WS_CHILD|WS_VISIBLE, 700, 100, 200, 30, hwnd, (HMENU) ID_static, hInst, NULL); }
Das wäre der Code.
Warum ich nicht SetDlgItemText benutzen möchte:
Mal angenommen der zweite Parameter von CreateWindow ist "0", sprich:static = CreateWindow ("static", "0",
Damit der Wert ja trotzdem ausgegeben wird, muss ich dann
SetDlgItemText(hwnd, 327, buffer);
benutzen.
Wenn nur einmal die Editfelder gefüllt werden und der Button gedrückt wird, rechnet er da die Zahl aus und sie wird ausgegeben. Wenn der Benutzer eine neue Eingabe machen will, kann er das nicht weil:
1. Die Ausgabe wird zu dem vorher gesetzten Wert, im Beispiel: 0
2. Der Button sendet anscheinend keine Nachrichten mehr, nachdem 1. getan worden ist. Zumindest passiert nichts mehr.Ich möchte es dem Benutzer allerdings ermöglichen, dass er auch mal etwas ändern darf. Und das kann ich anscheinend nicht mit SetDlgItemText, aber anscheinend mit SetDlgItemInt, wobei das ja weder für Float noch für Char geeignet ist.
Wenn ich dieses genannte Problem einfach so löse wie im Code oben, also, dass der zweite Parameter buffer ist, ändert sich der Wert sobald Eingaben verändert wurden und der Button erneut gedrückt wurde.
Wenn ich jetzt ein zweites statisches Textfenster da reinbringen:
if (lParam == (LPARAM) Rechnen) { HWND static; float eingabe1, eingabe2, eingabe3; char *buffer; eingabe1 = GetDlgItemInt(hwnd, 312, NULL, eingabe1); eingabe2 = GetDlgItemInt(hwnd, 316, NULL, eingabe2); eingabe3 = GetDlgItemInt(hwnd, 320, NULL, eingabe3); float ergebniss = ...//Eine Rechnung die sich aus den eingaben zusammensetzt sprintf (buffer, "%f", ergebnis); static = CreateWindow ("static", buffer, WS_CHILD|WS_VISIBLE, 700, 100, 200, 30, hwnd, (HMENU) ID_static, hInst, NULL); HWND static2; float eingabe4, eingabe5, eingabe6; char *buffer2; eingabe4 = GetDlgItemInt(hwnd, 313, NULL, eingabe4); eingabe5 = GetDlgItemInt(hwnd, 317, NULL, eingabe5); eingabe6 = GetDlgItemInt(hwnd, 321, NULL, eingabe6); float ergebnis2 = ...//Eine Rechnung die sich aus den eingaben zusammensetzt sprintf (buffer2, "%f", ergebnis2); static2 = CreateWindow ("static", buffer2, WS_CHILD|WS_VISIBLE, 700, 140, 200, 30, hwnd, (HMENU) ID_static2, hInst, NULL); }
Wenn ich das mache und der Benutzer dann diesen Button drückt, kommt die Nachricht von Windows, dass das Programm abgestürtzt ist.
Vorher geht ja alles. Mehr dazu kann ich nicht sagen, es stürtzt einfach ab. Abgesehen davon, dass mich Dev-Cpp warnt, weil ich eingabe1-3 nicht als Float definieren soll kommt keinerlei Fehlermeldung.Wenn ich den zweiten Parameter von static2 wieder mal auf "0" setze, funktioniert alles. Bis auf die Tatsache, dass ja nicht der Wert 0 ausgegeben werden soll, sondern ergebnis2 bzw. buffer2. Wie gesagt, ist das Problem nicht mit SetDlgItemText zu bereinigen.
Wie kann ich das Problem lösen?
Mit freundlichen Grüßen
Moadeh
-
Moadeh schrieb:
Wie kann ich das Problem lösen?
In dem du dir die absoluten Grundlagen der C/C++ Programmierung aneignest.
if (lParam == (LPARAM) Rechnen) { HWND static; float eingabe1, eingabe2, eingabe3; char *buffer; eingabe1 = GetDlgItemInt(hwnd, 312, NULL, eingabe1); eingabe2 = GetDlgItemInt(hwnd, 316, NULL, eingabe2); eingabe3 = GetDlgItemInt(hwnd, 320, NULL, eingabe3); float ergebniss = ...//Eine Rechnung die sich aus den eingaben zusammensetzt sprintf (buffer, "%f", ergebnis); static = CreateWindow ("static", buffer, WS_CHILD|WS_VISIBLE, 700, 100, 200, 30, hwnd, (HMENU) ID_static, hInst, NULL); }
buffer zeigt ins Nirvana, ist doch klar, daß es da knallt. Und du solltest deine Variable nicht static nenne, weil das ein Schlüsselwort der Programmiersprache ist. Kann man das so überhaupt kompilieren?
-
1. Ich habe die Namen geändert, sodass ihr das besser verstehen könnt. D.h. mein Textfenster heißt eigendlich nicht "static"
2. Du hast dich jetzt auf den ersten Code bezogen. Das ist allerdings der Code, der funktioniert. Hab ich mich wohl wieder unverständlich ausgedrückt. Sorry. Kann ja sein das buffer ins Leere zeigt, aber wieso gibt static dann den richtigen Wert aus? Das Programm stürtzt ja erst ab, sobald es nicht mehr nur um ein Textfenster geht.
-
Moadeh schrieb:
Kann ja sein das buffer ins Leere zeigt,
Ist so.
aber wieso gibt static dann den richtigen Wert aus?
Weil nicht alles was falsch (grundfalsch!) ist sofort crasht, sondern manchmal dummerweise trotzdem das tut was man erwartet. Manchmal sogar "immer", manchmal nur hin und wieder, ... kommt ganz auf die Art des Fehlers drauf an.
Das Programm stürtzt ja erst ab, sobald es nicht mehr nur um ein Textfenster geht.
Ach? Es kommt sehr häufig vor dass Fehler nicht sofort an der Stelle wo was falsch ist zu einem Problem führen, sondern später. Oder nur unter gewissen Umständen. Oder nur wenn grad Weihnachten ist. Bzw. auch gerne erst dann wenn der Chef das Programm begutachtet/ausprobiert. Oder erst beim Kunden.
Das ist eine der Sachen die es so schwer macht fehlerfreie Programme zu schreiben, und Programme mit Fehlern zu debuggen.
Zu denken "nö, das geht ja bis Punkt XYZ, also passt das was vorher steht schon" ist das dümmste was du (für dich selbst) machen kannst -- weil es ganz einfach nicht stimmt
Tip: verwende eine IDE mit eingebautem Debugger wie z.B. Visual Studio 2005. Wenn du ein Programm mit so einem Fehler (nicht initialisierter Zeiger dereferenziert) als Debug Build unterm Debugger von VS 2005 laufen lässt, dann kracht es an der Stelle mit ziemlicher Sicherheit sofort.