IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Circular reference [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Circular reference
    Bonjour,

    Je suis en train de faire une espèce de "jeu de la vie" (pas tout à fait le programme d'automate cellulaire mais plutôt un système où évoluent différentes espèces intéragissant entre elles suivant des règles) dans le cadre d'un projet.

    Sous lazarus, je modélise par une classe "Jeu" l'environnement contenant une liste de pointeurs sur une autre classe "Animal" pour regrouper tous les animaux de la map. (Le schéma va un peu plus loin que ca, mais l'idée est la même)

    A chaque intervalle d'un timer j'appelle une methode Actions sur l'instance de "Jeu" qui à son tour parcourt la liste d'animaux et execute sur chacun la methode actions. Les paramètres passés à l'animal sont nombreux : nombre d'animaux dans le champ de vision, d'autres paramètres encore, ainsi qu'une liste de "Animal" (ceux présents dans le champ de vision de l'animal sur lequel la methode Actions a été appelée).

    Le problème c'est que chaque classe est dans une unité différente (normal jusque la), et que les communications entre les classes se font dans les deux sens (je voudrais passer en paramètre à "Animal" des informations définies dans "Jeu" et inversement).

    J'ai donc besoin de mettre les Uses dans les deux sens. Je connais l'"astuce" de mettre un des deux uses sous implementation et non interface, mais le problème c'est que j'ai besoin de faire appel à des types de variables etc. or dans l'unité ou je mettrai le Uses sous implementation, les entêtes et tout ce qu'il y a sous interface n'auront toujours pas acces à ces informations.

    Les besoins du proramme (tel que j'ai fait ma modélisation) sont tels que je devrais normalement mettre les deux Uses dans interface.

    Et la bien sur, l'inévitable Circular unit reference.

    Bloqué à partir de la. Des idées ?
    Merci d'avance

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 941
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 941
    Points : 5 652
    Points
    5 652
    Par défaut
    Coe,

    Tu n'as pas le choix, il faut revoir la conception.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Hello. J'ai trouvé une solution alternative.

    Une classe CObjet dont héritent toutes les classes du projet pour ne pas avoir à déclarer un type particulier.

    Maintenant j'ai un autre souci, dans le même genre :

    une classe Groupe (ou troupeau) contient la liste tous les animaux d'un troupeau, mais je veux avoir dans chaque animal du troupeau une référence au Groupe auquel il appartient. seulement j'ai le même problème.

    Dans le meilleur des cas, si je mets les deux classes dans la même unité, genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    type CGroupe = Class
    {attributs etc}
    animal:CAnimal;   //J'ai simplifié. Normalement il y aura une liste ou un array.
    {etc}
    End;
     
    type CAnimal = Class
    {attributs etc}
    groupe:CGroupe;
    {etc}
    End;
    Alors l'animal comprend ce qu'est un CGroupe, mais CGroupe ne comprend pas ce qu'est un CAnimal, et l'inverse si j'inverse l'ordre des deux classes.

    Que devrais je faire ?
    J'ai pensé à utiliser CObjet encore une fois, mais ca fait un peu lourd, j'ai pensé aussi à utiliser un string ou un integer qui serait l'"index" du groupe, mais ca impliquerait plus haut dans la hiérarchie d'avoir à parcourir la liste des groupes pour récupérer l'instance de CGroupe qui a cet index... un peu laborieux surtout avec beaucoup de groupes et un programme reglé par un timer avec un petit intervalle ...

    Encore une fois merci d'avance.

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    (merci pour l'edit, je ferai gaffe à l'avenir).

    Après une recherche hasardeuse sur le cours pascal, j'ai trouvé un paragraphe bien caché sur les déclarations imbriquées. le nom sonnait bien je suis allé voir, c'est exactement ce qu'il me faut

    J'ai donc auto résolu une partie de mon problème, peut être même entièrement, reste à voir si ca s'applique à tous mes cas "à risque". Je vais donc mettre résolu même si j'en suis pas tout à fait sur, pour que d'autres passant par la puissent voir la solution.

    Il suffisait dans mon cas de déclarer des pointeurs (la raison est expliquée dans le cours "introduction à la POO") :

    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
     
    type PAnimal = ^CAnimal;
           PGroupe = ^CGroupe;
     
    type CGroupe = Class
    {attributs etc}
    animal:PAnimal;
    {etc}
    End;
     
    type CAnimal = Class
    {attributs etc}
    groupe:PGroupe;
    {etc}
    End;
    Merci quand même bien que je sois déçu par un certain manque de réactivité pour mon sujet, ne serait ce que pour me dire "va voir tel cours"

    Euh comment on met résolu ?

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 308
    Points
    4 308
    Par défaut
    On a un très bon cours sur la POO ici : http://hdd34.developpez.com/cours/artpoo/



    Et pour le "Résolu", c'est un bouton en bas à gauche de la page.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  6. #6
    Candidat au Club
    Inscrit en
    Avril 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    C'est bien à ce cours que je faisais référence lol

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Points : 55
    Points
    55
    Par défaut
    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
    type 
     
    TAnimal = class;
    TGroupe = class;
    ....
     
    TGroupe = class
    {attributs etc}
    animal:TAnimal;
    {etc}
    End;
     
    TAnimal = class
    {attributs etc}
    groupe:TGroupe;
    {etc}
    End;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 04/06/2015, 01h26
  2. [XL-2010] Colorer une cellule - circular reference
    Par StephThai dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/01/2014, 11h02
  3. [XL-2010] Erreur "Circular reference" dans fonction
    Par yzf-r dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/10/2013, 15h17
  4. Réponses: 0
    Dernier message: 02/09/2013, 16h12
  5. [Lazarus] Circular Unit Reference
    Par lohot dans le forum Lazarus
    Réponses: 1
    Dernier message: 18/01/2007, 02h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo