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

07.09.2008, 13:44

[Gelöst]Zeiger auf Klasse als Parameter

Ich möchte einen zeiger auf einer klasse als ein Paramether einer Methode setzen. Wenn ich diese methode dann ausführe, bekomme ich aber ein paar Runtime Errors.

Meine Fentser Klasse ist flgendermaßen deklariert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class FORGEWINDOW
    {
        public:
            FORGEWINDOW() { }
            ~FORGEWINDOW() { }
            HWND       hWindow;
            D3DPRESENT_PARAMETERS d3dpp;
            FORGERESULT Create(char* szName, int iWidth, int iHeight, char* szTyp, bool bFuulscreen);
            FORGERESULT Show();
            
    };


Und meine Scenen Klasse so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
class FORGESCENE
    {
        public:
            FORGESCENE() { }
            ~FORGESCENE() { }
            LPDIRECT3D9 d3d;    
            LPDIRECT3DDEVICE9 d3ddev;
            FORGERESULT CreateDevice(FORGEWINDOW *forgeWindow);
    };



In meiner Hauptdatei, deklariere ich die Objekte folgendermaßen:

C-/C++-Quelltext

1
2
FORGEWINDOW FWINDOW;
FORGESCENE FSCENE;


Die CreateDevice() Methode meiner Scenen Klasse sieht nun so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FORGERESULT FORGESCENE::CreateDevice(FORGEWINDOW *forgeWindow)
    {
        FORGERESULT FRESULT;

        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          forgeWindow->hWindow,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          &forgeWindow->d3dpp,
                          &d3ddev);

        FRESULT.szCode   = "C101";
        FRESULT.szResult = "OK";
        return FRESULT;
    }


Wenn ich nun diese Methode aufrufen willerstelle ich erst die fenster Klasse, beziehungsweise benutze si erst damit die variablen in der Klasse gesetzt werden:

C-/C++-Quelltext

1
2
3
FRESULT = FWINDOW.Create("RealForge Demo", 800, 600, "Changeable", true);
FRESULT = FWINDOW.Show();
FRESULT = FSCENE.CreateDevice(&FWINDOW);


Nun it das Provlem, das ich ganz viele Runtime errors bekomme, diese hier sind besonders betroffen, beziehungsweise sind in rot:

Zitat


+ forgeWindow 0x0041a19c class RealForge::FORGEWINDOW FWINDOW {hWindow=0x0029097c d3dpp={...} } RealForge::FORGEWINDOW *


Zitat

+ forgeWindow->hWindow 0x0029097c {unused=4587520 } HWND__ *



Diese tauchen in der CreateDevice methode auf. Ich verstehe nicht warum diese hWindow angeblich nicht benutzt sein sollte, in FWINDOW.Create() werden diese gesetzt ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

07.09.2008, 14:10

Re: Zeiger auf Klasse als Parameter

Zitat von »"Dustin Braun"«

Ich verstehe nicht warum diese hWindow angeblich nicht benutzt sein sollte, in FWINDOW.Create() werden diese gesetzt ...


Dann zeig halt mal den Code von Create.
Übrigens: Diese großen Bezeichner sich ja irgendwie abartig! :shock:
@D13_Dreinig

3

07.09.2008, 14:13

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
FORGERESULT FORGEWINDOW::Create(char *szName, int iWidth, int iHeight, char* szTyp, bool bFullscreen)
    {
        FORGERESULT FRESULT;
        ZeroMemory(&exwndClass, sizeof(WNDCLASSEX));
        exwndClass.cbSize        = sizeof(WNDCLASSEX);
        exwndClass.style         = CS_HREDRAW | CS_VREDRAW;
        exwndClass.lpfnWndProc   = (WNDPROC)WindowProcedure;
        exwndClass.hInstance     = exhInstance;
        exwndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
        exwndClass.hbrBackground = (HBRUSH)COLOR_WINDOW;
        exwndClass.lpszClassName = "RealForgeWindow";
        RegisterClassEx(&exwndClass);

        hWindow = CreateWindowEx(NULL,
                                 "RealForgeWindow",
                                 szName,
                                 WS_OVERLAPPEDWINDOW,
                                 100, 100,
                                 iWidth, iHeight,
                                 NULL,
                                 NULL,
                                 exhInstance,
                                 NULL);

        ZeroMemory(&d3dpp, sizeof(d3dpp));    
        d3dpp.Windowed = bFullscreen;    
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;    
        d3dpp.hDeviceWindow = hWindow; 

        FRESULT.szCode   = "C101";
        FRESULT.szResult = "OK";
        return FRESULT;
    }

4

07.09.2008, 14:27

Du bist dir sicher, das das erstellen des Fensters funktioniert? sonst ist hwindow ja auch 0.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

07.09.2008, 14:42

Re: Zeiger auf Klasse als Parameter

Zitat von »"David_pb"«


Übrigens: Diese großen Bezeichner sich ja irgendwie abartig! :shock:


Ich war genauso schockiert wie du, als ich das gesehen habe.
Er hat sich Wohl ein zu grosses Vorbild an den DX typedefs genommen. :)

6

07.09.2008, 14:44

Jo, ein wenig xD

Fenster ist da, ich kann es ja erstellen und anzeige lassen, und ich sehe es ja auch.

7

07.09.2008, 15:14

Ich habe mal wieder nen klinen test gemacht:

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
#include <windows.h>

class A
{
public:
    int x;
};

class B
{
public:
    void Message(A* a);
};

void B::Message(A *a)
{
    char text[100];
    wsprintf(text, "%i", a->x);
    MessageBox(NULL, text, "Message", NULL);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    A mA;
    B mB;
    mA.x = 5;
    mB.Message(&mA);
    return 0;
}


Es funktioniert, weil die MessageBox 5 ausgiebt, und das selbe prinziep wende ich auch beim obigen Programm an, nur dort bekomme ich runtime Errors ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

07.09.2008, 15:15

An welcher Stelle genau, gibt denn dein Programm den Geist auf?
@D13_Dreinig

9

07.09.2008, 15:21

C-/C++-Quelltext

1
2
3
4
5
6
7
8
MessageBox(NULL, "1", "Message", NULL);
        d3d->CreateDevice(D3DADAPTER_DEFAULT,
                          D3DDEVTYPE_HAL,
                          forgeWindow->hWindow,
                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                          &forgeWindow->d3dpp,
                          &d3ddev);
        MessageBox(NULL, "2", "Message", NULL);


1 Wird ausgegeben, 2 schon nicht mehr ...

Und d3d ist angeblich IUnknown ...

10

07.09.2008, 15:54

Gelöst, es war bloß meine eigene dummheit:

d3d = Direct3DCreate9(D3D_SDK_VERSION);

Werbeanzeige