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

26.06.2006, 20:49

Listing 8.11 bis 8.15

Ich versuche grade diese Logfile Geschichte mit Unicode zum laufen zu kriegen, in meiner Logdatei kommt aber bei der ausgabe einer float immer nur 0.0000 an.

Ich weis nicht wo der fehler liegen könnte, deswegen hier mal der ganze code:

Die Singleton-Headerdatei:

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
#ifndef TSINGLETON
#define TSINGLETON

template<class T>
class TSingleton
{
protected:
    static T *m_pSingleton;

public:
    virtual ~TSingleton()
    {
    }

    inline static T* Get()
    {
        if (!m_pSingleton)
            m_pSingleton = new T;
        
        return (m_pSingleton);
    }

    static void Del()
    {
        if(m_pSingleton)
        {
            delete m_pSingleton;
            m_pSingleton = NULL;
        }

    }
};

template <class T>
T* TSingleton<T>::m_pSingleton = 0;


#endif


Die Logfile-Header

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
#ifndef __LOGFILE
#define __LOGFILE
#include <windows.h>
#include <stdio.h>
#include "Singleton.h"

#define MAX_BUFFER 1024
#define L_FAIL  false
#define L_OK    true
#define g_pLogfile CLogFile::Get()

enum FONTCOLORS{BLACK, RED, GREEN, BLUE, PURPLE};

class CLogFile : public TSingleton<CLogFile>
{
public:
    CLogFile            (void);
    ~CLogFile           (void);
    void CreateLogfile  (const char * LogName);
    void WriteTopic     (const TCHAR *Topic, int Size);
    void Textout        (const TCHAR* Text);
    void Textout        (int Color, const TCHAR *Text);
    void Textout        (int Color, bool List, const TCHAR* Text);
    void fTextout       (const TCHAR* Text, ...);
    void fTextout       (int Color, const TCHAR* Text, ...);
    void fTextout       (int Color, bool List, const TCHAR* Text, ...);
    void FunctionResult (const TCHAR * Name, bool Result);

private:
    FILE    *m_Logfile;
};

#endif


Die Logfile-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
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include "StdAfx.h"
#include "LogFile.h"


CLogFile::CLogFile(void)
{
}

CLogFile::~CLogFile(void)
{
    Textout (TEXT("<br><br>End of logfile</font></body></html>"));
    fclose(m_Logfile);
}
void CLogFile::CreateLogfile(const char* LogName)
{
    fopen_s(&m_Logfile, LogName, "w");
    Textout(TEXT("<html><head><title>LogFile</title></head>"));
    Textout(TEXT("<body><font face = 'courier new'>"));
    WriteTopic(TEXT("Logfile"), 3);

#ifdef _DEBUG
    Textout(TEXT("BUILD: DEBUG<br>"));
#else
    TextOut(TEXT("BUILD: RELEASE<br>"));
#endif

    Textout(TEXT("<a href = 'mailto:support@meineURL.de?subject=Logfile'>"));
    Textout(TEXT("Send E-Mail to me</a><br><br>"));

    fclose(m_Logfile);
    fopen_s(&m_Logfile, LogName, "a");
    //m_Logfile = fopen_s(LogName, "a");

}

void CLogFile::WriteTopic(const TCHAR *Topic, int Size)
{
    Textout(TEXT("<table cellspacing='0' cellpadding='0' width='100%%'"));
    Textout(TEXT("bgcolor ='#DFDFE5'>\n <tr>\n <td>\n<font face='arial'"));
    fTextout(TEXT("size='+%i'>\n"), Size);
    Textout(Topic);
    Textout(TEXT("</font>\n</td>\n</tr>\n</table>\n<br>"));
    fflush(m_Logfile);
}

void CLogFile::Textout(const TCHAR *Text)
{
    fwprintf(m_Logfile, Text);
    fflush(m_Logfile);
}

void CLogFile::Textout (int Color, const TCHAR *Text)
{
    Textout (Color, false, Text);
} 

void CLogFile::Textout(int Color, bool List, const TCHAR *Text)
{
    if (List == true)
        Textout(TEXT("<li>"));

    switch(Color)
    {
    case BLACK:
        Textout(TEXT("<font color=black>"));
        break;
    case RED:
        Textout(TEXT("<font color=red>"));
        break;
    case GREEN:
        Textout(TEXT("<font color=green>"));
        break;
    case BLUE:
        Textout(TEXT("<font color=blue>"));
        break;
    case PURPLE:
        Textout(TEXT("<font color=purple>"));
        break;
    };

    Textout(Text);
    Textout(TEXT("</font>"));

    if (List == false)
        Textout(TEXT("</br>"));
    else
        Textout(TEXT("</li>"));
}

void CLogFile::fTextout(const TCHAR *Text, ...)
{
    TCHAR buffer[MAX_BUFFER];
    va_list pArgList;

    va_start (pArgList, Text);
    swprintf(buffer, Text, pArgList);
    va_end(pArgList);
    Textout(buffer);
}

void CLogFile::fTextout(int Color, const TCHAR *Text, ...)
{
    TCHAR buffer[MAX_BUFFER];
    va_list pArgList;

    va_start (pArgList, Text);
    swprintf(buffer, Text, pArgList);
    va_end(pArgList);

    Textout(Color, buffer);
}

void CLogFile::fTextout(int Color, bool List, const TCHAR *Text, ...)
{
    TCHAR buffer[MAX_BUFFER];
    va_list pArgList;

    va_start (pArgList, Text);
    swprintf(buffer, Text, pArgList);
    va_end(pArgList);

    Textout(Color, List, buffer);
}

void CLogFile::FunctionResult(const TCHAR *Name, bool Result)
{
    if(L_OK == Result)
    {
        Textout(TEXT("<table width='100%%' cellSpacing='1' cellPadding'5'"));
        Textout(TEXT("border = '0' bgcolor='#C0C0C0'><tr><td bgcolor="));
        fTextout(TEXT("'#FFFFFF' width='35%%'>%s</TD>"), Name);
        Textout(TEXT("<td bgcolor='#FFFFFF' width ='30%%'><font color="));
        Textout(TEXT("'green'>OK</FONT></TD><td bgcolor='#FFFFFF'"));
        Textout(TEXT("width='35%%'>-/-</TD></tr></table>"));
    }
    else
    {
        Textout(TEXT("<table width='100%%' cellSpacing='1' cellPadding='5'"));
        Textout(TEXT("border='0' bgcolor='#C0C0C0'><tr><td bgcolor="));
        fTextout(TEXT("'#FFFFFF' width='35%%'> %s</TD>"), Name);
        Textout(TEXT("<td bgcolor='#FFFFFF' width ='30%%'><font color="));
        Textout(TEXT("'red'>ERROR</FONT></TD><td bgcolor='#FFFFFF'"));
        Textout(TEXT("width='35%%'>-/-</TD></tr></table>"));
    }
}


Und der Code der die logfile-klasse testet

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
// Kalista.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.

//


#include "stdafx.h"
#include "Logfile.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    float Kontrolle = 123.456f;

    g_pLogfile->CreateLogfile("Logfile.html");
    g_pLogfile->WriteTopic(TEXT("Unformatierter Text"), 2);

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

    g_pLogfile->WriteTopic(TEXT("Formatierter Text"), 2);

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

    g_pLogfile->FunctionResult(TEXT("Funktion_Eins"), L_OK);
    g_pLogfile->FunctionResult(TEXT("Funktion_Zwei"), L_FAIL);

    g_pLogfile->Del();

    return 0;
}


Irgendwie, kommt der wert der float variablen, nicht am ziel an.....ich verstehe nicht wieso ....

Phili

unregistriert

2

26.06.2006, 20:53

Debugger. Niemand liest sich das durch.

3

26.06.2006, 21:21

Zitat von »"Phili"«

Debugger. Niemand liest sich das durch.


stimmt wohl, hier mal die short-form. ist hier ein fehler zu sehen?

Ausgabe der Information ins logfile

C-/C++-Quelltext

1
2
float Kontrolle = 123.456f;
g_pLogfile->fTextout(TEXT("Kontrollvariable: %f <br>"), Kontrolle);


fTextout:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CLogFile::fTextout(const TCHAR *Text, ...)
{
    TCHAR buffer[MAX_BUFFER];
    va_list pArgList;

    va_start (pArgList, Text);
    swprintf(buffer, Text, pArgList);
    va_end(pArgList);
    Textout(buffer);
}


Die Texout:

C-/C++-Quelltext

1
2
3
4
5
void CLogFile::Textout(const TCHAR *Text)
{
    fwprintf(m_Logfile, Text);
    fflush(m_Logfile);
}

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

26.06.2006, 22:09

Tja also wenn immer 0.000 rauskommt, du aber "float Kontrolle = 123.456f;" übergibst, kann es ja nur an der Methode liegen. Ich muss aber ehrlich sagen, dass ich mit dieser Art von Funktionen wenig zu tun hatte. Welche Werte sind den in der Liste pArgList vorhanden? Kann es sein dass die Funktion so heißen müsste:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CLogFile::fTextout(const TCHAR *Text, float first, ...) 
{ 
    TCHAR buffer[MAX_BUFFER]; 
    va_list pArgList; 

    va_start (pArgList, first); 
    swprintf(buffer, Text, pArgList); 
    va_end(pArgList); 
    Textout(buffer); 
}
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

5

26.06.2006, 22:18

Zitat von »"Nox"«

Tja also wenn immer 0.000 rauskommt, du aber "float Kontrolle = 123.456f;" übergibst, kann es ja nur an der Methode liegen. Ich muss aber ehrlich sagen, dass ich mit dieser Art von Funktionen wenig zu tun hatte. Welche Werte sind den in der Liste pArgList vorhanden? Kann es sein dass die Funktion so heißen müsste:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void CLogFile::fTextout(const TCHAR *Text, float first, ...) 
{ 
    TCHAR buffer[MAX_BUFFER]; 
    va_list pArgList; 

    va_start (pArgList, first); 
    swprintf(buffer, Text, pArgList); 
    va_end(pArgList); 
    Textout(buffer); 
}


Das würde vermutlich gehen, aber der witz an der sache ist, das ich anhand der variablen parameterliste eigentlich die float variablen übergeben können müsste und diese im String angedruckt wird, sofern ein entsprechender Platzhalter (%f) vorhanden ist.

So mach ich das ganze ja wieder ziemlich fix - ich zerbrech mir an diesem unicode problem schon seit tagen denkopf und ich komme eifnach nicht weiter.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

26.06.2006, 22:29

du missverstehst da was. Du musst soweit ich weiß eine Startvar angeben, ansonsten geht das nicht! Also ein float musst übergeben. Dannach können noch beliebig viele folgen...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

7

27.06.2006, 11:25

Zitat von »"Nox"«

du missverstehst da was. Du musst soweit ich weiß eine Startvar angeben, ansonsten geht das nicht! Also ein float musst übergeben. Dannach können noch beliebig viele folgen...


Also die Funktionen sind so schon richtig, zumindest die Parameterliste, geht man nach dem Buch. Hab gesehen das jemand ein ähnliches Problem hatte, dies wurde wohl so gelöst.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void CLogfile::fTextout (const wchar_t *Text, ...)
{
    wchar_t buffer[MAX_BUFFER];    //char-Buffer

    va_list pArgList;            //Liste der übergebenen Argumente


    //vsprintf(

    //String aus den Argumenten erstellen

    va_start (pArgList, Text);
    wvsprintf (buffer, Text, pArgList);
    va_end (pArgList);
   
    //Erzeugten String schreiben

    Textout (buffer);
}

void CLogfile::Textout (const wchar_t *Text)
{
    fwprintf(m_Logfile, Text);
    fflush(m_Logfile);
}


Als Hauptunterschied sehe ich hier das wchar_t benutzt wird, ich nehme TCHAR - ist doch eigentlich das selbe, oder? Und es wird wvsprintf benutzt.....das ist meines erachtens doch nicht richtig, so kann ich doch gar keine Platzhalter verwenden, oder?

Oder anders gefragt, warum könnte diese Version besser funktionieren als die meine?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

27.06.2006, 11:56

Hast denn schonmal geschaut, ob die Werte in den übergebenen Var korrekt sind?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

9

27.06.2006, 12:14

TCHAR und wchar_t sind nicht notwendig gleich, weil TCHAR (unter anderem) in Abhängigeit von _UNICODE definiert ist. (siehe auch z.B. http://msdn.microsoft.com/en-us/library/c426s321.aspx)

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

10

27.06.2006, 12:57

Zitat von »"Nox"«

Hast denn schonmal geschaut, ob die Werte in den übergebenen Var korrekt sind?


die Informationen die in der methode ankommen, schaue so aus(copy&paste aus dem debug).

C-/C++-Quelltext

1
2
3
4
5
6
7
+       Text    0x004178ec "size='+%i'>
"   const wchar_t *
+       buffer  0x0012f4a8 "428;쳌쳌쳌쳌&wchar_t [1024]

-       pArgList    0xcccccccc <Schlechtes Ptr> char *
            CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden 
+       this    0x00358be8 {m_Logfile=0x10310c30 }  CLogFile * const


Bei pArgList steht schlechtes Ptr......heist nichts gutes....aber ich kriegs auch nicht weg.....

Werbeanzeige