Bonjour à tous!
Je pige mal encore les pointeurs (boo-hou à moi-même).
Je me suis créer une class qui contient un TStringList.
De cette class je veux faire un vecteur et modifier les StringList.
J'obtient un message d'erreur "Invalid pointer operation".
J'ai chercher de ce côté :
Tutoriel sur les pointeurs en dynamique
Mais, j'ai toujours le même problème, alors me voici.
Mes classes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 class Trajet { public : AnsiString Style; TStringList *TrajetCode; void ReInitialise(); ~Trajet(); Trajet(); }; Trajet::Trajet() { TrajetCode = new TStringList; } Trajet::~Trajet() { if(TrajetCode) { delete TrajetCode; } } void Trajet::ReInitialise() { TrajetCode->Clear(); Style = ""; } class Outils { public : TStringList *OutilsStringList; int Sequence; int IndexDebut; AnsiString Numero; vector<Trajet> TrajetOutils; void ReInitialise(); Outils(); ~Outils(); }; Outils::Outils() { OutilsStringList = new TStringList; } Outils::~Outils() { if(OutilsStringList) { delete OutilsStringList; } } void Outils::ReInitialise() { OutilsStringList->Clear(); Sequence = 0; IndexDebut = 0; Numero = 0; }
Pour ce qui est du bout de code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 //Variables vector<Outils> ListeOutils; Outils OutilsEnCours; AnsiString SectionEnCours; int IndexOfLastOutils = 0; int IndexOfLastTrajet = 0; unsigned int i = 0; TStringList *FichierComplet = new TStringList; AnsiString CodeToolChange = "tool"; AnsiString CodeStyleChange = "style"; //Chargement de mon fichier FichierComplet->LoadFromFile(Fichier); //Boucle sur mon fichier while(i<FichierComplet->Count) { //S'il s'agit d'un tool change if(FichierComplet->Strings[i] == CodeToolChange) { //On reinitialise la variable Outils OutilsEnCours->ReInitialise(); //On l'ajoute à la liste d'outils //-------------- Erreur survient avec cette ligne -------------// ListeOutils.push_back(OutilsEnCours); //-------------- Erreur survient avec cette ligne -------------// //On trouve l'index du dernier IndexOfLastOutils = ListeOutils.size()-1; //On modifie la variable section pour dire qu'on travail sur la portion trajet SectionEnCours = "outils"; } //S'il s'agit d'un style change else if(TempStyleChange == CodeStyleChange) { //On reinitialise la variable Trajet TrajetEnCours->ReInitialise(); //On l'ajoute à la liste de trajet OutilsFeuille[IndexOfLastOutils].TrajetOutils.push_back(TrajetEnCours); //On trouve l'index du dernier IndexOfLastTrajet = OutilsFeuille[IndexOfLastOutils].TrajetOutils.size()-1; //On modifie la variable section pour dire qu'on travail sur la portion trajet SectionEnCours = "trajet"; } if(SectionEnCours == "outils") { ListeOutils[IndexOfLastOutils].OutilsStringList->Add(FichierComplet->Strings[i]); } else if(SectionEnCours == "trajet") { ListeOutils[IndexOfLastOutils].TrajetOutils[IndexOfLastTrajet].TrajetCode->Add(FichierComplet->Strings[i]); } } if(FichierComplet) { delete FichierComplet; }
Le problème est que ça ne plante pas immédiatement au premier passage dans la section problématique.
Ça plante au 3e passage. J'imagine que puisque je ne créer pas de nouveau OutilsEnCours, le pointeur du StringList continu de pointer vers l'ancienne emplacement lorsque j'essai de le pousser à la fin de mon vecteur.
Il fautdrait que je créer un nouveau OutilsEnCours pour chaque fois que je le pousse à la fin de mon vector? De la sorte, j'aurais un TStringList tout neuf à chaque fois?
Enfin, pour l'instant j'ai remplacé mon TStringList par un vector<AnsiString> dans ma classe Trajet et Outils, mon code fonctionne, alors c'est ma compréhension des pointeurs qui est déficiente.
J'ai essayer la méthode du Tutorial, mais bon, je crois que je ne pige pas quelque chose parce que ça plante avec le même message d'erreur, mais au premier passage.
Est-ce que ce tutoriel est selon vous la méthode à adopter et ce n'est que moi qui est trop débutant pour réussir?
Merci de votre attention!
antoine
Partager