---------------------------------
-- D. Mathieu                  --
--                             --
-- fichier Essai06.adb         --
--                             --
-- créé le 13/12/98            --
--                             --
---------------------------------
--
-- Programme de test d'un article contenant un champ de type tâche.
-- Ce programme provoque l'affichage suivant (variable si plusieurs
-- executions successives) :
--
-- La tache  2 vous dit Coucou
-- R2.I  = 3 La tache
-- 2 Tache cadre achevee vous dit Coucou
--
-- La tache  2 vous dit Coucou
-- La tache  2 vous dit Coucou

-- Remarques :
--   1) - le type T_TskCoucou est un type non contraint (il n'y a pas de
--        valeur par défaut) => il ne peut plus être utilisé tel quel.
--   2) - noter l'utilisation du discriminant d'un article pour instancier
--        le discriminant d'une tâche incluse dans l'article ...
--   3) - le type tâche est un type limited => un article dont un champ est
--        une tâche est d'un type limited => affectation interdite.
--   4) - on remarque l'imbrication des affichages des différentes tâches
--        qui se déroulent en parallèle

with Ada.Text_Io;
use  Ada.Text_Io;

procedure Essai06 is

   task type T_TskCoucou (Nbre : Positive);

   package P_Entier is new Ada.Text_Io.Integer_Io (Positive);
   use     P_Entier;
 
   task body T_TskCoucou is
 
   begin -- T_TskCoucou
 
      for I in 1..Nbre loop
         Put      (" La tache ");
         Put      (Nbre, 2);
         Put_Line (" vous dit Coucou");
         delay 1.0;
      end loop;
 
   end T_TskCoucou;
 
   type T_Record (Discri : Integer) is record
      I : Integer := 3;
      -- T : T_TskCoucou;     -- erreur de compilation :
                              -- "unconstrained subtype in component
                              --  declaration".
      -- T : T_TskCoucou (I); -- erreur de compilation :
                              -- "component "I" cannot be used before end
                              -- of record declaration"
      T : T_TskCoucou (Discri);
   end record;
 
   R1, R2 : T_Record (2);

begin -- Essai06

   -- R2   := R1; -- erreur de compilation :
                  -- "left hand assignment must be not limited type"
   Put (" R2.I = ");
   Put (R2.I, 2);
   New_Line;
   Put_Line (" Tache cadre achevee");

end Essai06;