Problème de règles de priorité ???

broidsy Messages postés 4 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 4 juillet 2006 - 20 avril 2004 à 03:10
broidsy Messages postés 4 Date d'inscription samedi 29 mars 2003 Statut Membre Derniè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 ….

Merci d’avance pour votre aide.

2 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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
0
broidsy Messages postés 4 Date d'inscription samedi 29 mars 2003 Statut Membre Derniè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!!!!!
0
Rejoignez-nous