Ada: type t'class, access, ... bref erreur de type

Ada: type t'class, access, ... bref erreur de type - Ada - Programmation

Marsh Posté le 20-04-2002 à 00:13:16    

J'ai cru voir des programmeurs ada, alors bonjour a eux.
Je tiens à vous soumettre ce problème de typage.
Je souhaite faire une structure de type hétérogène.
je pense alors a de l'objet, avec polymorphisme et aiguillage dynamique, mais ca ne marche pas...
 
procedure test is
 type obj1 is tagged null record;
        --1er obj vide
 type obj2 is new obj1 with null record;
        --2nd obj vide
 type ptr is access obj1'class;          
        --pointeur sur la classe obj1 et donc sur obj1 et obj2
 
 procedure test (t: in obj1) is
 begin
  null;
 end test;
 
 procedure test (t: in obj2) is
 begin
  null;
 end test;
 
 procedure test_tag (t: in ptr) is
 begin
  test(t.all);
 end test_tag;
 
begin
 null;
end test;
 
et après compilation j'obtiens l'erreur:
 
If the expected type of a name or expression is a tagged type, then it shall not be dynamically tagged unless it is a controlling operand in a call on a dispatching operation
 
ben alors, oui c'est justement pour faire du "dispatching"...
 
voila, si quelqu'un voulez bien m'expliquer pourquoi, et comment arriver à mes fins. merci.

Reply

Marsh Posté le 20-04-2002 à 00:13:16   

Reply

Marsh Posté le 20-04-2002 à 16:28:53    

houla ... ton problème dépasse mes faibles et viellissantes connaissances ;)
désolé, je peux pas t'aider sur ce coup là ...  
 
(up)

Reply

Marsh Posté le 23-07-2009 à 18:40:20    

silvyan a écrit :

J'ai cru voir des programmeurs ada, alors bonjour a eux.
Je tiens à vous soumettre ce problème de typage.
Je souhaite faire une structure de type hétérogène.
je pense alors a de l'objet, avec polymorphisme et aiguillage dynamique, mais ca ne marche pas...
[...]


Bonjour Silvyan,
 
Aprés examen de ton source, il apparait que le dispatching ne peut pas fonctionner directement sous la forme où tu l'as tenté, car les primitives (les opérations qui peuvent être redéfinies et donc dispatchées), ne peuvent apparaitrent que dans une spécification de package.
 
Dans ton exemple, les déclarations apparaissent comme des déclarations locales d'une procédure.
 
Il est en effet souvent tentant de faire des teste dans les déclarations locales d'une procédure, car c'est plus rapide, mais ça ne fonctionne pas toujours, car Ada n'autorise pas tout dans ce contexte.
 
Pour faire fonctionner ton exemple, il est tout de même possible de déclarer un package localement (pour ce cas précis, ça marche).
 
De plus, tu as déclaré tes procédure “ test ”, au mauvais endroit. Pour qu'elle soit interprétée comme une primitive, la déclaration d'une opération ou d'une fonction, doit apparaître immédiatement aprés la déclaration du type.
 
Voici un exemple reformulé, qui reprend autant que possible tes propres termes :  
 
(le forum modifie un peu la mise en forme, désolé pour ça)
 

Code :
  1. -- Exemple Ada 2005
  2. procedure Essais is
  3.    -- Pour http://forum.hardware.fr/hfr/Programmation/ADA/
  4.    -- class-access-erreur-sujet_18288_1.htm
  5.    -- ========================================================================
  6.    -- Specifications de Dispatching
  7.    -- ------------------------------------------------------------------------
  8.  
  9.    package Dispatching is
  10.       type Obj1 is tagged null record;
  11.       -- 1er obj vide
  12.       procedure Test (T : in Obj1);
  13.       -- Primitive de Obj1
  14.       type Obj2 is new Obj1 with null record;
  15.       -- 2nd obj vide
  16.       overriding procedure Test (T : in Obj2);
  17.       -- Redefinition de la primitive.
  18.       -- Le mot clé "overriding" n'est pas obligatoire, mais il rend
  19.       -- le source plus claire.
  20.    end Dispatching;
  21.    -- ========================================================================
  22.    -- Implementation de Dispatching
  23.    -- ------------------------------------------------------------------------
  24.  
  25.    package body Dispatching is
  26.      
  27.       procedure Test (T : in Obj1) is
  28.       begin
  29.          null;
  30.       end Test;
  31.       procedure test (T : in Obj2) is
  32.       begin
  33.          null;
  34.       end Test;
  35.      
  36.    end Dispatching;
  37.    -- ========================================================================
  38.    -- Type et objet pour l'essai
  39.    -- ------------------------------------------------------------------------
  40.  
  41.    type Ptr is access Dispatching.Obj1'Class;
  42.    --pointeur sur la classe obj1 et donc sur obj1 et obj2
  43.    procedure Test_Tag (T : in Ptr) is
  44.    begin
  45.       Dispatching.Test (T.all);
  46.    end Test_Tag;
  47.    Obj : constant Ptr := new Dispatching.Obj1;
  48.    -- ========================================================================
  49.    -- Point d'entré du programme
  50.    -- ------------------------------------------------------------------------
  51.  
  52. begin
  53.  
  54.    Test_Tag (Obj);
  55.  
  56. end Essais;


Reply

Marsh Posté le 23-07-2009 à 19:03:17    

Hibou57 a écrit :


Bonjour Silvyan,


7 ans plus tard [:implosion du tibia]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-07-2009 à 19:15:49    

IWH 7 years \o/ statistiquement, le posteur original a changé 3 fois de boite depuis ...


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 23-07-2009 à 19:21:15    

C'est ça, la cat ADA. [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 23-07-2009 à 20:11:57    

Et que ce thème puisse être récurrent et récurer le moral de ses victimes, ça ne vous ait jamais venu à l'esprit ?
 
Vaut-il mieux une question qui reste sans réponse ou un problème qui trouve une solution ?
 

Reply

Marsh Posté le 23-07-2009 à 20:16:32    

Hibou57 a écrit :

Et que ce thème puisse être récurrent et récurer le moral de ses victimes, ça ne vous ait jamais venu à l'esprit ?


Après 7 ans sans que personne ne s'en préoccupe et pour un langage que personne n'a envie d'utiliser (à part jovalise)? Non.

Message cité 1 fois
Message édité par masklinn le 23-07-2009 à 20:16:41

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-07-2009 à 20:36:24    

masklinn a écrit :


Après 7 ans sans que personne ne s'en préoccupe et pour un langage que personne n'a envie d'utiliser (à part jovalise)? Non.


Jovalise est ici ??  :)  :)  
 
Comment il va ?  :)  :)  
 
Invite le à passer sur comp.lang.ada à l'occasion

Message cité 1 fois
Message édité par Hibou57 le 23-07-2009 à 20:36:53
Reply

Marsh Posté le 23-07-2009 à 20:46:35    

Hibou57 a écrit :


Jovalise est ici ??  :)  :)  
 
Comment il va ?  :)  :)  
 
Invite le à passer sur comp.lang.ada à l'occasion


Moi? Non merci, tu peux t'en charger tout seul j'évite de le lancer perso.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 23-07-2009 à 20:46:35   

Reply

Marsh Posté le 24-07-2009 à 12:45:31    

Hibou57 a écrit :

Et que ce thème puisse être récurrent et récurer le moral de ses victimes, ça ne vous ait jamais venu à l'esprit ?
 
Vaut-il mieux une question qui reste sans réponse ou un problème qui trouve une solution ?
 

Oui oui, perso, j'approuve pleinement ton intervention, et si ça plait pas à Masklinn, c'est son problème.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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