Fehler zum ausflippen...
-
SYSTEMTIME st; GetSystemTime(&st); char datum[15]; char tag[3]; char monat[3]; char jahr[5]; ZeroMemory(datum,15); ZeroMemory(tag,3); ZeroMemory(monat,3); ZeroMemory(jahr,5); int iTag = (int)(st.wDay); int iMonat = (int)(st.wMonth); int iJahr = (int)(st.wYear); itoa(iTag, tag , 10); itoa(iMonat, monat , 10); itoa(iJahr, jahr , 10); if(lstrlen(tag)==1) lstrcat(datum,TEXT("0")); lstrcat(datum,tag); lstrcat(datum," : "); if(lstrlen(monat)==1) lstrcat(datum,TEXT("0")); lstrcat(datum,monat); lstrcat(datum," : "); lstrcat(datum,jahr); // "tt . mm . jjjjt" // (t == terminating-NULL) SetWindowText(hMain, datum); //erzeugt nichts oder unsinnige komige Zeichen in der Titelleiste
-
Sorry Tolga, aber wenn du schon ins C++ Forum postest solltest du auch mal gebrauch von C++ Features machen. Dein Code ist zum Kotzen.
-
Wenn ich den Inhalt von datum mit lstrcmp() überprüfe stimmt alles. Da ist das aktuelle Datum in der gewollten Form. Nur die Ausgabe klappt cniht.
Ich vermute mal das ist ein UNICODE / ANSI Problem aber habe im google und in der forensuchen nix gefunden dazu, was muss ich tun?
-
Erbrechen schrieb:
Sorry Tolga, aber wenn du schon ins C++ Forum postest solltest du auch mal gebrauch von C++ Features machen. Dein Code ist zum Kotzen.
Ich darf unter keinen Umständen sprintf oder string benutzen. Alles muss so mauell wie möglich gehn.
-
Tolga schrieb:
Ich darf unter keinen Umständen sprintf...
Erbrechen hat mit C++ Features mit Sicherheit nicht sprintf gemeint.
Zur Sache, wenn du schon ANSI / UNICODE kompatiblen Code schreiben willst, dann solltest du das auch von vorn bis hinten durchziehen:char datum[15]; // falsch ... TCHAR datum[15]; // richtig ... ZeroMemory(datum,15); // falsch ... memset(datum, 0, sizeof(datum)); // richtig ... lstrcat(datum," : "); // falsch ... lstrcat(datum, TEXT(" : ")); // richtig ...
noch was:
- Text Einrückung erzeugt wesentlich lesbareren Code
- die Casts bei den SYSTEMTIME Membern kannst du dir sparen, wenn ich das richtig gesehen hab sind die WORD (also unsigned short) und das kann der Compiler implizit in int wandeln
- hast du dir schon mal strftime bzw. wcsftime angeschaut, ist vielleicht genau das was du brauchst
-
hallo groovemaster.
Danke für deine konstruktive Antwort.
Aber Tipps helfen cniht. das ergebnis ist daselbe.Ausserdem:
Du sagtest bleib bei einer sache: entweder unicode oder ansi.
Soweit ich das sehe ist in dem code da oben ausnahmslos alles ansi...
also müsste doch alles gut sein?? oder cniht?Hier ahbe ich nen modifizierten Code, an dem meienr Meinung nach nichts mehr bemängelt werden kann...
ich arbeite unter Windows XP... (also ist der Standard UNICODE)
Wie gesagt, ich möchte alles manuell machen und möchte unter keinen Umständen eine fremde Funktion fürs Auslesen des datums benutzen..Hier der Code:
TCHAR* date() { SYSTEMTIME st; GetSystemTime(&st); TCHAR datum[15]; TCHAR tag[3]; TCHAR monat[3]; TCHAR jahr[5]; ZeroMemory(datum,15); ZeroMemory(tag,3); ZeroMemory(monat,3); ZeroMemory(jahr,5); itoa(st.wDay, tag , 10); itoa(st.wMonth, monat , 10); itoa(st.wYear, jahr , 10); if(lstrlen(tag)==1) lstrcat(datum,TEXT("0")); lstrcat(datum,tag); lstrcat(datum,TEXT(" : ")); if(lstrlen(monat)==1) lstrcat(datum,TEXT("0")); lstrcat(datum,monat); lstrcat(datum,TEXT(" : ")); lstrcat(datum,jahr); return (datum); }
-
Tolga schrieb:
Wie gesagt, ich möchte alles manuell machen und möchte unter keinen Umständen eine fremde Funktion fürs Auslesen des datums benutzen..
Warum? Lerneffekt? Es gibt keins... Zudem gibt man keinen Zeiger auf ein lokales Objekt zurück, denn nach dem return ist es längst zersört.
-
Bin Erfahrener Anfänger der seit langen sehr selten programmiert
-
Naja, "keine fremde Funktion ... benutzen"? Warum stellst Du dann die Frage?
So kann man's auch machen:
SYSTEMTIME SystemTime; TCHAR lpszMsg[94] = TEXT(""); GetLocalTime (&SystemTime); wsprintf (lpszMsg, TEXT("Start: %s, den %02d.%02d.%04d um %d:%d Uhr %d,%d Sek.\r\n"), SystemTime.wDayOfWeek == 1 ? TEXT("Mo") : (SystemTime.wDayOfWeek == 2 ? TEXT("Di") : (SystemTime.wDayOfWeek == 3 ? TEXT("Mi") : (SystemTime.wDayOfWeek == 4 ? TEXT("Do") : (SystemTime.wDayOfWeek == 5 ? TEXT("Fr") : (SystemTime.wDayOfWeek == 6 ? TEXT("Sa") : (SystemTime.wDayOfWeek == 7 ? TEXT("So") : TEXT("Heute"))))))), SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, SystemTime.wMilliseconds);
ABER - wie Du schon geschreiben hast: "... keine fremde Funktion benutzen"!
Blackbird
-
Tolga schrieb:
Ausserdem:
Du sagtest bleib bei einer sache: entweder unicode oder ansi.Nein, sagte ich nicht. Du hast wahrscheinlich das Prinzip hinter der Windows Ansi / Unicode Funktionalität nicht verstanden. Deshalb ist dein Code nach wie vor falsch.
TCHAR ist zB in der Ansi Version char (single-byte character) und bei Unicode ein 16 bit wchar_t (wide character). Mit welchem Characterset compiliert wird, hat man früher zB mit einem UNICODE Makro bestimmt. In .NET gibts dafür eine eigene Compilereinstellung. Wie das dann allerdings intern geregelt wird, kann ich dir nicht sagen.
Weshalb ich sagte, du sollst die Ansi / Unicode Kompatibilität von vorn bis hinten durchziehen, liegt daran, dass du das nicht einheitlich machst.
itoa (besser _itoa da kein Standard und glaub ich eher zu Posix gehört) ist zB eine reine Ansi Version. Dh egal welches Characterset du benutzt, _itoa benutzt immer char Strings. lstrcat zB ist so ein Ansi / Unicode Mix, also bei Ansi werden char Strings, bei Unicode wchar_t Strings benutzt.
Ausserdem sind deine ZeroMemory Anweisungen nach wie vor fehlerhaft. ZeroMemory ist eigentlich nur ein spezielles memset und das arbeitet nun mal byteweise. Wenn du also folgendes schreibst:TCHAR datum[15]; ... ZeroMemory(datum,15);
dann funktioniert das zwar bei der Ansi Version, aber bei Unicode wird halt nur die Hälfte abgenullt. Deshalb auch mein Vorschlag mit sizeof, da dies ausserdem Inkonsistenzen vermeidet.
Warum du tag, monar, jahr mit ZeroMemory bearbeitest, versteh ich sowieso nicht, da du dann eh itoa darauf anwendest. Das einzige was Sinn macht, ist datum und dann reicht folgfendes vollkommen aus:datum[0] = TEXT('\0');
Nachtrag:
Dein Hauptproblem ist natürlich das von Shlo angesprochene. Deshalb solltest du einen entsprechenden Puffer als Parameter übergeben.TCHAR* date(TCHAR* datum) { ... return datum; }
Da diese ganze C Stringelei ziemlich hässlich ist, solltest du darauf achten einen Puffer zu übergeben, der gross genug ist.
-
C-Stringelei muss nicht haesslich sein.
Ich wuerde das Datum so zusammensetzen:
sprintf(Datum, "%.2d:%.2d:%.4d",st.wDay, st.wMonth, st.wYear);
Ist doch viel eleganter
-
Darkfalcon schrieb:
C-Stringelei muss nicht haesslich sein.
Doch ist es. Mal abgesehen davon, dass C-Strings technisch vollkommen veraltet sind, sind gerade die printf Funktionen nicht schön (Stichwort: Typsicherheit). Deshalb gibt es in C++ andere Möglichkeiten, die man selbst bei einer reinen C API (wie WinAPI) anwenden kann.
-
Kannst du mir sagen warum C veraltet sein soll?
Nur weil es C++ gibt???Das ist quatsch.
Die Sprache ist alt aber noch lange nicht veraltet.
-
Lies doch bitte die Posts gründlich. Ich hab nicht gesagt, dass C veraltet ist, sondern C-Strings.
-
sprintf hat in einer C++ Anwendung hauptsächlich nichts zu suchen, dafür gibt es std::stringstream:
std::ostringstream oss; oss << 11 << ':' << 45 << ':' << 12; std::string str(oss.str());