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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

11.09.2007, 09:38

Yoyo, das ist einer der Gründe warum dieses Ellipsiszeug so gefärhlich ist... Eine falsche Angabe und schon gibts undefined behaviour.
@D13_Dreinig

Schnitter

Treue Seele

Beiträge: 141

Wohnort: Remshalden

Beruf: Schüler

  • Private Nachricht senden

12

11.09.2007, 13:07

Gibts eigentlich einen guten Grund, nicht ofstream/ifstream sondern FILE zu benutzen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

11.09.2007, 13:14

Zitat von »"Schnitter"«

Gibts eigentlich einen guten Grund, nicht ofstream/ifstream sondern FILE zu benutzen?


Gibt es deiner Meinung nach einen Grund nicht FILE zu verwenden? :P
@D13_Dreinig

14

11.09.2007, 15:02

Ehm tjo ... FILE ist wohl ein überbleibsel aus C ... nja wenn man C++ programmiert, sollte man auch die entsprechenden Klassen dafür nehmen ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

11.09.2007, 15:05

Zitat von »"Deviloper"«

Ehm tjo ... FILE ist wohl ein überbleibsel aus C ... nja wenn man C++ programmiert, sollte man auch die entsprechenden Klassen dafür nehmen ...


Nene... Ich bin ja auch dafür das man C++ Lösungen C Lösungen bevorzugen sollte und C++ und C möglichst nicht mixen sollte. Allerdings sind die C++ Streamtemplates nich gerade optimal implementiert und bringen einen großen Balast mit sich. Bei kleinen Lösungen wie einer Logfile Klasse ist der Balast aber total unnötig.
@D13_Dreinig

DragonHunter

Frischling

Beiträge: 6

Wohnort: St. Ingbert

Beruf: Schüler

  • Private Nachricht senden

16

21.10.2007, 19:04

Hallo,
ich denke, ich sollte mich erstmal vorstellen. :D
Eigentlich weiß ich nicht, was ich jetzt über mich sagen könnte. Dann lass ich das lieber vorerstmal. :p

Ich habe noch einen weiteren Vorschlag, wie man diese Logfile-Klasse fehlerfrei macht. Auf jeden Fall funktioniert das hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CLogfile::fTextout (int Color, bool List, const char *Text, ...)
{
    TCHAR buffer[MAX_BUFFER];   // char-Buffer

    va_list pArgList;           // Liste der übergebenen Argumente


    // String aus den Argumenten erstellen

    va_start (pArgList, Text);
    vsprintf ((char *) &buffer, Text, pArgList);
    va_end (pArgList);

    // Erzeugten String schreiben

    Textout (Color, List, (char *) &buffer);

} // fTextout (farbig, Liste)


Ich habe einfach bei jeder Verwendung von buffer einen Cast davorgesetzt (nicht nur bei der oben gezeigten Funktion).

Jetzt hätte ich aber doch noch ein paar Fragen:

Was ist also der Unterschied zwischen TCHAR und char?

Zudem noch eine Frage zu der verwendeten Logfileklasse:
Muss ich denn nie eine Instanz des Singleton-Templates anlegen? Anscheinend nicht, also woher kommt jetzt meine Instanz?
Oder wird diese bei der Ableitung erzeugt?

Viele Grüße,
Pascal

17

21.10.2007, 19:46

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CLogfile::fTextout (int Color, bool List, const char *Text, ...)
{
    TCHAR buffer[MAX_BUFFER];    // char-Buffer

    va_list pArgList;            // Liste der übergebenen Argumente


    // String aus den Argumenten erstellen

    va_start (pArgList, Text);
    vsprintf ((char *) &buffer, Text, pArgList);
    va_end (pArgList);

    // Erzeugten String schreiben

    Textout (Color, List, (char *) &buffer);

} // fTextout (farbig, Liste)
Ehm ...

Zitat

Jetzt hätte ich aber doch noch ein paar Fragen:

Was ist also der Unterschied zwischen TCHAR und char?
Tja ... da ist dein Problem :P

C-/C++-Quelltext

1
2
3
4
5
#if (_UNICODE)
    typedef TCHAR wchar_t;
#else // !_UNICODE

    typedef TCHAR char;
#endif // _UNICODE
...
=>

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void CLogfile::fTextout (int Color, bool List, 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 (buffer, Text, pArgList);
    va_end (pArgList);

    // Erzeugten String schreiben

    Textout (Color, List,  buffer);
}
... Du solltest wissen, dass (char *) &buffer einen char** in einen char* castet! Normal sollte es sogar drin sein die Funktion einmal const zu machen ...

Ich weiß allerdings nicht wie CLogfile implementiert ist ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

DragonHunter

Frischling

Beiträge: 6

Wohnort: St. Ingbert

Beruf: Schüler

  • Private Nachricht senden

18

21.10.2007, 19:54

Hallo,

erstmal danke. ;)

C-/C++-Quelltext

1
2
3
4
5
#if (_UNICODE)
    typedef TCHAR wchar_t;
#else // !_UNICODE

    typedef TCHAR char;
#endif // _UNICODE

Das erklärt natürlich alles. :)

Zitat

... Du solltest wissen, dass (char *) &buffer einen char** in einen char* castet! Normal sollte es sogar drin sein die Funktion einmal const zu machen ...

Stimmt.

TCHAR war im Buch so vorgeschlagen. Dort bekam ich aber einen Fehler, dass ich es casten solle.

Also lag der Fehler am TCHAR, das zu wchar_t wurde (wegen Unicode), oder?

Header der Logfile-Klasse:

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
class CLogfile : public TSingleton<CLogfile>
{
    // Memberfunktionen

public:

         CLogfile       ();
         ~CLogfile      ();
    void CreateLogfile  (const char *LogName);
    void WriteTopic     (const char *Topic, int size);
    void Textout        (const char *Text);
    void Textout        (int Color, const char *Text);
    void Textout        (int Color, bool List, const char *Text);
    void fTextout       (const char *Text, ...);
    void fTextout       (int Color, const char *Text, ...);
    void fTextout       (int Color, bool List, const char *Text, ...);
    void FunctionResult (const char *Name, bool Result);

    // Membervariablen

private:

    FILE *m_Logfile;

};


Singleton-Template steht auch nochmal irgendwo hier im Thread:

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

template <class T>
class TSingleton
{
protected:

    // Membervariablen

    static T *m_pSingleton; // Statisches Objekt


public:

    // Memberfunktionen


    // Destruktor

    //

    virtual ~TSingleton ()
    {
    }

    // Get

    //

    // Aufgabe: Wenn nötig, statisches Objekt erzeugen und

    // Zeiger darauf zurückgeben

    //

    inline static T* Get ()
    {
        // Existiert schon eine Instanz?

        if (!m_pSingleton)
            m_pSingleton = new T;   // Nein, dann neue Instanz erzeugen


        // Zeiger auf die Instanz zurückgeben

        return (m_pSingleton);

    } // Get


    // Statisches Objekt freigeben

    //

    static void Del ()
    {
        // Gab es eine Instanz?

        if (m_pSingleton)
        {
            delete (m_pSingleton);  // Ja, dann freigeben

            m_pSingleton = NULL;    // und Zeiger auf NULL setzen

        }

    } // Del


};

// Die statische Variable erzeugen

//

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

#endif


Pascal

19

21.10.2007, 20:18

Naja da wird halt die Instanz beim 1. aufruf von Singleton::Get erstellt. Die Überprüfung ob m_pSingleton existiert ist überflüssig ... (Singleton::Del) ... Ist eine ein wenig komische Implementierung aber nun gut.

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
class Logfile : public TSingleton<Logfile>
{
public:
    Logfile() : m_pFile(NULL) {};
    ~Logfile() { if (m_pFile != NULL) fclose(m_pFile); }

public:
    enum color 
    {
        LFC_BLUE = 0,
        LFC_GREEN,
        // ...

    };

public:
    void create(const char*);
    void write_topic(const TCHAR*, std::size_t); /* wofür ist hier size? */
    void write_text(const TCHAR*);
    void write_text(color const&, const TCHAR*, bool list = false); /* int color machst du nen enum draus :) */
    void write_text(const TCHAR*, ...);
    void write_text(color const&, const TCHAR*, ...);
    void write_text(color const&, bool list, const TCHAR*, ...);
    void write_result(const TCHAR*, bool);

private:
    FILE* m_pFile;
};
... weiß allerdings nicht was in den einzellnen Funktion abgeht ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

DragonHunter

Frischling

Beiträge: 6

Wohnort: St. Ingbert

Beruf: Schüler

  • Private Nachricht senden

20

21.10.2007, 20:26

Danke nochmals.

Und size ist die Schriftgröße. ;)

DragonHunter

Werbeanzeige