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

24.08.2004, 21:41

Run-Time Check Failure #0

Öffters mal was neues.

Ich habe einen Fehler, den ich noch nie hatte, obwohl der Code schon einmal lief. Der Fehler:

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.


Dieser soll scheinbar auftreten beim Laden aus DLLs, wenn was mit der Aufruf Konvention nicht stimmt. Naja also ich benutze hier keine DLLs, sondern alles steckt sogar in einer Header.

Ich möchte kurz den betreffenden Code zeigen:

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
BOOL cTexture::Blit(long DestX, long DestY,                  
                   long SrcX, long SrcY,                     
                   long Width, long Height,                  
                   float XScale, float YScale,               
                   D3DCOLOR Color)
{
    RECT Rect;
    ID3DXSprite *pSprite;

    if(m_Texture == NULL)
        return FALSE;
    if(m_Graphics == NULL)
        return FALSE;
    if((pSprite = m_Graphics->GetSpriteCOM()) == NULL)
        return FALSE;

    if(!Width)
        Width = m_Width;
    if(!Height)
        Height = m_Height;

    Rect.left = SrcX;
    Rect.top  = SrcY;
    Rect.right = Rect.left + Width;
    Rect.bottom = Rect.top + Height;
    
    if(FAILED(pSprite->Draw(m_Texture,                          
                            &Rect, &D3DXVECTOR2(XScale, YScale),                 
                            NULL, 0.0f,                                          
                            &D3DXVECTOR2((float)DestX, (float)DestY),            
                            Color)))
        return FALSE;

    return TRUE;
}

Das ist eine Methode die im Prinzip nur die Draw Funktion von ID3DXSprite aufruft.
Der Fehler kommt u.a. bei folgeder Anwendung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
m_Texture.Load(&m_Graphics, "Tiles.bmp");
    // Begin scene

    m_Graphics.BeginScene();
    
    
    m_Texture.Blit(50,50);

    // End scene

    m_Graphics.EndScene();


Also ich hab echt keine Ahnung warum der Fehler kommt, ich weiss nicht wirkliich was die Fehlermeldung bedeutet und ich habe schon alles möglich probiert woran es liegen könnte.

Der Fehler tritt bei diesem Aufruf auf:

C-/C++-Quelltext

1
2
3
4
5
pSprite->Draw(m_Texture,                          
                            &Rect, &D3DXVECTOR2(XScale, YScale),                 
                            NULL, 0.0f,                                          
                            &D3DXVECTOR2((float)DestX, (float)DestY),            
                            Color)

siehe oben.

Hoffentlich weiss jemand Rat :help:

2

24.08.2004, 21:45

Ok, so wie es Aussieht liegt es an dem Sprite Objekt.
Ich habe das mit dem Debugger verfolgt, aber es scheint das mein Sprite Objekt richtig erzeugt wird. Hier der Code:

C-/C++-Quelltext

1
2
3
4
// Type von m_pSprite ist ID3DXSprite *

   // Create a sprite interface

   if(FAILED(D3DXCreateSprite(m_pD3DDevice, &m_pSprite)))
       return FALSE;


Also das war auch schon alles. Wenn nur irgendwo versucht wird mit dem Sprite Objekt eine Funktion aufzurufen, dann kommt der oben genannte Fehler!

Patrick

Alter Hase

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

3

24.08.2004, 21:47

also die refrenzen mit dem & gefallen mir nicht und diese sache schonmal gar nicht:

&D3DXVECTOR2((float)DestX, (float)DestY),

kann mich irren, aber einen "link" auf ein Temporäres Objekt geben ist nicht gerade sehr gut, rein Logisch betrachtet.

Versuch erstmal diese Draw funktion hardcore aufzurufen und nicht direkt so "konfus" :)

Da liegt 100% der fehler ;)

4

24.08.2004, 21:49

Wie schon erwähnt liegt es nicht direkt an der Draw Funktion, sondern an dem Sprite. Wei jede Funktion, die ich mit dem Sprite aufrufen will, scheitert mit dieser Fehlermeldung ....

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

25.08.2004, 12:30

Ich hasse es, wenn man nur solche codeschnipsel bekommt, denn das create steht garnicht im oben geposteten code. So kann man dir nicht helfen, denn man ist kein hellseher....

6

25.08.2004, 13:10

Welcher Create? Von DirectX ?

C-/C++-Quelltext

1
2
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION)
// ....


C-/C++-Quelltext

1
ID3DXSprite     *GetSpriteCOM()     { return m_pSprite; }


Ich glaub das war jetzt alles.

So wie es Aussieht schein ich eher ein kleines SDK Problem zu haben. Durch das Ersetzen der SDKb mit SDKc und zurück sind wohl die Probleme aufgetreten.

7

30.08.2004, 03:54

Und genau da würd ich auch den Fehler vermuten. Denn der hat nun wircklich nichts mit dem Code zu tun. ESP ist, wenn ich mich nicht teusche, der Stack Pointer der CPU. Hier liegt ein interner Fehler vor. Scheinbar liegt hier ein Konfolkt mit den Parametern der Versionen des SDK's vor. Seit Version C wurde das eine oder andere geendert.

Ich würde vorschlagen das du beide Versionen komplett Deinstallierst und dann C neu frisch Installierst.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

8

30.08.2004, 09:22

Das funktioniert leider nicht so einfach.

Ich kann zwar die SDKs deinstallieren, jedoch nocht die Runtime. Daher erhalte ich auch den Fehler, ich will das SDK b nutzen, hab aber schon die Runtime von c drauf. Leider kenn ich keinen weg diese auch zu deinstallieren außer den Rechner zu formatieren.
Jetzt habe ich das SDK c wieder drauf, nun geht es auch wieder. Nur muss ich mich eben mit den neuen Schnittstellen der Sprits und Fonts rumärgern.

9

30.08.2004, 18:09

Wieso kannst du die RunTime nicht deinstallieren. Das wär mir neu. Schau mal in Systemsteuereung->Software da wirst du alles nötige finden.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

10

04.09.2004, 01:32

Ich lasse mich gerne vom Gegenteil überzeugen, aber ich kann dort nichts finden. Hast du denn sowas, wie heißt der Eintrag bei dir?

Die Information hatte ich aus einem anderen Forum und da ich auch keine Möglichkeit gefunden habe, die Runtime zu deinstallieren, halte ich diese auch für korrekt.

Aber wie gesagt, ich wäre sogar froh, wenn es gehen würde!!

Werbeanzeige