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

01.01.2014, 21:35

C++ für Spieleprogrammierer, Auflage 4. Kapitel 8, Fehler

Mahlzeit erstmal :)
hab erst vor kurzem angefangen mit dem C++ und stehe zur Zeit vor einem Fehler den ich einfach nicht zu lösen vermag ..


bin zur Zeit bei Kapital 8 aus dem Buch und es geht um die Logfile Erstellung ab 8.10


bekomme keine Fehler beim Kompilieren sondern erst beim Programm Start..

Kompilierer:
Visual Studio 2012 Express

"
Debug Assertion Failed!
Program: Blabla
File: blabla\output.c
Line: 1125

Expression ("Incorrect format specifier",0)
"

Ich weiß nur nicht ob ich jetzt den Gesamten Quellcode anhängen soll ..
ich geh davon aus das es etwas mit dem "vsprintf_s" zu tun hat aber das nicht nur eine Vermutung nur hab ich einfach nicht genug wissen um den Fehler selber zu lösen.

laut buch soll man den "TCHAR" verwenden damit spuckt mir aber der Kompilierer bei den "vsprintf_s" eine Fehlermeldung aus, mit einem normalen "char" Datentyp funktioniert es ohne Fehlermeldung aber es stürzt halt das Programm ab :(

sonst kann ich keinen Fehler erkennen .. (und bitte nicht auf die schwächen im Code eingehen darum geht es nicht sondern es geht mir erstmal nur darum herauszufinden wieso dieser Fehler überhaupt entsteht ;p)

ich häng jetzt erstmal nur den teil mit den vsprintf_s an ..

danke schon mal im voraus ..


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// fTextout
//
// Aufgabe: formatierten Text ins Logfile schreiben (schwarz)
//
void CLogfile::fTextout(const char *Text, ...)
{
    char buffer[MAX_BUFFER];    // char-Buffer
    va_list pArgList;           // List der übergebenen Argumente

    // String aus den Argumenten erstellen
    va_start(pArgList, Text);
    vsprintf_s(buffer, Text, pArgList);
    va_end(pArgList);

    // Erzeugten String schreiben
    Textout(buffer);
}; // fTextout (schwarz)

// fTextout
//
// Aufgabe: formatierten Text ins Logfile schreiben (farbig)
//
void CLogfile::fTextout (int Color, const char *Text, ...)
{
    char buffer[MAX_BUFFER];    // char Buffer
    va_list pArgList;           // Liste der übergebenen Argumente

    // String aus den Argumenten erstellen
    va_start (pArgList, Text);
    vsprintf_s (buffer, Text, pArgList);
    va_end (pArgList);

    // Erzeugten String schreiben
    Textout (Color, buffer);
}; // fTextout (farbig)

// fTextout
//
// Aufgabe: formatierten Text ins Logfile schreiben (farbig, Liste)
//
void CLogfile::fTextout(int Color, bool List, const char *Text, ...)
{
    char buffer[MAX_BUFFER];    // char Buffer
    va_list pArgList;           // Liste der übergebene Argumente

    // String aus den Argumenten erstellen
    va_start (pArgList, Text);
    vsprintf_s (buffer, Text, pArgList);
    va_end (pArgList);

    // Erzeugten String schreiben
    Textout (Color, List, buffer);

}; // fTextout (farbig, liste)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

01.01.2014, 22:02

Den wichtigsten Teil des Codes hast du unterschlagen.
Nämlich den Teil, wo du etwas ins Log schreibst. Da wird irgendein Formatspezifizierer falsch sein.

Diese Art der Ausgabe ist übrigens mit C++ überhaupt nicht zu empfehlen.
Schau dir lieber mal Streams an (std::ostream).

3

01.01.2014, 22:23

das viele Lern Beispiele in diesem Buch nicht von Vorteil sind stellt sich meistens nen paar Lektionen weiter schon wieder raus :)

darum geht es mir aber momentan auch noch gar nicht würde ja gerne erstmal verstehen warum dieser Fehler überhaupt auftritt :p

hier der teil der etwas in das log schreibt ..

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// C++ für Spieleprogrammierer
// Listing 8.15
// Anwendung der Logfile-Klasse
//
#include <iostream>
#include "Logfile.hpp"

using namespace std;

int main ()
{
    float Kontrolle = 123.456f; // Variable zum Testen

    // Neues Logfile erstellen
    g_pLogfile->CreateLogfile ("Logfile.html");

    // Überschrift erzeugen
    g_pLogfile->WriteTopic ("Unformatierter Text", 2);

    // Unformatierten Text ausgeben
    g_pLogfile->Textout ("Normaler, schwarzer Text <br>");
    g_pLogfile->Textout (RED, "Farbiger Text");
    g_pLogfile->Textout (BLUE, true, "Farbiger Text in Liste(1)");
    g_pLogfile->Textout (BLUE, true, "Farbiger Text in Liste(2)");
    g_pLogfile->Textout (BLUE, true, "Farbiger Text in Liste(3)");

    // Überschrift erzeugen
    g_pLogfile->WriteTopic ("Formatierter Text", 2);

    // Formatierten Text ausgeben
    g_pLogfile->fTextout ("Kontrollvariable: %f<br>", Kontrolle);
    g_pLogfile->fTextout (RED, "Kontrollvariable: %f", Kontrolle);
    g_pLogfile->fTextout (GREEN, true, "Liste Kontrolle: %f", Kontrolle);
    g_pLogfile->fTextout (GREEN, true, "Liste Kontrolle: %f", Kontrolle*2.0f);
    g_pLogfile->fTextout (GREEN, true, "Liste Kontrolle: %f", Kontrolle*4.0f);

    // Eine erfolgreiche und eine fehlgeschlagene Funktion
    g_pLogfile->FunctionResult ("Funktion_Eins", L_OK);
    g_pLogfile->FunctionResult ("Funktion_Zwei", L_FAIL);

    // Logfile schließen
    g_pLogfile->Del();
    return 0;
}


und hier noch den Textout teil .. der Rest basiert ja alles darauf das der Richtig funktioniert ..

C-/C++-Quelltext

1
2
3
4
5
6
void CLogfile::Textout (const char *Text)
{
    // Text schreiben und flushen
    fprintf (m_Logfile, Text);
    fflush (m_Logfile);
}; // Textout (schwarz)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »der-ghost« (01.01.2014, 22:31)


4

02.01.2014, 02:12

Habe den Fehler gefunden ..

in der WriteTopic Funktion wurde per

fTextout("size='%i'>\n", Size);

übergeben ..

der fTextout konnte den Size Wert aber nicht richtig einbauen da beim übergeben des Textes nicht ’%i’ sondern '%i' übergeben wurde ..

ich merke .. ich brauche eine Brille .. aber die beiden kann man ja auch mal verwechseln :(
aber nun weiß ich es für das nächste mal ’n’ statt '' verwenden ;)


danke trotzdem für deine mühe :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »der-ghost« (02.01.2014, 02:23)


5

02.01.2014, 02:30

ich weiss nicht was da jetzt genau falsch dran war .. ich weiss nicht ob ich voher ´´ stehen hatte .. ich hab keine ahnung jetzt läufts aber .. :D

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »der-ghost« (02.01.2014, 02:42)


Werbeanzeige