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

1

31.07.2010, 11:49

Zeitstempel in TriBase Log.html einbauen

Moin moin,

ich hab mich mal an dem probiert, was der Titel ankündigt.
Was meint ihr zum Lösungsweg?

Bin es folgendermaßen angegangen:

tbDateTime.h

C-/C++-Quelltext

1
2
3
#pragma once

char* tbGetDateTime(char* pcDateTime);


tbDateTime.cpp

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
#include <TriBase.h>
#include <time.h>
#include <iostream>

char* tbGetDateTime(char* pcDateTime)
{
char cBuffer[22];
struct tm ptm;
time_t seconds = time(0);
errno_t err;
err = localtime_s(&ptm, &seconds);

sprintf_s(cBuffer, 22, "04i-02i-02i 02i:02i:02i",
(int)ptm.tm_year+1900,
(int)ptm.tm_mon+1,
(int)ptm.tm_mday,
(int)ptm.tm_hour,
(int)ptm.tm_min,
(int)ptm.tm_sec);

strcpy_s(pcDateTime, 22, cBuffer);

return pcDateTime;
}


dann hab ich die Funktion wie folgt in das Makro für den Info-Logeintrag eingebaut:

TriBase.h

C-/C++-Quelltext

1
#define TB_INFO(x){tbWriteToLog("<tr><td><font size=\"2\"><b><font color=\"#008000\">%s INFO:</font></b> %s</font></td><td><font size=\"2\"> (<i>%s</i>, Zeile <i>%d</i>, Funktion <i>%s</i>)</font></td></tr>", tbGetDateTime(new char), (x), tbRemoveDir(__FILE__), __LINE__, __TB_FUNCTION__);}


Das Resultat sieht dann wie folgt aus:

2010-07-31 11:21:26 INFO: TriBase-Engine wird initialisiert... (tribase.cpp, Zeile 86, Funktion tbInit)
2010-07-31 11:21:26 INFO: Initialisierung komplett! (tribase.cpp, Zeile 104, Funktion tbInit)
2010-07-31 11:21:55 INFO: TriBase-Engine wird heruntergefahren... (tribase.cpp, Zeile 113, Funktion tbExit)
2010-07-31 11:21:56 INFO: Alle Speicherbereiche freigegeben! (tbmemory.cpp, Zeile 116, Funktion tbMemExit)
2010-07-31 11:21:56 INFO: Herunterfahren abgeschlossen! (tribase.cpp, Zeile 149, Funktion tbExit)

Sooooo, was meint ihr, geht die Funktion so in Ordnung oder hab ich da murks gecoded? ^^

Produziere ich dadurch, dass ich der tbDateTime-Funktion einfach mit new char Speicherplatz übergebe ein Speicherleck?

Gruß

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

31.07.2010, 13:16

Da produzierst du nicht nur ein Speicherleck sondern eine extrem üble Access Violation, da du ja nur ein einziges char Element mit new erstellt, in dem aber dann eine Zeichenkette von 22 chars deponierst!! Du schreibst also in 21 Bytes die mit dem einen übergebenen (Zeiger auf char) nichts zu tun haben und die womöglich gerade für irgendwas unheimlich wichtiges sind!

Warum gibst du nicht einfach einen std::string zurück und lässt den Eingangsparameter weg?

3

31.07.2010, 13:32

Ich habe es in meinem Framework mit diesen 2 Zeilen gelöst :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
SYSTIME systime;
GetLocalTime(&systime);

//Dann hast du das aktuelle Datum und die Zeit
//in den folgenden Variablen sind sie gespeichert
systime.wDay;
systime.wMonth;
systime.wYear;

systime.wHour;
systime.wMinute;
systime.wSecond;


Du kannst auch den Wochentag etc. haben :)

4

31.07.2010, 13:56

Zitat

Warum gibst du nicht einfach einen std::string zurück und lässt den Eingangsparameter weg?


Das is ne gute Frage... Ich weiß es garnimmer, hab ich geschrieben, als ich das letzte Mal angefangen habe mit dem Buch, dann musste ich es leider weglegen, weil zu wenig Zeit blieb, bin jetzt gerade wieder dabei einiges aufzuarbeiten.

Ich werde es heute Abend mal auf std::string umschreiben.

@.:!Batzer!:. Und deine Lösung probier ich gleich danach auch noch aus! ^^

Danke euch beiden! :thumbsup:

5

01.08.2010, 02:36

So, bin jetzt bei der Lösung von Batzer angelangt.
Gibt es ne Möglichkeit, wie ich in die Zeit ein Format reinbekomme (ohne sprintf), sprich statt 1:30:15 etwa 01:30:15?

Hab das bis jetzt nur auf diesem Wege lösen können:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
std::wstringstream str;

SYSTEMTIME systime;
GetLocalTime(&systime);
    
str << (systime.wHour>=10?"":"0") << systime.wHour << ':'
     << (systime.wMinute>=10?"":"0") << systime.wMinute << ':'
     << (systime.wSecond>=10?"":"0") << systime.wSecond;

std::wstring teee = str.str();
    
MessageBox(NULL, teee.c_str(), teee.c_str(), MB_OK);

idontknow

unregistriert

7

01.08.2010, 12:31

@idontknow okay... ^^ so hab ichs ja gemacht!? Oder was wolltest du mir mit dem Link mitteilen?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

01.08.2010, 12:34

dass stringstream eine methode namens c_str() hat^^
edit: sry ich meinte dass du stream.str().c_str() schreiben kannst xD
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

idontknow

unregistriert

9

01.08.2010, 12:46

argh das wstringstream hat mich verwirrt :(. Jo stringstream is halt perfekt dafür geeignet :).

10

01.08.2010, 12:57

@idontknow ahhh ^^ dann okay! :thumbup:

@natchoman jo das funktioniert auch mit str.str().c_str(), hast also recht, ich kann mit den wstring sparen! :thumbup:

Und habt ihr was die Formatierung betrifft noch ne Idee?
Ist es so, wie ich die zwei Stellen abprüfe zu umständlich?
(systime.wHour>=10?"":"0")

Gibt es noch einen besseren Weg?

[edit] so, meine Funktion tbDateTime sieht jetzt wie folgt aus:

??? DateTime ()
{
std::wstringstream str;

SYSTEMTIME systime;
GetLocalTime(&systime);

str << (systime.wYear)
<< '-'
<< (systime.wMonth >= 10 ? "" : "0") << systime.wMonth
<< '-'
<< (systime.wDay >= 10 ? "" : "0") << systime.wDay
<< " "
<< (systime.wHour >= 10 ? "" : "0") << systime.wHour
<< ':'
<< (systime.wMinute >= 10 ? "" : "0") << systime.wMinute
<< ':'
<< (systime.wSecond >= 10 ? "" : "0") << systime.wSecond;

std::wstring teee = str.str(); //optional, wenn ein string leicher zu verwenden ist als ein stringstream

return ???;

}

Ich weiß jetzt nur nicht, wie ich das so zurückgeben soll, dass ich es wieder in das Makro (siehe Post 1) einbauen kann.
Kanns mir jemand verraten?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Cyborg« (01.08.2010, 14:56) aus folgendem Grund: siehe [edit]


Werbeanzeige