Lieber Besucher, herzlich willkommen bei: RPG Studio - Make your World real. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

Neo-Bahamut

Himmelsgleicher

  • »Neo-Bahamut« ist der Autor dieses Themas

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

1

Donnerstag, 2. September 2010, 15:21

NULL-Pointer = Feeeehler

Tag,
normalerweise hilft Ankou mir bei meinen Problemen, aber der ist schon seit ein paar Tagen nicht mehr on gewesen ;(

Ich poste erstmal einen Ausschnitt ("da fehlen ja die includes" braucht keiner sagen) vom Code:

Quellcode

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
Game_Level::Game_Level(State_Ingame& state) :
current_wave(NULL),
current_wave_index(0),
since_last_wave(0),
ingame_state(state)
{
}
 
Game_Level::~Game_Level()
{
delete current_wave;
}
 
 
void Game_Level::update()
{
if (current_wave && (since_last_wave > current_wave->duration))
    next_wave();
}
 
void Game_Level::next_wave()
{
current_wave_index++;
current_wave = new Game_Level_Wave(current_wave_index, ingame_state);
}


Das Problem ist der Fehler:
"SIGSEV (Segmentation Fault)" in der ersten Zeile von update. Der Fehlercode: "-1073741819 (0xC0000005)".
Man könnte denken (ich würde das tun :D), der Fehler tritt auf, weil current_wave auf nichts zeigt, aber der Member "duration" abgerufen wird. Daran liegt es aber nicht, denn entfernt man den zweiten Teil der Abfrage, sodass sie nur noch "if (current_wave)" lautet, kommt der Fehler trotzdem.
Erst, wenn man den zweiten if-Teil entfernt und das mit next_wave() tut, klappts. Es reicht nicht, bei next_wave() einfach ein return an den Anfang zu packen.
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

2

Donnerstag, 2. September 2010, 15:48

ach ja der gute alte Seg Fault ... mein FEIND!

Quellcode

1
2
3
4
5
6
void Game_Level::update()
{
if (current_wave)
  if(since_last_wave > current_wave->duration)
    next_wave();
}

ist das besser?
Realität ist nur eine subjektive Wahrnehmungsstörung.

Alles ist wahr, wenn man für wahr einen bestimmten Wert annimmt.

3

Donnerstag, 2. September 2010, 16:07

Edit: Stopp mal, das hab ich jetzt nicht verstanden. WANN geht es?
Wenn du das so schreibst?

Quellcode

1
2
3
if (current_wave)
    next_wave();
}

aber wenn du das so schreibst:

Quellcode

1
next_wave();

Klappt es nicht? oO
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Neo-Bahamut

Himmelsgleicher

  • »Neo-Bahamut« ist der Autor dieses Themas

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

4

Donnerstag, 2. September 2010, 16:44

@ Hanmac: Nein, klappt nicht.
Außerdem testet C++ doch automatisch so (wie Ruby es auch tut) oder nicht?

if (a() && b() && c())

Gute Ausführung:
Wenn a() nicht true zurück gibt, abbrechen, ansonsten:
Wenn b() nicht true zurück gibt, abbrechen, ansonsten:
Wenn c() nicht true zurück gibt, abbrechen, ansonsten trifft die Bedingung zu.

Schlechte Ausführung:
a(), b() und c() ausführen und die Ergebnisse als drei Booleans speichern.
Dann die drei Booleans prüfen.

@ Kai:
Klappt alles nicht:

Quellcode

1
2
3
4
5
6
7
8
9
10
 	if (current_wave && (since_last_wave > current_wave->duration))
    	next_wave();
 
  	if (current_wave && (since_last_wave > current_wave->duration))
    	;
 
  	if (current_wave)
    	next_wave();
 
    	next_wave();


Das funktioniert:

Quellcode

1
2
  	if (current_wave)
    	;
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

5

Donnerstag, 2. September 2010, 18:10

Na das sagt doch aber nichts aus. Ein If-Satz ohne Anweisung ist sinnlos und wird vermutlich vom Compiler einfach rausgeschmissen. Ich denke mal der Fehler liegt in dem if (current_wave). Damit prüfst du doch nur ob current_wave != NULL. Das ist sicherlich eine Möglichkeit für eine Fehladressierung. Aber offenbar ist current_wave ja eben nicht NULL sondern eine scheinbar gültige Speicheradresse die nur dummerweise ins Leere führt.

Ist current_wave privat? Wird es wirklich nur in der update-Methode belegt? Wenn nicht schau mal wo du ggf. die Variable mit einer falschen Adressierung belegst.
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Neo-Bahamut

Himmelsgleicher

  • »Neo-Bahamut« ist der Autor dieses Themas

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

6

Donnerstag, 2. September 2010, 18:21

Ja, ist private.
current_wave kommt nur in den Methoden vor, die ich gepostet habe.
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

7

Donnerstag, 2. September 2010, 18:48

Zeig mal den Headerfile.
Ansonsten können wir halt nur warten bis Ankou auftaucht ^^
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Neo-Bahamut

Himmelsgleicher

  • »Neo-Bahamut« ist der Autor dieses Themas

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

8

Donnerstag, 2. September 2010, 19:06

Quellcode

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
#ifndef GAME_LEVEL_HPP_INCLUDED
#define GAME_LEVEL_HPP_INCLUDED
 
#include <vector>
#include "game_level_wave.hpp"
 
class State_Ingame;
 
class Game_Level
{
	public:
    	Game_Level(State_Ingame& state);
    	~Game_Level();
    	void set_waves(int level_id);
    	void set_waves(std::vector<int> new_waves);
    	void update();
    	void next_wave();
    	static std::vector<int> get_waves_vector(int level_id);
	private:
    	std::vector<int> waves;
    	Game_Level_Wave* current_wave;
    	int current_wave_index;
    	int since_last_wave;
    	State_Ingame& ingame_state;
};
 
#endif // GAME_LEVEL_HPP_INCLUDED
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

9

Freitag, 3. September 2010, 10:24

if (a() && b() && c())

Gute Ausführung:
Wenn a() nicht true zurück gibt, abbrechen, ansonsten:
Wenn b() nicht true zurück gibt, abbrechen, ansonsten:
Wenn c() nicht true zurück gibt, abbrechen, ansonsten trifft die Bedingung zu.


Genau so wirds gemacht. Nennt sich "lazy evaluation".

Wie wärs, wenn du dir einfach mal den ausgeben lässt was in current_wave ist. Dann weißt du zumindest sicher, ob es NULL ist.

Ansonsten hilft vielleicht ein debugger. Wirst du früher oder später vermutlich so oder so brauchen, wenn du komplizierte Sachen mit c++ machst.

Neo-Bahamut

Himmelsgleicher

  • »Neo-Bahamut« ist der Autor dieses Themas

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

10

Freitag, 3. September 2010, 13:29

Den Debugger hab ich benutzt, Diagnose "SIGSEV" ;)
Die Fehlerzeile ist übrigens die if-Abfrage, hätte ich vielleicht noch sagen sollen.

Mit std::cout << current_wave << std::endl stürzt das Spiel ab ohne was zu printen und der Fehler ist diesmal in dieser Zeile :)
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

11

Freitag, 3. September 2010, 14:53

Zitat

Mit std::cout << current_wave << std::endl stürzt das Spiel ab ohne was zu printen und der Fehler ist diesmal in dieser Zeile :)

nachdem ich die vermutung schon per PM geäußert hab kann ich dir nun, da ich diesen Thread mit dieser Aussage gefunden hab sagen, dass dein Problem vermutlich this ist. Du wirst über irgendeinen Pointer oder eine Referenz auf eine Game_Level Instanz zugreifen, die nicht mehr existiert.

Ähnliche Themen

Social Bookmarks