Pointeur vers une variable (record) de type : array of array of ...

Pointeur vers une variable (record) de type : array of array of ... - Delphi/Pascal - Programmation

Marsh Posté le 04-04-2005 à 08:50:53    

Bonjour à tous.  :hello:  
Voilà j'ai certaines difficultés avec l'utilisation d'un pointeur (Delphi).

Code :
  1. TTableau = array of array of TID_Tableau;
  2. TEn_tete = record
  3.            ...
  4.            ... 
  5.            Matrice : TTableau ;
  6.           end;     
  7.                    
  8. var PEn_tete  : ^TEn_tete;


 
Comme vous voyez PEn_tete est un pointeur qui pointe vers des varaibles dynamique de type TEn_tete composées de record et entre autre justement de TTableau qui est un tableau dynamique.
 
Bref, pour mon programme je crée un nombre important de varaible TEn_tete grâce au pointeur: new(PEn_tete), le pointeur correspondant est sauvegardé dans une TList: List.Add(PEn_tete).  
Le problème est que justement les données (List[X]^.Matrice[i,j].Y) que je lis grâce à l'appel du pointeur dans la list sont complètement érronés, tous les pointeurs dans la liste pointent vers une matrice qui on toutes les données de la dernière matrice enregistrée.
 
Or ce phénomène ne se passe pas quand j'utilise un tableau fix (Ca serait logique non? Car le compilateur ne sait pas combien de mémoire allouer dans le cas d'un tableau dynamique, c'est ça???):  

Code :
  1. TTableau = array [0..2,0..2] of TID_Tableau;


 
Est-ce que la création de variable dynamique (de type array of array of) grâce à des pointeurs est impossible????
J'ai malheursement rien trouvé dans des livres ni sur le site.
 
Merci beaucoup de votre aide.  :jap:

Reply

Marsh Posté le 04-04-2005 à 08:50:53   

Reply

Marsh Posté le 04-04-2005 à 12:10:55    

Quand tu remplis les champs de ton tableau, tu le redimensionnes bien ? (avec SetLength)
 
Tu peux activer l'option Range Checking dans Project -> Options -> Compiler le temps de trouver le problème.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-04-2005 à 12:12:26    

Au passage, à moins d'être obligé d'utiliser un record, j'utiliserais des objets (déclarés comme class au lieu de record donc) et une TObjectList pour ne pas avoir à gérer les désallocations.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-04-2005 à 12:38:00    

Ben, à un moment du programme je suis obligé de créer des varaibles dynamiques:

Code :
  1. new(PEn_tete);
  2. ...
  3. PEn_tete^.Matrice := Matrice_Jeu;


Et la matrice : Matrice_Jeu est une variable globale et a été dimensionée à la création de la fiche principale (oncreate).
 

  • Faut-il aussi dimension "PEn_tete^.Matrice" avec SetLength avant que je n'y stock Matrice_Jeu ??? (j'ai essayé et ça n'a pas marché semble-t-il)


  • Par la suite, je me suis dit que le compilateur ne sait pas combien de mémoire alouer à PEn_tete^.Matrice, et donc je me suis dit que je ferais mieux d'utiliser GetMem au lieu de New qui me permet de déterminer la taille en mémoire (Size of du record), mais j'ai un message d'erreur  :( .


Concernant ta proposition d'utiliser des class et TObjectList, ben là je suis désolé tu m'en demandes trop j'ai jamais travaillé avec ces choses là  :(.  
 
Sur un autre forum on m'a dit le suivant:

Citation :

une variable tableau ouvert est un pointeur, donc tu dois le déréférencer :  
 
List[X]^.Matrice^[i,j].Y)

Citation :

2 choses :  
- pas de new, mais setlength(tableau ouvert, nb d'éléments) pour réserver la place  
 
- PEn_tete(List[X])^.Matrice^[i,j].Y marchera pê mieux car je pense que ta liste n'est pas typée...


 
????
Bref je patauge dans la mouise  :D .  
 :jap:


Message édité par Profil supprimé le 04-04-2005 à 12:55:40
Reply

Marsh Posté le 04-04-2005 à 12:46:45    

Ces histoires de pointeurs et de tableaux dynamiques j'ose pas trop y toucher :D En général je me contente des objets et des listes :o


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed