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

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

1

09.03.2012, 18:59

"G3XLogfile" kann nicht in "G3XLogfile" konvertiert werden.

Hallo.
An diesem Problem sitze ich schon seit Tagen, doch weder meine Bücher noch das Internet kann mir bisher helfen.

Es geht um folgendes:

Ich hab mir ne Logbuchklasse geschrieben, die eine Methode names "Debug" hat.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 // Debugfunktion
HRESULT Debug(HRESULT hrTest, char* cExpression, char* cFuncName, char* cFileName, int iLine)
{
// Falls Ausdruck gescheitert ist
if(FAILED(hrTest))
{
// Logbucheintrag vorformatieren
char c_logbucheintrag[4096];
sprintf_s(c_logbucheintrag,"Error: %s failed!\n\tFile: [%s]\n\tFunction: [%s]\n\tLine: [%d]"
"\n\tReturned HRESULT: [%d]",cExpression, cFileName, cFuncName, iLine, hrTest);
// Logbucheintrag schreiben
WriteLog(c_logbucheintrag,G3X_ERROR);
return S_FALSE;
}
return S_OK;
}


Der erste Parameter ist ein Ausdruck, der debuggt werden soll. der zweite Parameter ist der Funktionsname (wird mirhilfe eines Makros und # ermittelt). Dann gebe ich noch Zeile und Quelldatei an.

Nun möchte ich diese Methode benutzen.
Da ich tippfaul bin hab ich mir gleich ein Makro gebaut:

C-/C++-Quelltext

1
2
3
4
5
// Makro zum Debuggen
#define G3X_DEBUG(LOGFILE,EXPRESSION) \
if(LOGFILE->m_bIsReady) { \
m_hr=LOGFILE->Debug(EXPRESSION,#EXPRESSION,__FUNCDNAME__,__FILE__,__LINE__); \
if(FAILED(m_hr)) return m_hr; }


Also kann ich diese Konstellation prima in meiner Engine verwenden.
Alles was ich machen muss ist die Instanz der Klasse G3XLogfile beim Initialisieren anzugeben.

Das ist der Knackpunkt!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
 // Initialisieren einer Tastatur
HRESULT InitKeyboard(HWND hWnd, HINSTANCE hInst, G3XLogfile* test, DWORD dwCooperative=DISCL_BACKGROUND|DISCL_NONEXCLUSIVE)
{
G3X_DEBUG(test,DirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8,(VOID**)&m_lpDinput,NULL));
G3X_DEBUG(test,m_lpDinput->CreateDevice(GUID_SysKeyboard,&m_lpDevice,NULL));
G3X_DEBUG(test,m_lpDevice->SetDataFormat(&c_dfDIKeyboard));
G3X_DEBUG(test,m_lpDevice->SetCooperativeLevel(hWnd,dwCooperative));
return S_OK;
}


G3X_DEBUG wird hier angewendet. So..

Wenn ich die Klasse für Tastaturen in dieselbe Quelldatei einfüge (ganz oben unter die Includes hingepfeffert), dann funktioniert alles.
Doch wenn ich die Tastaturklasse (wie es eigentlich sein soll) in eine andere Datei reinschreibe und diese Datei dann in den Hauptquellcode einbinde:

C-/C++-Quelltext

1
#include "G3XKeyboard.h"


dann kommt folgender Fehler:

http://img4.fotos-hochladen.net/uploads/…v17de2ycr4t.png


(Link)

http://www.fotos-hochladen.net/uploads/w…pfeq39tuzi2.png


(Link)


Wie kann ich definieren dass der die Adresse der Klasseninstanz Logbuch nicht als int interpretiert?
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.03.2012, 19:37

Da ich tippfaul bin hab ich mir gleich ein Makro gebaut:


Womit du früher oder später nur probleme bekommen wirst ;)

Das Problem sieht für mich eher so aus, als ob G3XLogfile an der Stelle nicht bekannt ist... includierst du die auch richtig?
Generell wäre ein bisschen code (und das bitte nicht als bild) nicht verkehrt.

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

3

09.03.2012, 19:57

G3XLogfile.h enthält keine externen Abhängigkeiten.
G3XKeyboard.h bindet G3XLogfile.h ein.

main.cpp bindet G3XKeyboard.h und G3XLogfile.h ein.

Ich hab den Quellcode mal gekürzt:

G3XLogfile.h:

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
#include <Psapi.h>
#include <dsetup.h>
#include <fstream>
#include <time.h>
#include <d3d9.h>
#include <string>
#include <map>
#include <vector>

// ...

// Logbücher
class G3XLogfile
{
    public:
        
        // Status
        bool        m_bIsReady;
        // Logbuch-Ausgabestream
        std::ofstream m_ofLogfile;

        G3XLogfile()
        {
            m_bIsReady=false;
        }

        ~G3XLogfile()
        {
            Release(); 
        }
        
        // Debugfunktion
        HRESULT Debug(HRESULT hrTest, char* cExpression, char* cFuncName, char* cFileName, int iLine)
        {
            // Falls Ausdruck gescheitert ist
            if(FAILED(hrTest))
            {
                // Logbucheintrag vorformatieren
                char c_logbucheintrag[4096];
                sprintf_s(c_logbucheintrag,"Error: %s failed!\n\tFile:  [%s]\n\tFunction:  [%s]\n\tLine:  [%d]"
                                            "\n\tReturned HRESULT:  [%d]",cExpression, cFileName, cFuncName, iLine, hrTest);
                // Logbucheintrag schreiben
                WriteLog(c_logbucheintrag,G3X_ERROR);
                return S_FALSE;
            }
            return S_OK;
        }


        // Logdatei erzeugen
        HRESULT CreateLogFile(char* cFileName)
        {
            // ...
            m_bIsReady=true;
            return S_OK;
        }

        // Eintrag ins Logbuch schreiben
        HRESULT WriteLog(char* cEntry, int iLevel=G3X_INFO)
        {
            // ...
            return S_OK;
        }


        // Logbuch herunterfahren (+beinhaltet schließen)
        HRESULT Release(void)
        {
            // ...
            m_ofLogfile.close();
            return S_OK;
        }


        // Logbuch schließen
        void CloseLogFile(void)
        {
                // ...
                m_bIsReady=false;
            }
        }
};

// Makro zum Debuggen
#define G3X_DEBUG(LOGFILE,EXPRESSION)   \
                if(LOGFILE->m_bIsReady)  { \
                            m_hr=LOGFILE->Debug(EXPRESSION,#EXPRESSION,__FUNCDNAME__,__FILE__,__LINE__); \
                            if(FAILED(m_hr)) return m_hr; }



G3XKeyboard.h

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
#include <dinput.h>
#include "G3XLogfile.h"

// Tastaturverwaltungsklasse
class G3XKeyboard : public G3XLogfile
{
    public:
        LPDIRECTINPUT8          m_lpDinput;
        LPDIRECTINPUTDEVICE8    m_lpDevice;
        HRESULT                 m_hr;
        bool                    m_bKeys[256];
        
        // Initialisieren einer Tastatur
        HRESULT InitKeyboard(HWND hWnd, HINSTANCE hInst, G3XLogfile* test, DWORD dwCooperative=DISCL_BACKGROUND|DISCL_NONEXCLUSIVE)
        {
            G3X_DEBUG(test,DirectInput8Create(hInst,DIRECTINPUT_VERSION,IID_IDirectInput8,(VOID**)&m_lpDinput,NULL));
            G3X_DEBUG(test,m_lpDinput->CreateDevice(GUID_SysKeyboard,&m_lpDevice,NULL));
            G3X_DEBUG(test,m_lpDevice->SetDataFormat(&c_dfDIKeyboard));
            G3X_DEBUG(test,m_lpDevice->SetCooperativeLevel(hWnd,dwCooperative));
            return S_OK;
        }
};


main.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
 #include <dinput.h>
#include <Windows.h>

// Man beachte: Hier wird die Datei "G3XLogfile.h" ebenso wie "G3XKeyboard.h" eingebunden!
#include "G3XDirect3D.h"
#include "G3XKeyboard.h"
#include "G3XLogfile.h"

#pragma comment(lib,"dinput8.lib")
#pragma comment(lib,"dxguid.lib")

LRESULT WINAPI windowproc(HWND,UINT,WPARAM,LPARAM);

// Globale Variablen:
HWND hWnd;
G3XDirect3D D3D;
G3XKeyboard keybdr;
G3XLogfile Logbuch;

// int _stdcall WinMain(blablabla)
// ...
// ...
// ...

LRESULT WINAPI windowproc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    { 
        case WM_CREATE:
        {
            Logbuch.CreateLogFile("C:\\test.txt");
            D3D.InitDirect3D(hWnd,GetModuleHandle(nullptr),false);
            
            // Hier krachts!
            // Es wird versucht, G3XLogfile mit int* (->Adresse von 'Logbuch') zu initialisieren??
            keybdr.InitKeyboard(hWnd,GetModuleHandle(nullptr), 
                                                                & Logbuch /* Fehler?*/ );
            

            break;
        }
        
        // ...
        
        case WM_CLOSE:
        {
            Logbuch.WriteLog("This is a test");
            DestroyWindow(hWnd);
            break;
        }
        // ...
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

4

09.03.2012, 20:18

Ich habs. Das darf doch nicht wahr sein!

Durch das Einbinden von "G3XLogfile.h" in main.cpp kollabiert mir alles.

Schade dass MSVC so wenig über Fehler verrät.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <Windows.h>
#include "G3XDirect3D.h"
#include "G3XKeyboard.h"
#include "G3XLogfile.h" // Weg damit!!!

LRESULT WINAPI windowproc(HWND,UINT,WPARAM,LPARAM);

HWND hWnd;
G3XDirect3D D3D;
G3XKeyboard keybdr;
G3XLogfile Logbuch;

int _stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char* lpCmdLine, int nShowCmd)
{
    WNDCLASSEX wcx;


Vielen Dank für deine Hilfe ! :D
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

09.03.2012, 21:01

Stichwort: Include Guards

Werbeanzeige