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

14.04.2011, 14:03

tbWriteToLog führt bei größeren Eingaben zum Crash?

Mich störts zwar nicht weiter, da ich die Tribase engine eh außerhalb des Buches nicht verwenden werde, aber ein bisschen komisch ist das doch schon... Das schreiben mit tbWriteToLog geht zwar an sich, schmiert aber immer ab wenn ich mehr als ein paar kilobyte auf einmal schreiben möchte (was z.B. immer dann der Fall ist wenn ich eine Tabelle will), zB. stürzt der folgende Abschnitt beim letzen tbWriteToLog immer ab.

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
int *a=(int*)tbMemAlloc(1000*sizeof(int));
        int *b=(int*)tbMemAlloc(1000*sizeof(int));
        for(int i = 0; i<1000; ++i)
        {
            a[i] = i;
            b[i] = 1000-i;
        }
        std::stringstream ss;
        std::ofstream ofs("lol.html");
        ofs<<"<html><body>";
        tbWriteToLog("%s","Before swap:");
        ss<<"<table border='1'>";
        ss<<"<tr>";
        ss<<"<th>Array 1</th> <th>Array2</th>";
        ss<<"</tr>";
        for(int i=0;i<1000;++i) 
        {
            ss<<"<tr>";
            ss<<"<td>"<<a[i]<<"</td>";
            ss<<"<td>"<<b[i]<<"</td>";
            ss<<"</tr>>";
        }
        ss<<"</table>";
        std::string str;
        std::getline(ss,str);
        ofs<<str.c_str();
        tbWriteToLog("%s",str.c_str());//<-- Crash

2

14.04.2011, 14:11

Nun, das ist gar nicht so komisch, wenn man sich den entsprechenden Quelltext anschaut. ;)

C-/C++-Quelltext

1
2
3
4
5
6
// Einen Text an HTML anpassen und in die Logbuchdatei schreiben
TRIBASE_API tbResult tbWriteToLog(char* pcFormat,
                                  ...)
{
    char    acText[1024];       // Temporärer String
    char    acNewText[2048];    // Der zu schreibende String


Wie du siehst wird der zu schreibende String in einem Char-Array gespeichert, das nicht mehr als 2048 Zeichen aufnimmt - inklusive der HTML-Tags etc.

Wenn du also mehr schreiben möchtest, dann solltest du das Array anpassen oder einfach - wohl eher zu empfehlen - deinen langen String aufteilen und die Funktion mehrmals aufrufen.

Ach ja: Wenn du HTML in dein Log-Buch schreiben möchtest, dann solltest du mal überlegen ob du nicht mit tbWriteToLogDirect arbeiten willst. Wird von tbWriteToLog ja auch aufgerufen, aber unnötige Umwandlungen in HTML-Tags fallen da weg.

Gruß
SaRu_

3

14.04.2011, 17:15

Auf die Idee einfach in den Quelltext zu gucken hätte ich eigentlich auch selbst kommen können (sollen). Ich hatte mich schon gewundert warum tbWriteToLog kein length argument nimmt. Es wäre vermutlich hilfreich gewesen wenn der Author tatsächlich C++ anstatt von C genommen hätte, dann müsste man sich über sowas nicht ärgern...

Ich glaube die funktionen schreib ich lieber selbst, ist ja beim besten Willen nicht so viel Aufwand, und auf ein 2048 Zeichen limit möchte ich mich nicht beschränken.

Werbeanzeige