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

Ada Discussion :

type abstrait et gestionnaire de données.


Sujet :

Ada

  1. #1
    Invité
    Invité(e)
    Par défaut type abstrait et gestionnaire de données.
    Bonjour,
    Je suis amateur en programmation, Je me fait vieux, j'ai l'impression de ne plus savoir programmer. En plus j'ai découvert de nouveau mot réservé.. bref.

    Je voudrait faire un petit programme d'information sur des objets divers.
    Je voudrais mémoriser tout les objets dans un unique gestionnaire de donnée.

    Je voudrais en gros construire ma bibliothèque ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with Ada.Finalization;
    package Libmy is
       type My_type is abstract tagged limiited private;
    private
       type My_Type is new Ada.Finaliization.Limiited_Controlled with null record;
       type My_Access is access all My_Type'class;
    end Libmy;
    Et je souhaiteras définir un manager pour tous les objets dérivé du type My_Type;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    package Libmy.Manager is
        -- Action dans un gestiionnaire de donnée;
    private
        --- ...
        Manager : -- à définir;
    end Libmy_Manager;
    En suite dériver le type My_Type dans des paquet enfants de Libmy, et pouvoir ajouter ces nouveau type dans mon gestionnaire.

    Eventuellement doc, je pourrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    package Libmy.Machine.Animal.Human is
     type Human_Type is new Animal_Type with private;
    private
       --- ...
    end Libmy.Machine.Animal.Human;
    Mais en réalité j'ai aucune idée de comment bien organiser la chose.

    Si vous pouviez m'éclairer, s'l vous plaît. Merci.

  2. #2
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    C'est pas très clair tout ça !!!
    Que fait ton gestionnaire ? A quoi correspond ton ajouter dans le gestionnaire ?
    C'est un ensemble de my_Type et dérivés ?
    En tout cas, l'utilisation de paquetages enfant n'est pas forcément obligatoire et seule la relation d'héritage importe. D'ailleurs en n'en faisant pas des paquetages enfant, tu verras directement ce à quoi la relation d'héritage te donne accès.
    Ensuite, les fonctions et procédures qui devront être utilisables par les types dérivés devront utiliser les pointeurs de classe (attribut 'Class).

    Mais il faudrait que tu sois plus clair sur ce que tu veux faire parce que si tu n'arrives pas à l'expliquer, c'est normal que tu n'arrives pas à l'organiser

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Blackknight Voir le message
    C'est pas très clair tout ça !!!
    Que fait ton gestionnaire ? A quoi correspond ton ajouter dans le gestionnaire ?
    C'est un ensemble de my_Type et dérivés ?
    En tout cas, l'utilisation de paquetages enfant n'est pas forcément obligatoire et seule la relation d'héritage importe. D'ailleurs en n'en faisant pas des paquetages enfant, tu verras directement ce à quoi la relation d'héritage te donne accès.
    Ensuite, les fonctions et procédures qui devront être utilisables par les types dérivés devront utiliser les pointeurs de classe (attribut 'Class).

    Mais il faudrait que tu sois plus clair sur ce que tu veux faire parce que si tu n'arrives pas à l'expliquer, c'est normal que tu n'arrives pas à l'organiser
    Bonjour, merci.
    Je vais essayer de pas répondre à coté.
    Mon gestionnaire doit me permettre de manipuler en ensemble de données.
    Comme ajouter, supprimer, afficher, sauvegarder, trier si c'est pas déjà fait.

    Ajouter c'est ajouter un élément, je comprends pas la question en fait.

    Ca devrait être un ensemble de My_Type et dérivé, mais je n'ai actuellement réussi à faire qu'un ensemble d'accès sur des type My_Type à l'échelle de classe.

    Et j'ai aucune idée de l'impact sur le programme.

    En fait j'ai plutôt ceci comme spécification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with Ada.Finalization;
    package Libmy is
       type My_type is abstract tagged limiited private;
       type My_Access is access all My_Type'class;
    private
       type My_Type is new Ada.Finaliization.Limiited_Controlled with null record;
     
    end Libmy
    Ah oui, et pour ajouter en fait, je dois créer l'objet de toute pièce et je dois le mettre dans mon gestionnaire.

  4. #4
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Bonjour, merci.
    Je vais essayer de pas répondre à coté.
    Mon gestionnaire doit me permettre de manipuler en ensemble de données.
    Comme ajouter, supprimer, afficher, sauvegarder, trier si c'est pas déjà fait.

    Ajouter c'est ajouter un élément, je comprends pas la question en fait.
    Ok, en fait, tu avais bien compris ma question
    Donc si tu précises que ton gestionnaire prend tous les types issus de my_Type, ça devrait fonctionner.
    Par exemple, un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure add(le_gestionnaire : my_Type_List; Object : my_type'Class);
    Pour les créations d'objet, moi, je passerai par un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Create(mes_params : Param_my_type) return my_Type'Class is abstract;
    Bon, après, il faut vérifier que tu peux construire ta liste (i.e. Vector par exemple en Ada2005 ou une implémentation à toi) avec des objets juste my_type'class.

    En tout cas, regardes bien le Wikibook sur la partie objet, tu y trouveras peut-être des infos.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Blackknight Voir le message
    Ok, en fait, tu avais bien compris ma question
    Donc si tu précises que ton gestionnaire prend tous les types issus de my_Type, ça devrait fonctionner.
    Par exemple, un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure add(le_gestionnaire : my_Type_List; Object : my_type'Class);
    Ca ok, c'est possible je suis en train de ré-écrire du code.
    Mais j'a une iintérogation pour le trie, comment fais-je ?
    Citation Envoyé par Blackknight Voir le message
    Pour les créations d'objet, moi, je passerai par un truc comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function Create(mes_params : Param_my_type) return my_Type'Class is abstract;
    Bon, après, il faut vérifier que tu peux construire ta liste (i.e. Vector par exemple en Ada2005 ou une implémentation à toi) avec des objets juste my_type'class.

    En tout cas, regardes bien le Wikibook sur la partie objet, tu y trouveras peut-être des infos.
    Je fait une liste doublement chaîné à moi.

    Par contre je vois pas ce à quoi peut ressembler le type Param_My_Type.

    Merci pour tes réponses. déjà.

  6. #6
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Par contre je vois pas ce à quoi peut ressembler le type Param_My_Type.
    C'était juste un exemple, cela correspondrait juste aux paramètres nécessaires à la construction d'un objet de type my_Type.

    Mais j'a une iintérogation pour le trie, comment fais-je ?
    Je fait une liste doublement chaîné à moi.
    Heu là, il va falloir que tu regardes les algorithmes de tri sur une liste chaînée... Mais j'aurais tendance à te dire que tu devrais utiliser un composant existant déjà plutôt que de ré-inventer la roue. Je suis sûr que tu pourras en trouver un qui fait de l'insertion trié
    ... Comme tu n'es plus étudiant, je te conseille de regarder dans Ada2005... Là précisément en fait

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je peux as instancier une Ada.Conainers.Double_Linked_Liist avec un type à l'échelle de classe.

    Je sais pas comment initialiser mon My_access.

    My : My_Access := new ? ' (object).

  8. #8
    Invité
    Invité(e)
    Par défaut
    J'ai décidément un gros problème.
    J'ai écrs un poil de code, et j'ai une erreur que je ne comprends pas au vues de ce que je lis dans john Barnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    libmy-human.adb:13:42: expect ancestor type of "Human_Type"
    Je vous donne tout mon programme permettant d'ajouter et d'afficher une vie ou un humain.
    une vie est un article de deux date, un humain et l'extension d'une vie avec un nom.
    Main.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with Arche;
    procedure Main is
     
    begin
    --  Arche.Create(Arche.Life);
    --  Arche.Print(Arche.Life);
       Arche.Create(Arche.Human);
       Arche.Print(Arche.human);
    end Main;
    Arche:specification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    package Arche is
     
       type Class_Type is (Life, human);
     
       procedure Create(Class : in Class_Type);
       procedure Print(Class :  in Class_Type);
     
    end Arche;
    Arche:implementaton
    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
    with Libmy;
    with Libmy.Life;
    with Libmy.Human;
    with Libmy.Manager;
    package body Arche is
     
       My_Manager : Libmy.Manager.Manager_Type;
     
     
     
       procedure Create(Class : in Class_Type) is
          My : Libmy.My_Access;
       begin
          case Class is
             when Life =>
                Libmy.Life.Gen(My);
                Libmy.Manager.Add(My_Manager, My);
             when Human =>
                Libmy.human.Gen(My);
                Libmy.Manager.Add(My_Manager, My);
          end case;
       end Create;
     
       procedure Print(Class :  in Class_Type) is
     
          My : Libmy.My_Access;
          Cursor : Libmy.Manager.Cursor_Type;
       begin
          if not Libmy.Manager.Is_Empty(My_Manager) then
             Cursor := Libmy.Manager.First(My_Manager);
             My := Libmy.Manager.Element(Cursor);
             case Class is
                when Life =>
                   if My.all in Libmy.Life.Life_Type then
                      Libmy.Life.Print(Libmy.Life.Life_Type(My.all));
                   end if;
                when Human =>
                   if My.all in Libmy.Human.Human_Type then
                      Libmy.Human.Print(Libmy.Human.Human_Type(My.all));
                   end if;
               end case;
          end if;
       end Print;
    end Arche;
    Human:specification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with Ada.Strings.Unbounded;
    with Libmy.Life;
    package Libmy.Human is
     
       use Ada.Strings;
       type Human_Type is new Libmy.Life.Life_type with
          record
             Name : Unbounded.Unbounded_String;
          end record;
       procedure Gen(human : in out My_access);
       procedure Print(Human : in Human_Type'class);
    end Libmy.Human;
    Human: implementation
    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
    with Ada.Text_Io;
    package body Libmy.Human is
     
       procedure Gen(human : in out My_access) is
          Name : Unbounded.Unbounded_String;
          My_Life : My_Access;
       begin
     
          Libmy.Life.Gen(My_Life);
          Text_Io.Put("Enter the name:");
          Name := Unbounded.To_Unbounded_String(Text_Io.Get_Line);
          Human := new Human_Type ' (My_Life.all  with Name => name);
       end Gen;
       procedure Print(Human : in Human_Type'class) is
       begin
          Text_Io.Put("Name:" & Unbounded.To_String(Human.Name));
          Libmy.Life.Print(Libmy.Life.Life_Type(human));
       end Print;
    end Libmy.Human;
    Life:specification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    with Ada.Calendar;
    package Libmy.Life is
       type Life_Type is new My_Type with private;
       procedure Gen(My : in out My_access);
       procedure Print(My : in Life_Type'class);
    private
       type Life_Type is new My_Type with
          record
             Birth : Calendar.Time;
             Death : Calendar.Time;
          end record;
    end Libmy.Life;
    Life:implementation
    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
    with Ada.Text_Io;
    with Ada.Calendar.Formatting;
    package body Libmy.Life is
     
       procedure Gen(My : in out My_Access) is
          Date : constant Calendar.Time := Calendar.Clock;
       begin
          My := new Life_Type;
          Life_Type(My.all).Birth := Date;
          Life_Type(My.all).Death := Date;
       end Gen;
     
     
       procedure Print(My : in Life_Type'class) is
       begin
          Text_Io.Put("Birth:" & Calendar.Formatting.Image(My.Birth) &
                        ", death:" & Calendar.Formatting.Image(My.Death));
       end Print;
     
     
    end Libmy.Life;

    Libmy:specification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with Ada.Finalization;
    package Libmy is
     
       type My_Type is abstract tagged limited private;
       type My_Access is access all My_Type'Class;
       procedure Gen(My : in out My_Access) is abstract;
       procedure Print(My : in My_Type'class) is abstract;
    private
       use Ada;
     
       type My_Type is abstract new Finalization.Limited_Controlled with
         null record;
    end Libmy;
    Surtout que je souhaiteras en fait initialiiser mes objets dans la procedure initialize que je suis sensé réécrire avec finalize pour détruire l'objet si j'ai bien compris, enfin je suis paumé. Malgré mes bricolage, je suis coincé.

    Merci pour votre aide.

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'ai deux warnnig aussi pour les procédure Gen et Print dans libmy.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    libmy.ads:7:44: warning: abstract subprogram is not dispatching or overriding
    libmy.ads:8:46: warning: abstract subprogram is not dispatching or overriding
    Je ne sais vraiment pas quoi en faire.

    Bon j'arrête là pour ce soir.

  10. #10
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Pourrais-tu fournir une concaténation de l'ensemble de tes sources afin de pouvoir les tester chez nous après passage dans gnatchop ?
    Parce que là, je ne vois pas bien comme ça ce qui se passe.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je poste mon code actuel, qui diffère un peu de ce qui est au dessus.
    L'erreur doit toujours relevée du même principe. Mais n'est pas la même non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void:Arche# gnatmake src/main.adb -aIsrc/lib
    gcc-4.3 -c -Isrc/ -Isrc/lib -I- /home/root/Ada/Arche/src/lib/arche-manager.adb
    arche-manager.adb:29:52: expect ancestor type of "human_type"
    Elle correspond au instruction ligne 148 dans les sources suivantte.


    Voici les sources:
    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    with Ada.Finalization;
    package Libmy is
       type My_Type is
         abstract new Ada.Finalization.Controlled with null record;
       procedure Initialize(My : in out My_Type'Class) is abstract;
       procedure Finalize(My : in out My_Type'Class) is abstract;
       procedure Print(My : in My_Type'class) is abstract;
    end Libmy;
     
    with Libmy;
    with Ada.Calendar;
    package Liblife is
       use Ada;
       type Life_type is new Libmy.My_Type with
          record
             Birth : Calendar.Time;
             Death : Calendar.Time;
          end record;
       procedure Print(Life : in Life_Type);
    private
       procedure Initialize(Life : in out Life_Type);
       procedure finalize(Life : in out Life_Type);
    end Liblife;
     
     
    with Ada.Text_Io;
    with Ada.Calendar.Formatting;
    package body Liblife is
     
       procedure Initialize(Life : in out Life_Type) is
     
       begin
          null;
       end Initialize;
       procedure finalize(Life : in out Life_Type) is
       begin
          null;
       end Finalize;
       procedure Print(Life : in Life_Type) is
       begin
          Text_Io.Put("Birth:" & Calendar.Formatting.Image(Life.Birth) &
                        ", death:" & Calendar.Formatting.Image(Life.Death));
       end Print;
    end Liblife;
     
     
    with Liblife;
    with Ada.Strings.Unbounded;
    package Libhuman is
       use Ada.Strings;
       type human_type is new Liblife.Life_Type with
          record
             Name : Unbounded.Unbounded_String;
          end record;
       procedure Print(Human : in Human_Type);
    private
       procedure Initialize(Human : in out Human_Type);
       procedure finalize(Human : in out Human_Type);
    end Libhuman;
     
     
    with Ada.Text_Io;
    package body Libhuman is
       use Ada;
       procedure Initialize(Human : in out Human_Type) is
     
       begin
          null;
       end Initialize;
     
       procedure finalize(Human : in out Human_Type) is
       begin
          null;
       end Finalize;
     
       procedure Print(Human : in Human_Type) is
       begin
          Liblife.Life_Type(Human).Print;
          Text_Io.Put("Name:" & Unbounded.To_String(Human.Name));
       end Print;
    end Libhuman;
     
    with Gnat.Sockets;
    use Gnat.Sockets;
    package Arche is
     
       type Class_Type is (Life, human);
     
       type Request_Type is (Full_List, Create);
     
       Service_Port : Port_Type := 5870;
    end Arche;
     
     
    with Libmy, LibLife, LibHuman;
    use LibLife, LibHuman;
    with Ada.Containers.Doubly_Linked_Lists;
    use Ada.Containers;
    package Arche.Manager is
     
       procedure Create(Class : in Class_Type);
       procedure Print(Class :  in Class_Type);
     
       Limit_Error : exception;
       Usage_Error : exception;
     
     
       type My_Access is access all Libmy.My_Type'Class;
     
     
       package My_DLL Is new Ada.Containers.Doubly_Linked_Lists(My_Access,
                                                                "=");
     
       My_Manager : My_Dll.List;
     
    end Arche.Manager;
     
     
     
    with Ada.Calendar;
    with Ada.Strings.Unbounded;
    with Ada.Text_Io;
    package body Arche.Manager is
     
       use Ada, Ada.Strings;
     
       procedure Create(Class : in Class_Type) is
          The_Cursor : My_Dll.Cursor;
          Date : constant Calendar.Time := Calendar.Clock;
          Name : Unbounded.Unbounded_String;
          The_Life  : My_Access;
          The_Human : My_Access;
       begin
          The_Cursor := My_Dll.Last(My_Manager);
          case Class is
             when Life =>
                The_Life := new Life_Type;
                Life_Type(The_Life.all).Birth := Date;
                Life_Type(The_Life.all).Death := Date;
                My_Dll.Insert(My_Manager, The_Cursor, The_Life);
             when Human =>
     
                Life_Type(The_Life.all).Birth := Date;
                Life_Type(The_Life.all).Death := Date;
                Text_Io.Put("Enter Name:");
     
                Name := Unbounded.To_Unbounded_String(Text_Io.Get_Line);
                The_human := new Human_Type '(The_Life.all with Name => Name);
                My_Dll.Insert(My_Manager, The_Cursor, The_Human);
          end case;
     
       end Create;
     
     
       procedure Print(Class :  in Class_Type) is
          The_Cursor : My_Dll.Cursor;
       begin
          if My_Dll.Is_Empty(My_Manager) then
             raise Usage_Error;
          end if;
          The_Cursor := My_Dll.First(My_Manager);
          case Class is
             when Life =>
                for I in 1..My_Dll.Length(My_Manager) loop
                   if My_Dll.Element(The_Cursor).all in Liblife.Life_Type then
                      Life_Type(My_Dll.Element(The_Cursor).all).Print;
                   end if;
                   My_Dll.Next(The_Cursor);
                   Text_Io.New_Line;
                end loop;
             when Human =>
                for I in 1..My_Dll.Length(My_Manager) loop
                   if My_Dll.Element(The_Cursor).all in Human_Type then
                      Human_Type(My_Dll.Element(The_cursor).all).print;
                   end if;
                   My_Dll.Next(The_Cursor);
                 Text_Io.New_Line;
                end loop;
          end case;
       end Print;
    end Arche.Manager;
     
     
    with Arche.Manager;
    procedure Main is
     
       use Arche, Arche.Manager;
    begin
       --  Arche.Create(Arche.Life);
       --  Arche.Print(Arche.Life);
       Create(Arche.Human);
       Print(Arche.human);
    end Main;

  12. #12
    Invité
    Invité(e)
    Par défaut
    En "castant" (je crois que ça s'appelle comme ça) l'objet ça passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     The_human := new Human_Type ' (Life_Type(The_Life.all) with Name => Name);

    Si c'est bon.... J'ai une autre interrogation relative...
    Je fais du réseau et coté serveur pas de problème je connais la class des objet.

    Mais pour recevoir un objet My_Type à l'echelle de classe.... Je connais pas la class à priori.
    J'ai fait ceci, mais je ne ne sait pas comment appeller Print par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Empty_Line : Natural := 23;
          My : access Libmy.My_Type'Class;
       begin
          loop
             Errno := System(To_C("clear"));
             Text_Io.Put_Line("Arche:version 1.0.0");
             Arche.Request_Type'Output(Channel, Full_List);
             Count := Natural'Input(Channel);
             for I in 1..Count loop
                My := new My_Type'Class ' ( My_Type'class'Input(Channel));
             end loop;

    Une idée, un doc ?

  13. #13
    Invité
    Invité(e)
    Par défaut Résolution du problème.
    A ben j'ai tout résolut.
    Sauf les problème de visibilité. Je pense qu'il est possible de faire miieux de ce côté.
    Je voulais tester des truc rapidement aussi, ça a influencé mon implémentation.
    Bref, à la dernier question j'ai fait ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for I in 1..Count loop
                My := new My_Type'Class ' ( My_Type'class'Input(Channel));
                if My.all in Life_Type then
                   Life_Type(My.all).Print;
                elsif My.all in Human_Type then
                   Human_Type(My.all).Print;
                end if;
             end loop;

    En espérant que ça puisse servir.

    Merci blackknight.

    En fait je vais attendre blackknight, .... Mouais.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Les source complètes sur mon site perso : http://www.jovalise.net/download/Arc....1debug.tar.gz

  15. #15
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Mince, j'arrive après la bataille.
    Désolé mais je n'ai pas eu le temps de regarder ton code hier et aujourd'hui, ce sera pareil.
    Toutefois, je suis surpris que tu sois obligé de connaître le type concret de ton objet pour le print. En effet, à quoi servirait le dynamic dispatching ?
    Promis, dès que j'ai du temps, je regarde ça de près.

  16. #16
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Premières questions/suggestions en passant :
    - Pourquoi avoir créer un type My_Type dont toutes les méthodes sont abstraites plutôt qu'une interface ? Cela te laisserait toute latitude pour pouvoir faire hériter les types implémentant l'interface
    - Il serait bien de cacher la déclaration de ta DLL dans le corps de arche.manager. Cela te permettra de changer l'implémentation sans changer l'interface et donc sans recompiler les unités en dépendant

    Je continue à regarder et je t'en dis plus

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Blackknight Voir le message
    Premières questions/suggestions en passant :
    - Pourquoi avoir créer un type My_Type dont toutes les méthodes sont abstraites plutôt qu'une interface ? Cela te laisserait toute latitude pour pouvoir faire hériter les types implémentant l'interface
    Bonjour blackknight,
    Je ne connais pas le mot interface, et je comprend pas le doc, je lis pas l'anglais.
    Ca consiste en quoi ?
    Citation Envoyé par Blackknight Voir le message
    - Il serait bien de cacher la déclaration de ta DLL dans le corps de arche.manager. Cela te permettra de changer l'implémentation sans changer l'interface et donc sans recompiler les unités en dépendant

    Je continue à regarder et je t'en dis plus
    Oui c'est ce qui devrait être fait, mais c'est pas fait encore.

  18. #18
    Membre averti Avatar de Blackknight
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2009
    Messages : 214
    Points : 383
    Points
    383
    Par défaut
    Je ne connais pas le mot interface, et je comprend pas le doc, je lis pas l'anglais.
    Oups, effectivement, si tu ne lis pas l'anglais, c'est gênant.
    Interface est le mot-clé qui permet de définir un contrat pour les objets implémentant l'interface. C'est un peu comme ton type abstrait mais comme l'héritage multiple n'est pas possible, cela te permet de faire implémenter une interface ET hériter d'un type taggué.
    Je sais pas si j'ai été clair

    En tout cas, en y réfléchissant après coup, je ne suis pas sûr que tu puisses de toutes façons créer une liste doublement chaînée sur des interfaces.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Voic l'utilisation que je fais mon manager,
    ici, c'est un vecteur, mais ça change rien.


    Partie du contenu de archeserver.adb version 1.0.2alpha: le threadclient côté serveur:
    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
    task body T_Thread_Server is
          The_Cursor : My_Dll.Cursor;
          Channel : Stream_Access := Stream(Socket.all);
          Id : Positive;
          My : My_Access;
       begin
          accept get_id(id : out task_id) do
             id := current_task;
          end get_id;
          loop
             case Arche.Request_Type'Input(Channel) is
                when Full_List =>
                   Id := positive'input(Channel);
                   The_Cursor := My_Dll.To_cursor(My_Manager, id);
                   for I in id..positive'Min(Id+21, Integer(My_Dll.Length(My_Manager))) loop
                      My_Type'Class'Output(Channel, My_Dll.Element(The_Cursor).all);
                      My_Dll.Next(The_Cursor);
                   end loop;
                when Create =>
                   My := new My_Type'Class ' (My_Type'class'Input(Channel));
                   My_Manager := My_Dll."&"(My_Manager, My);
                when Element =>
                   Id := positive'input(Channel);
     
                   The_Cursor := My_Dll.To_cursor(My_Manager, id);
                   My_Type'Class'Output(Channel, My_Dll.Element(The_Cursor).all);
     
                when Length =>
                   Natural'Output(Channel, Natural(My_Dll.Length(My_Manager)));
             end case;
          end loop;
       end T_Thread_Server;
    Donc, déjà, je dis que ça devvrait être fait, mais je ne sais pas comment faire pour cacher l'implémentation du Manager.
    Il faudrait de je redéfinisse ce qu'est un cursor même un vecteur peut-être. Je ne sais pas.

  20. #20
    Invité
    Invité(e)
    Par défaut gestionnaire de données
    D'abord merci blackkknight de t'être penché sur mon problème.


    Pour l'interfacage du gestionnaire de donnée, pour le moment donnc, j'ai fait ceci.

    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
    with Ada.Containers.Vectors;
     
    use Ada.Containers;
    package Arche.Manager is
     
       type Cursor_Type is private;
       function To_Cursor(Id : in Positive) return Cursor_Type;
       function Length return Natural;
       function Element(Cursor : in Cursor_Type) return My_Access;
       procedure Next(Cursor : in out Cursor_Type);
       procedure Add(My : in My_Access);
       Limit_Error : exception;
       Usage_Error : exception;
    private
     
       package My_DLL Is new Ada.Containers.Vectors(Positive,
                                                    My_Access,
                                                    "=");
     
       type Cursor_Type is
          record
             Cursor : My_Dll.Cursor;
          end record;
     
       My_Manager : My_Dll.vector;
     
    end Arche.Manager;
    Est-ce que ça correspond à l'idée que tu souhaitais me faire passer ?

Discussions similaires

  1. Les types abstraits de données (ADT)
    Par Emmanuel Delahaye dans le forum C
    Réponses: 5
    Dernier message: 05/06/2013, 14h59
  2. Classe : type abstrait de donnée
    Par problems99 dans le forum Langage
    Réponses: 6
    Dernier message: 11/01/2011, 13h59
  3. Réponses: 26
    Dernier message: 10/01/2008, 22h37
  4. Type abstrait de donnée
    Par mia123 dans le forum Pascal
    Réponses: 1
    Dernier message: 01/06/2007, 14h00

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