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

05.07.2009, 12:03

Zugriffsverletzung bei DrawIndexedPrimitiveUP

Hi,

ich bin grad dabei eine Funktion zu schreiben, mit der ich alle Elemente meines STL Container ps_objects rendern kann. Dabei liegen meine Vertices und Indices jeweils in eigenem Array.
Die Zeichenroutine sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
obj_size = ps_objects.size();
        for( int i=0;i<obj_size;i++ )
        {
            tObject = psObject_GetIObject(i);
            if( FAILED( g_pd3dDevice->SetTexture( 0, tObject.Texture ) ) ) Error( "[ PSENGINE ]: Can't set Texture!");
            if( FAILED( g_pd3dDevice->SetFVF( PS_STANDARD_FVF ) ) ) Error( "[ PSENGINE ]: Can't set Vertex Format!");

            res = g_pd3dDevice->DrawIndexedPrimitiveUP( tObject.PType, 0, tObject.iCount, tObject.pCount, tObject.Indices, D3DFMT_INDEX16,
                                                  tObject.Vertices, sizeof(Vertex3d) );
    
            if( FAILED( res ) ) Error("[ PSENGINE ]: Can't render indexed Primitives!");
        }



Doch das Programm stürzt mit dem Debugfehler 'Zugriffsverletzung beim Lesen an Position 0x00dca000.'
Wie man sieht ist da drin eine Schleife. Das erste Objekt wird noch ordentlich gerendert. Allerdings kommt die Fehlermeldung bei der DrawIndexedPrimitiveUP Funktion. Die Werte zu dieser stimmen alle.

Ich hoffe ich hab genügend Material zum Lösen Problems bereitgestellt...

Was hab ich falsch gemacht, was hab ich vergessen?

Danke im Vorraus

lg
Achtung ich!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

05.07.2009, 17:09

Also offensichtlich greifst du auf Speicher zu, den dir nicht gehört. Ich vermute mal, dass das hier passiert:

Zitat

C-/C++-Quelltext

1
psObject_GetIObject(i); 


Stutzig macht mich auch, dass du das Objekt per Kopier zurückgibst, was (wenn copy-ctor nicht richtig implementiert sind) ebenfalls gerne einen solchen Fehler verursacht..

3

05.07.2009, 17:46

Ok Danke.

C-/C++-Quelltext

1
2
3
4
psObjectI psObject_GetIObject( psObject tObject )
{
    return ps_objects[tObject];
}


Wenn ich dafür in der Render Funktion jetzt einsetze: tObject = ps_objects; funktionierts.
Komisch.. die Funktion macht doch im prinzip das selbe (mal davon abgesehen, dass sie sinnlos ist).

trotzdem danke für den Hinweiß ;)

Lg.
Achtung ich!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

05.07.2009, 17:58

Kommt darauf an, wie psObject implementiert ist. Das kann durchaus zu Fehlern dieser Art führen..

5

05.07.2009, 21:04

psObject ist ein typedef von int.
Gibt also nichts weiter als die Position im ps_objects STL Array an.
psObjectI ist dann die eigentliche Objekt-Klasse.

Lg
Achtung ich!

Werbeanzeige