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 :

[Ada] Generics...


Sujet :

Ada

  1. #1
    dclink
    Invité(e)
    Par défaut [Ada] Generics...
    Salut tt le monde!
    J'ai implémenté un File générique comme ceci (files.ads)
    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
    -- Spécification du paquetage des Files
    Generic
        Type TElement is private;    
        ZERO: TElement;
    Package Files is
    	Type TMaillon is private;
        Type PtMaillon is access TMaillon;
        Type TFile is record
            tete: PtMaillon;
            queue: PtMaillon;
        end record;
        Procedure CreerFile(LaFile: OUT TFile);
        Function FileVide(LaFile: TFile) return boolean;
        Function LireFile(LaFile: TFile) return TElement;
        Procedure Enfiler(Element: TElement; LaFile: IN OUT TFile);
        Procedure Defiler(LaFile: IN OUT TFile);
    Private
        Type TMaillon is record
            valeur: TElement;
            suivant: PtMaillon;
        end record;
    end Files;
    Puis une structure de données comme suit (territoire.ads)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
        Type Territoire(lignes, colonnes: Integer) is private;   
        ...
    Private
        Type Territoire(lignes, colonnes: Integer) is record
            ...
        end record;
        TNULL: Territoire(0, 0);    
    end JeuDeLaVie;
    Est-il possible d'instancier comme ceci dans le corps du paquetage territoire.adb ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Package FileTerritoire is new Files(Territoire, TNULL);
    Car ObjectADA ne veut rien savoir, il compile pas... (Message d'erreur : Actual type must be definite, Continuing...)
    Merci d'avance.

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    L'instanciation devrait etre possible, donc il doit y avoir une boulette ailleurs, mais j'avoue qu'avec les infos que tu donnes, je ne vois pas ou.

    A+

  3. #3
    dclink
    Invité(e)
    Par défaut
    Voici toute la spécif alors
    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
     
    -- Spécification du paquetage JeuDeLaVie
    Generic
        with function F(Habitant: boolean) return boolean;
    Package JeuDeLaVie is
        Type Territoire(lignes, colonnes: Integer) is private;   
        Type Tgrille is array(Integer range <>, Integer range <>) of boolean;
        Type Taffichage is (AvecAffichage, SansAffichage);
        Type Temporisation is (AvecTemporisation, SansTemporisation, FrappeTouche);
        Procedure InitialisationManuelle(LeTerritoire: OUT Territoire; LaGrille: IN Tgrille);
        Procedure InitialisationAuto(LeTerritoire: OUT Territoire);
        Procedure AffichageTerritoire(LeTerritoire: IN Territoire);
        Procedure JeuNGeneration(LeTerritoire: IN OUT Territoire; n: IN Integer; 
            					Laffichage: IN Taffichage:=SansAffichage;
                                LaTempo: IN Temporisation:=SansTemporisation);
        Procedure Jeu1Generation(LeTerritoire: IN OUT Territoire);
        Procedure Rejeu(LeTerritoire: IN OUT Territoire; LaTempo: IN Temporisation:=AvecTemporisation);
        Procedure ActionTemporisation(LaTempo: IN Temporisation);
    Private
        Type Territoire(lignes, colonnes: Integer) is record
            GrilleTerritoire: Tgrille(1..lignes, 1..colonnes);
            Generation, Population, Naissances, Deces: Integer:=0;
        end record;
        TNULL: Territoire(0, 0);    
    end JeuDeLaVie;
    et le body
    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
     
    -- Corps du paquetage JeuDeLaVie
    With Files;
    With Ada.Numerics.Discrete_Random;
    With Text_IO;
    Use Text_IO;
    Package body JeuDeLaVie is
        Package FilesTerritoire is new Files(Territoire, TNULL);
        LimitesGrille:Exception;    
        Procedure InitialisationManuelle(LeTerritoire: OUT Territoire; LaGrille: IN Tgrille) is
        begin
            if (LaGrille'Length<2 and LaGrille'Length>Integer'Last) or 
               (LaGrille'Length(2)<2 and LaGrille'Length(2)>Integer'Last) then
                   raise LimitesGrille;
            end if;
            LeTerritoire.GrilleTerritoire:=LaGrille;
            LeTerritoire.Generation:=LeTerritoire.Generation+1;
            for indiceI in LeTerritoire.GrilleTerritoire'Range loop
                for indiceJ in LeTerritoire.GrilleTerritoire'Range(2) loop
                    if LeTerritoire.GrilleTerritoire(indiceI, indiceJ)=true then
                    	LeTerritoire.Population:=LeTerritoire.Population+1;
                    end if;
                end loop;
            end loop;	
        Exception
        	when LimitesGrille =>
            	put_line("Erreur limites grille (les lignes et les colonnes doivent avoir entre 2 et " &
                		Integer'Image(Integer'Last) & " éléments !!");
    	end InitialisationManuelle;
     	Procedure InitialisationAuto(LeTerritoire: OUT Territoire) is
        Subtype GrilleRange is Integer range 2..Integer'Last;
        Package Grille_Rand is new Ada.Numerics.Discrete_Random(GrilleRange);
        Use Grille_Rand;
        lignes, colonnes: Integer:=0;
        GenerateurA, GenerateurB: Generator;
        begin
           	Reset(GenerateurA);
            Reset(GenerateurB);
            lignes:=Random(GenerateurA);
            colonnes:=Random(GenerateurB);        
            declare
            	GrilleTemp: Tgrille(1..lignes, 1..colonnes);
            begin
            	InitialisationManuelle(LeTerritoire, GrilleTemp);
            end;
    end InitialisationAuto;
    Procedure AffichageTerritoire(LeTerritoire: IN Territoire) is
    begin
        put_line("Generation " & Integer'Image(LeTerritoire.Generation));
        for indiceI in LeTerritoire.GrilleTerritoire'Range(2) loop
        	for indiceJ in LeTerritoire.GrilleTerritoire'Range loop
        		put(" _");
        	end loop;
        	new_line;
            for indiceK in LeTerritoire.GrilleTerritoire'Range loop
    	        put("|");
    	        if LeTerritoire.GrilleTerritoire(indiceK, indiceI)=true then
    	            put("X");
    	        else
    	            put(" ");
                end if;
            end loop;
         	put("|");   
       		new_line;
        end loop;
        for indiceL in LeTerritoire.GrilleTerritoire'Range loop
       		put(" -");
        end loop;
        new_line;
        put_line("La population est de :" & Integer'Image(LeTerritoire.Population) & " habitants.");
        put_line("Il y a eu " & Integer'Image(LeTerritoire.Naissances) & " naissances et " & 
        						Integer'Image(LeTerritoire.Deces) & " deces.");
    end AffichageTerritoire;
    Procedure JeuNGeneration(LeTerritoire: IN OUT Territoire; n: IN Integer;
        					Laffichage: IN Taffichage:=SansAffichage;
                            LaTempo: IN Temporisation:=SansTemporisation) is
    begin
        for indiceGen in 1..n loop        
    	    for indiceI in LeTerritoire.GrilleTerritoire'Range loop
    	        for indiceJ in LeTerritoire.GrilleTerritoire'Range(2) loop
                	LeTerritoire.GrilleTerritoire(indiceI, indiceJ):=F(LeTerritoire.GrilleTerritoire(indiceI, indiceJ));
    	        end loop;
            end loop;
            InitialisationManuelle(LeTerritoire, LeTerritoire.GrilleTerritoire);
            -- Ajouter LeTerritoire a la File
        end loop;
        if Laffichage=AvecAffichage then
            AffichageTerritoire(LeTerritoire);
        end if;
        ActionTemporisation(LaTempo);
    end JeuNGeneration;
    Procedure Jeu1Generation(LeTerritoire: IN OUT Territoire) is
    begin
        JeuNGeneration(LeTerritoire, 1);
    end Jeu1Generation;
    Procedure Rejeu(LeTerritoire: IN OUT Territoire;
        			LaTempo: IN Temporisation:=AvecTemporisation) is
    begin
        ActionTemporisation(LaTempo);
    end Rejeu;
    Procedure ActionTemporisation(LaTempo: IN Temporisation) is
    begin
        case LaTempo is
        when AvecTemporisation =>
            delay 3.0;
        when FrappeTouche =>
            declare
                CharTemp: character;
            begin
            	get(CharTemp);
            end;
        when others =>
            null;
        end case;
    end ActionTemporisation;
    end JeuDeLaVie;

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    J'avoue avoir été embetté pour m'occuper du cas ZERO aussi sur ce projet, du coup je n'en ai pas tenu compte, j'ai une levée d'exception pour la lecture de file vide qui est sous forme de procedure (l'avantage est qu'il n'y a aucun probleme lorsque le sous-programme lirefile ne renvoie rien

    j'en profite pour te demander un peu d'aide, pourrais-tu montrer le corps de ton paquetage files ? merci ;-) car j'ai un soucis apparement


    edit: En fait j'ai eu la solution à ma betise ;-) Merci Alcatîz

Discussions similaires

  1. Ada type generic
    Par joss63 dans le forum Ada
    Réponses: 11
    Dernier message: 24/01/2012, 10h25
  2. ADA package generic type non visible
    Par koda29 dans le forum Ada
    Réponses: 4
    Dernier message: 02/05/2010, 20h31
  3. Réponses: 1
    Dernier message: 11/10/2004, 10h47
  4. [Ada] Gnat
    Par kilinette dans le forum Ada
    Réponses: 4
    Dernier message: 04/10/2004, 09h58

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