Ich hab mir wie folgt in einer Klasse eine Map erstellt:
|
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
|
#ifndef EFFECT_MANAGMENT_HPP
#define EFFECT_MANAGMENT_HPP
#include <SFML\Graphics.hpp>
#include <string>
#include <vector>
#include <map>
#include "effect.hpp"
class c_effect_managment
{
private:
// effect_map
std::map< std::string, c_effect > EffectMap;
// effect_maps_iterator
std::map< std::string, c_effect >::iterator ekari;
public:
void effect_area_load( unsigned int slots , unsigned int sides , std::vector< int > units_sides );
void slot_to_effects_load( unsigned int pos , unsigned int unit_pos , unsigned int side );
void load_effect( const std::string &data );
void Release_All_Effects();
};
#endif
|
Soweit sogut, dann wollte ich in die Map Dateien Laden, über diese Funktion:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void c_effect_managment::load_effect( const std::string &data )
{
ekari = EffectMap.find( data );
if ( ekari == EffectMap.end() )
{
c_effect load;
ekari = EffectMap.insert ( std::make_pair ( data , load ) ).first;
ekari->second.load_original_effect( data );
}
}
|
Aber sobald er den data String suchen soll, bekomme ich diesen Fehler:
Unbehandelte Ausnahme bei 0x779615de in Live and Dead.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xccccccd0.
Auftreten tut er in der xtree Datei an dieser Stelle:
|
C-/C++-Quelltext
|
1
2
3
4
|
_Nodeptr& _Root() const
{ // return root of nonmutable tree
return (this->_Parent(this->_Myhead));
}
|
Ich hab schon probiert den Wert einfach hineinzuschieben ohne ihn zuerst zu suchen, was auch nicht geht. In dem Data String steht: "gift" falls das weiterhilft, in der Map ist noch kein einziger Wert zu dem Zeitpunkt vorhanden.
Die Klasse c_effect sieht so aus, falls es an der Liegen könnte:
|
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#ifndef EFFECT_SELFMAID_HPP
#define EFFECT_SELFMAID_HPP
#include <string>
#include <vector>
#include <map>
#include <fstream>
#include "read_txt.hpp"
class c_effect
{
private:
// classes
c_string_change s_c;
// data
std::string name;
std::string kind;
std::string kind_of_effect;
std::vector< std::string > double_use;
int double_use_data;
bool clear;
bool strength;
int strength_max;
int strength_data;
bool stage_state;
int stage_data;
std::vector< std::vector< std::string > > data_needed;
std::vector< int > data_needed_place;
// structs
struct run_time
{
std::string kind;
int data;
std::vector< std::string > kind_of_data;
};
struct execution
{
std::string kind;
std::vector< std::string > data;
};
struct temp_drain_regen
{
std::string kind;
int data;
int refresh_time;
int start;
int duration;
};
struct temp_hp_drain_regen
{
int data;
int refresh_time;
std::vector< std::string > kind_of_data;
int goal_lifesteal;
int start;
int duration;
};
// vectoren
std::vector< run_time > rt;
std::vector< execution > kind_of_execution;
std::vector< temp_drain_regen > drain_regen;
std::vector< temp_hp_drain_regen > hp_drain_regen;
// use data
// use data vectoren
public:
c_effect();
// functions out
void load_original_effect( const std::string &data );
};
#endif
|
Ich hatte zuvor in der "effect_managment" Klasse noch einen vector mit structs der identische Maps enthalten hatte:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
struct effects_data
{
std::map< std::string, c_effect > effects;
};
std::vector< std::vector < effects_data > > effects;
|
Wenn ich den Code dazuschreibe habe ich Error Einträge in der am Anfang aufgeführten Map, wenn ich sie zum ersten mal beschreiben will. Ich habe deswegen den Code ausgeklammert. Aber meine Frage dazu, warum habe ich da Error Einträge in der anderen Map? Den Vector lade ich einmal in einer Funktion auf, indem ich einen std::vector < effects_data > erstelle und diesen mit push_back in den effects Vektor schiebe, so oft wie ich ihn brauche, in diesem Beispiel 2x7 mal. Der Hintergrund warum ich soviele Maps bräuchte, jede der Positionen im Vektor wäre eine Einheit auf meinem Schlachtfeld, das effect_managment verwaltet all die Effekte die eine Einheit haben kann, z.b. Gift, Blutung usw. . Die Namen der Effekte sind nicht Hardgecoded, die werden alle in einer Textdateien definiert. Sobald ein Effekt auftritt, würde ich in die der Einheit zugehörige Map den Effekt laden, der setzt sich zusammen aus der Effekt Vorlage in der EffectMap und den fehldenden Daten die bei der auslösenden Fertigkeit definiert sind. Z.b. bei einem Gift das es 7 Schaden über 5 Runden macht, eine andere Fertigkeit könnte jetzt 4 Schaden über 6 Runden auslösen. Dazu muss ich bei fast jeder Fertigkeit die ausgelöst ist nach Effekten überprüfen, ob die auf dem Ziel vorhanden sind. Das als Erklärung warum ich soviele Maps bräuchte.
Aber generell komme ich garnicht soweit, weil ich oben schon mit der ersten Map scheitere. Obwohl ich auf identische Art eine Map in meinem image_manager verwende, deswegen verstehe ich jetzt auch nicht wirklich wo jetzt hier der Fehler liegt. Zuerst dacht ich es liegt am iterator, deswegen habe ich den paar mal Unbenannt, aber schließlich hat sich herausgestellt das es an dem nicht liegt. Auch wenn ich es etwas komisch find, dass er über 40000 Einträge hat, aber evtl. liegt das ja daran das er auf noch nichts Verweist. Übersehe ich bei meinem Code etwas ganz offensichtliches, was ich falsch mache?
Google suche hat mir auch nichts passendes gebracht, aber evtl. such ich da auch nach den falschen Begriffen.