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

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

16.01.2008, 12:33

Acces Violation extrafein

ich fummel grad an der 2D-Engien für tears of Blood 2, und bin auch ganz gut voran gekommen, jedoch bin ich gerade auf ein problem wieder mal gestoßen, bei dem ich absolut nicht weiss, wie ich es beheben soll!

wie der tread schon aussagt handelt es sich um eine access violation, jedoch kann selbst gevatter debugger nicht genau sagen wo es herkommt (er sagt blos es stammt aus der aice.dll -> engine). hier die fehlermeldung erstmal:

Zitat von »"Visual Studio"«

Unhandled exception at 0x10005a40 (AICE.dll) in ToB2.exe: 0xC0000005: Access violation reading location 0x00000002.


dabei wird auf folgende datei verwiesen, wo das ganze aufgetreten ist genau (in der stdio.h):

Zitat von »"stdio.h"«

__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_1_ARGLIST(int, sprintf_s, vsprintf_s, char, _Dest, _In_z_ _Printf_format_string_ const char *, _Format)


so, und nun der quellcode, es ist eine klasse für charaktere (hauptaufgabe animation), der als Klasse für bilder laden und anzeigen die CSurface aus der aice-engine nutzt.
die ganze sache hakt wie ich festgestellt habe an einer einzigen Zeile: und zwar an der auskommentierten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
BOOL CCharacter::LoadFromFile(const char* sFileStand,DWORD iColorKey,int iFrameWidth,int iFrameHeight)
{
    //Standdatei laden - die is der übeltäter!

    //m_clSurface ist vom Typ CSurface aus der AICE-Engine

    //if(!m_clStand.LoadFromFile(sFileStand,iColorKey)) return FALSE;


    //Werte einstellen

    m_iFrameWidth = iFrameWidth;
    m_iFrameHeight = iFrameHeight;

    return TRUE;
}


zu bemerken sollte noch sein, dass die Klasse CSurface von der Main aus benutzt, keine Probleme macht (also wenn man sie nicht für andere klassen nutzt sondern direkt damit ein bild ausgibt. abschließend nochmal die LoadFromFile-Fkt. von CSurface:

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 CSurface::LoadFromFile(const char* sFile,DWORD iColorKey)
{
    CLogData Log;

    //Textur aus Datei laden

    if(FAILED(D3DXCreateTextureFromFileEx(
        CGraphic::GetSingleton().GetDevice(),
        sFile,
        D3DX_DEFAULT,D3DX_DEFAULT,0,0,
        D3DFMT_UNKNOWN,
        D3DPOOL_DEFAULT,
        D3DX_FILTER_NONE,
        D3DX_FILTER_NONE,
        iColorKey,
        NULL,NULL,
        &m_lpTexture)))
    {
        Log.AddInformation("Folgende Datei konnte nicht geladen werden: ",sFile,INFOTYPE_FAILED);
        return FALSE;
    }

    //Breite/Höhe holen

    D3DSURFACE_DESC Desc;
    if(FAILED(m_lpTexture->GetLevelDesc(0,&Desc)))
    {
        Log.AddInformation("Konnte LevelDesc folgender Datei nicht holen: ",sFile,INFOTYPE_FAILED);
        return FALSE;
    }
    m_iWidth = Desc.Width;
    m_iHeight = Desc.Height;

    //ansonsten alles schick

    Log.AddInformation("Bilddatei erfolgreich geladen: ",sFile,INFOTYPE_SUCCESS);
    return TRUE;
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

16.01.2008, 12:56

Geh dochmal schrittweise mit dem Debugger durch und schau wo genau es knallt!
@D13_Dreinig

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

16.01.2008, 13:14

Hab jetzt nicht so genau schauen können, aber womöglich allokierst du Speicher in der DLL oder im Programm und greifst dann von der anderen Seite drauf zu. Ich weiß nicht mehr genau wieso, aber das kann Probleme machen.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

4

16.01.2008, 13:26

danke erstma für den tipp, david, das hab ich noch nie benutzt das schrittweise (jetzt liebe ich es! xD).

also beim genauen nachforschen hängt es an der log-klasse! Wenn das Bild nicht geladen werden konnte, wird mit einer Loginformation in eine datei geschrieben. und GENAU bei sprintf_s tritt ein fehler auf. und da fällt mir auf, dass ein paramter fehlt -.- denke das wird es sein, ich teste es gleich mal!

hier mal der fehler!

C-/C++-Quelltext

1
2
3
4
5
6
//da machter streik -> ein string fehlt xD

sprintf_s(buf,"<div class=\"failed\">- %s%s</div>\n",Information);

//so wäre es richtig!

sprintf_s(buf,"<div class=\"failed\">- %s%s</
div>\n",Information,Additional);

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

16.01.2008, 13:37

okay, das war der fehler.

@david: danke nochna

@gurke gz zu 1111. post xD

Werbeanzeige