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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

11

26.06.2013, 12:17

Ich möchte in GlobTextureUnit etwas reinschreiben in dem ich die Funktion GetNewTextureUnit() aufrufe. Die widerum holt sich das letzt objekt des vetors, dabei stürtzt das Programm ab das in dem Vector keine Werte liegen. Laut Debugger kann nicht auf den speicher zugegriffen werden, was mich wundert.

12

26.06.2013, 12:26

static TextureUnitClass* GlobTexturUnit;
Ist ein Pointer. Ich vermute mal, du hast diesem Pointer kein Object zugewiesen, weswegen es auch crashed (zumindest finde ich beim schnellen drüber schauen nichts).

EDIT: Ok, nichts gesagt, hab die 1. Zeile nicht gesehen ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

26.06.2013, 12:27

In welcher Zeile von GetNewTextureUnit() soll dieser Zugriff denn stattfinden?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

14

26.06.2013, 12:36

Der Zugriff auf den Vector ist in der Zeile 5.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
int TextureUnitClass::GetNewTextureUnit ()
{
    int returnTextureUnit;
    int O = 0;
    O = VectorGlobTextureUnit.back();
    returnTextureUnit = O +1;
    VectorGlobTextureUnit.push_back(returnTextureUnit);

    return returnTextureUnit;
}


Dort Crasht es mit der Nachricht:"Unbehandelte Ausnahme bei 0x009A4A0A
in Monopoly_OpenGL_400_01.exe: 0xC0000005: Zugriffsverletzung beim Lesen
an Position 0x00000004". Dazu springt er in diese Zeilen:

C-/C++-Quelltext

1
2
3
4
iterator end() _NOEXCEPT
        {   // return iterator for end of mutable sequence
        return (iterator(this->_Mylast, this));
        }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

15

26.06.2013, 12:39

Klingt für mich sehr merkwürdig. Kann es sein, dass Du Deinen Stack irgendwie zur Sau machst, indem Du woanders in einen Array mehr reinschreibst als rein darf oder sowas? Mehr Code wird wohl notwendig sein.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

16

26.06.2013, 12:44

Wenn ich die beiden Zeilen aus der GetNewTextureUnit rauskommentire funktionirt alles einwandfrei, ich habe noch zimlich viel anderen Code denn möchte ich nichtunbedingt hier Posten. Kann ich einen Vector auch als static defeniren? Dann könnte ich ein Pointer Problem ausschließen

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

26.06.2013, 12:46

Es liegt nicht am Vector selbst. Irgendwo wirst Du irgendwelchen Speicher kaputt machen. Entweder mit Pointern, Arrays oder ähnlichem. Und da kracht es dann halt irgendwann. Könnte auch andere Ursachen haben, aber die würden mir jetzt spontan nicht einfallen.
Dein komisches erase im Konstruktor kannst Du übrigens rauswerfen. Oder benutz clear. Vor einem clear musst Du auch nicht prüfen, ob was drin ist. Das macht's jedenfalls nicht schneller.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

26.06.2013, 12:52

Abgesehen davon: Wieso ist VectorGlobTextureUnitIter ein Member, wofür das int A = NULL im Konstruktor (in C++ verwendet man übrigens eher einfach 0 oder noch besser nullptr anstatt NULL). Statt dem if not empty und erase all kannst du wohl einfach ein clear() machen; da es sich aber sowieso um den Konstruktor handelt, könntest du den vector aber sowieso einfach direkt wie gewünscht initialisieren, anstatt ihn erst zu leeren (er ist sowieso schon leer) und dann eine 0 reinzupushen. Das clearen im Destruktor ist auch unnötig weil passiert automatisch, da sowieso der Destruktor des vectors aufgerufen wird. O kannst du wohl auch gleich mit VectorGlobTextureUnit.back() initialisieren. Und du solltest dir angewöhnen, die Prefixvariante des Inkrement Operators (++x) – wenn möglich – gegenüber der Postfix Variante (x++) zu bevorzugen, da letzteres, zumindest im Falle von komplexeren Objekten, potentiell unnötiges Kopieren des Objekts zur Folge haben kann.

Was dein Problem betrifft, so hört sich mir das sehr danach an, dass du irgendwo eine Methode deiner TextureUnit Klasse über einen Nullpointer aufrufst...

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

19

26.06.2013, 12:53

Ok hab ich rausgeschmissen. Warum kann ich einen Vector nicht static setzten? Ich bekomme diese FehlerMeldung

Zitat

1>textureunitclass.obj : error LNK2001: Nicht aufgel÷stes externes
Symbol ""private: static class std::vector<unsigned int,class
std::allocator<unsigned int> >
TextureUnitClass::VectorGlobTextureUnit"
(?VectorGlobTextureUnit@TextureUnitClass@@0V?$vector@IV?$allocator@I@std@@@std@@A)".
1>textureunitclass.obj
: error LNK2001: Nicht aufgel÷stes externes Symbol ""private: static
class std::_Vector_iterator<class std::_Vector_val<struct
std::_Simple_types<unsigned int> > >
TextureUnitClass::VectorGlobTextureUnitIter"
(?VectorGlobTextureUnitIter@TextureUnitClass@@0V?$_Vector_iterator@V?$_Vector_val@U?$_Simple_types@I@std@@@std@@@std@@A)".

20

26.06.2013, 12:57

Wundert mich ja, dass noch keiner das Problem erkannt hat.

Zitat von »http://www.cplusplus.com/reference/vector/vector/back/«

std::vector::back

Calling this function on an empty container causes undefined behavior.


Wie BC bereits erklärt hat ist dein vector beim ersten Aufruf der Funktion leer.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Werbeanzeige