broidsy
Messages postés4Date d'inscriptionsamedi 29 mars 2003StatutMembreDernière intervention 4 juillet 2006
-
20 avril 2004 à 03:10
broidsy
Messages postés4Date d'inscriptionsamedi 29 mars 2003StatutMembreDernière intervention 4 juillet 2006
-
21 avril 2004 à 11:48
Bonjours à tous,
Voici un problème qui ne semble pas très compliqué et qui me bloc depuis pas mal de temps :
Type TBloc = Record
//...
Deb : TStringList;
End ;
Type TBcNiv = Record
Num : TStringList;
End;
Var
Chaine: string;
i,j,k,l,m: integer;
Bloc : Array [1..NbBloc] of TBloc;
BcNiv: Array [-1..NbBloc] of TBcNiv;
Begin
LIndentifi:=TStringList.Create;
//...
While not (NumLigne=Pred(txtSource.Count)) do Begin
LIndentifi.Clear;
//...
For i:=0 to BcNiv[Niveau].Num.Count do Begin
//Ces deux lignes utilisé pour déboguer marche sans provoquer d'erreur
chaine:=BcNiv[Niveau].Num[i];
m:=StrToInt(chaine);
//Par contre celle-ci provoque une erreur (différente???):
l:=StrToInt(BcNiv[Niveau].Num[i]);
//Et donc bien évidement celle-ci aussi
k:=Bloc[StrToInt(BcNiv[Niveau].Num[i])].Deb.Count;
//Le but est d'avoir cette ligne de code:
For j:=1 to Bloc[StrToInt(BcNiv[Niveau].Num[i])].Deb.Count do begin
Le message d’erreur est du type ‘EAcessViolation’ : violation d’accès à l’adresse mémoire…
A NOTER : Quand je mets un point d’arrêt avant le code qui provoque une erreur et que je fait : Clique droit-> Déboguer->Evaluer Modifier sur le code ‘l:=StrToInt(BcNiv[Niveau].Num[i]);’ ceci marche TRES BIEN alors que celui provoque une erreur à l’exécution d’où mon incompréhension ….
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 20 avril 2004 à 23:00
Les membres Num et Deb des deux structures de type Record ne sont pas instanciés. Il faut donc commencer par appeler le constructeur de la classe TStringList pour chacune des entrées des tableaux :
procedure InitArrays;
var
i: integer;
begin
for i := low(Bloc) to High(Bloc) do
Bloc[i].Deb := TStringList.Create;
for i := Low(BcNiv) ti High(BcNiv) do
BcNiv[i].Num := TStringList.Create;
end;
Comme les listes de chaines ne possèdent pas de propriétaires, le programme est donc responsable de la libération de la mémoire, sinon, gare aux pertes de ressources !
procedure FreeArrays;
var
i: integer;
begin
for i := low(Bloc) to High(Bloc) do
Bloc[i].Deb.Free;
for i := Low(BcNiv) ti High(BcNiv) do
BcNiv[i].Num.Free;
end;
Le message indiquant une violation d'accès était donc normal puisque tu tentes d'accéder à des objets qui ne sont pas instanciés et qui pointent, par conséquent, dans le vide ou sur des adresses occupées par d'autres programmes.
Cette erreur est fréquente chez les débutants : s'il suffit de déclarer une variable d'un type Record pour pouvoir l'utiliser, en revanche un objet a besoin d'être déclaré ET instancié.
Evidemment, quand on mixe les deux...on a tendance à l'oublier.
Bonn'prog !
May Delphi be with you
broidsy
Messages postés4Date d'inscriptionsamedi 29 mars 2003StatutMembreDernière intervention 4 juillet 2006 21 avril 2004 à 11:48
Vous avez trouvez ! Merci beaucoup. En fait le constructeur de la classe TSttringList n’était pas toujours appelé car placé à un mauvais endroit dans une boucle conditionnel.
Encore merci de ce précieux conseil qui ma débloquer!!!!!