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

11

16.02.2013, 16:50

Die beiden werden aber direkt im Konstruktor initialisiert

C-/C++-Quelltext

1
2
m_pl = new RPGUtils::Player();
m_gui = new GUIView(m_pl);

Nein, das ist keine Initialisierung, das ist eine Zuweisung. Initialisierung geht nur mit Initialisierungslisten. Macht bei dir vielleicht grad keinen Unterschied, aber es gibt viele Fällen in denen das sehr wichtig ist (Memberobjekte, deren Konstruktoren Parameter verlangen), das solltest du dir also auch anschauen. Und auch die Initialisierungsreihenfolge kann sehr wichtig sein, wenn Member voneinander abhängen, und dann solltest du auch wissen, dass diese von der Reihenfolge der Deklaration abhängt und nicht, in welcher Reihenfolge du deine Initialisierungsliste schreibst (weil es ja verschiedene C-tors mit verschiedenen Listen geben könnte, die Reihenfolge aber definiert sein muss, damit in Umgekehrter Richtung aufgeräumt werden kann).
Lieber dumm fragen, als dumm bleiben!

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

12

16.02.2013, 17:14

Gemeint war, dass die beiden auf einen validen Speicherbereich verweisen. Eigentlich wollte ich m_gui nicht als Pointer haben, aber wie kann man das Initialisieren, wenn es einen Zeiger auf ein Player-Objekt braucht, das noch nicht initialisiert ist?

C-/C++-Quelltext

1
2
3
4
Beispiel::Beispiel() : m_gui(m_pl)
{
    m_pl = new RPGUtils::Player();
}

Das geht ja nicht, weil m_pl noch keinen richtigen wert hat.

13

16.02.2013, 17:37

So:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
Beispiel
{
  blub* m_pl;
  blub* m_gui;
};

Beispiel::Beispiel() :
m_pl(new RPGUtils::Player()),
m_gui(m_pl)
{
}


Wichtig: So gehts nichts:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
Beispiel
{
  blub* m_gui;//hier andere Reihenfolge, der Rest ist gleich
  blub* m_pl;
};

Beispiel::Beispiel() :
m_pl(new RPGUtils::Player()),
m_gui(m_pl)
{
}


Weil dann zuerst m_gui mit einem nicht initialisierten m_pl initialisiert würde, und danach erst m_pl initialisiert würde.
Lieber dumm fragen, als dumm bleiben!

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

14

16.02.2013, 20:16

Ah, ok. Vielen Dank an Alle für die Hilfe.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

15

17.02.2013, 21:55

Lags daran?
Wenn ja, dann war ich mit meiner Vermutung richtig. Wenn es auch ein wenig versteckter war, als es üblicherweise vorkommt. Aber passiert ist genau das gleiche. Hier einfach der Umweg über eine andere Variable, die noch nicht initialisiert wurde. Und daher hattest du auch das unterschiedliche Verhalten von Debug/Release.

Andere hier genannte Fehler sollten in der Debug Version auch vorkommen (wie es die meisten sonstigen Fehler auch tun). Eigentlich sollte man diese Default-0 Initialisierung von Speicher auch in der Debug Version ausschalten. Sehe nicht so richtig ein, warum das gut sein sollte.

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

16

18.02.2013, 15:12

Ich glaube eher, dass es irgendwie mit der DLL zusammenhängt. Um das mal zu erklären: Die Spiellogik, also Klassen wie Item, Player usw. habe ich in Visual C++ 2010 erstellt. Da DarkGDK damit anscheinend nicht funktioniert, benutze ich die 2008er Version. Die Spiellogik habe ich dann mit der DLL eingebunden. Als ich die .lib und die Headerdateien davon entfernt hatte (natürlich alle Verweise darauf auskommentiert) funktionierte alles wieder. Ich werde jetzt mal versuchen nur die DLL einzubinden und nichts damit zu machen. Mal sehen, ob der Fehler dann wieder kommt. Alternativ noch eine Frage: Kann man VC++ 2010 (also vcxproj) in VC++ 2008 Projekte (vcproj) konvertieren?

EDIT1:
.lib in den Projekteinstellungen hinzugefügt, Programm läuft normal, ohne Abstürze.

EDIT2:
DLL wieder verwendet, jetzt bekomm ich den hier:

Quellcode

1
Unbehandelte Ausnahme bei 0x00d027f3 in RPGGame1.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xbaadf00d.

0xBAADF00D kenn ich doch. Das war doch der Wert, mit dem uninitialisierter Heapspeicher gefüllt wird, oder so. Na dann mal sehn, wo der herkommt :D

EDIT3:
Hab tatsächlich GUIView und Player bei der Definition vertauscht. Und jetzt kann ich nicht mal sagen, ich hätte das nicht gewusst :(
Beim normalen Debuggen, aus VC++ heraus gehts jetzt, die Werte werden perfekt angezeigt, es ist alles so, wie ich es gerne hätte. Beim Starten aus dem Explorer heraus oder über strg+F5 (auch Debug-Konfiguration) geht es nicht mehr. Es stürzt wie am Anfangspost schon geschrieben ab.

Quellcode

1
Unbehandelte Ausnahme bei 0x77c643d6 (ntdll.dll) in RPGGame1.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.

Kann man diese Default-0 Initialisierung einfach abschalten?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »patrick246« (18.02.2013, 15:41)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

18.02.2013, 16:13

Wieso stellst Du nicht auf Release um und startest damit via F5? Immerhin findest Du damit die Stelle und den Stacktrace.
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]

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

18

18.02.2013, 16:51

Es funktioniert sowohl im Debug als auch im Release wenn ich das Spiel mit F5 starte. Nur wenn ich es mit strg+f5 starte (also ohne debuggen) stürzt das Spiel ab. Genauso vom Explorer aus.
Die Stelle habe ich durch starten des Spiels vom Explorer und anschließendes Anhängen vom Debugger in VC++ gefunden. Gleiches gilt für den Stacktrace.

EDIT1:
Wenn jemand Interesse hat das sich mal selbst anzusehen und kein Augenkrebs von meinem Code bekommt, kann ich das Projekt gerne mal verschicken.

19

18.02.2013, 18:40

Ich hatte mal ein ähnliches Problem. Letztendlich hatte ich einen Speicherzugriffsfehler, der in ganz seltenen Fällen eine Endlosschleife ausgelöst hat. Gefunden habe ich ihn mit DrMemory.
Details: http://zfx.info/viewtopic.php?f=4&t=2348
Lieber dumm fragen, als dumm bleiben!

patrick246

Treue Seele

  • »patrick246« ist der Autor dieses Themas

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

20

19.02.2013, 17:58

Habs jetzt mal mit Dr. Memory probiert. Übrigens vielen Dank für den Tipp. Hier ein relevanter Fehler:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
Error #67: UNADDRESSABLE ACCESS: writing 0x13ba3858-0x13ba385c 4 byte(s)
# 0 RPGUtils.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Tidy [c:\program files (x86)\microsoft visual studio 2010\vc\include\xstring:1998]
# 1 RPGUtils.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::basic_string<char,std::char_traits<char>,std::allocator<char> > [c:\program files (x86)\microsoft visual studio 2010\vc\include\xstring:551]
# 2 RPGUtils.dll!RPGUtils::Player::Player                                      [e:\rpgutils\rpgutils\player.cpp:12]
# 3 TownState::TownState                                                       [e:\rpggame1\rpggame1\townstate.cpp:9]
# 4 MainMenuState::onUpdate                                                    [e:\rpggame1\rpggame1\mainmenustate.cpp:75]
# 5 StateManager::update                                                       [e:\rpggame1\rpggame1\statemanager.cpp:40]
# 6 DarkGDK                                                                    [e:\rpggame1\rpggame1\main.cpp:31]
# 7 WinMain     
Note: @0:00:39.955 in thread 5048
Note: refers to 1 byte(s) beyond last valid byte in prior malloc
Note: prev lower malloc:  0x13ba37e0-0x13ba3858
Note: instruction: mov    $0x0000000f -> 0x18(%eax)

Erfüllt alle Kriterien, er ist in der DLL und er kommt von dem State, der hängt. Jetzt muss ich nur noch herausfinden, warum er kommt.

Werbeanzeige