Précédent   Forum des professionnels en informatique > Autres langages > Autres langages > Ada
Ada Forum d'entraide sur la programmation en langage Ada
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/12/2011, 22h30   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 7
Points : 1
Points : 1
Par défaut Ada type generic

Bonjour,

je veux créer un package en ADA pour des listes pouvant prendre n'importe quel élément.
J'ai créé une fonction pour créer une liste vide, insérer un élément dans ma liste et une autre pour rechercher un élément dans la liste.

Je voudrais maintenant créer une fonction qui affiche ma liste. Je suis confronté au problème suivant:
étant donné qu'il peut y avoir n'importe quoi dans la liste (ou presque... :-° ), je ne sais pas comment faire pour afficher ma liste. Je voudrais que dans le body de mon package, il y ait un truc du style: si c'est une liste d'entiers, j'utilise put, si c'est une liste de complexe, j'utilise putComplexe où putComplexe serait une fonction que j'aurais écrite pour écrire des complexes, ...

Merci d'avance
joss63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2011, 01h25   #2
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Bonjour,

Une solution élégante serait de passer une procédure "afficher_element" en paramètre de paquetage.

generic
type element_type is private;
with procedure afficher_element(element : in element_type);
package liste is
-- etc
end liste
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/12/2011, 12h01   #3
Invité de passage
 
Inscription : décembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 7
Points : 1
Points : 1
Ok
Et où est ce que je dois définir ma fonction afficher_element? (dans le body du package ou quand j'utilise ma fonction dans un fichier test?)
Et il faudrait que je crée plusieurs fonctions afficher et que je dise: si c'est des integer, tu utilises cette fonction, si c'est des ..., tu utilises cette fonction, ...
Comment est ce que je peux faire cela?
Merci pour votre aide
joss63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 01h49   #4
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Pourais-tu montrer la spécification de ton paquetage list ? Au moins la partie générique que je dise pas n'importe quoi... s'il te plaît ?
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 14h51   #5
Invité de passage
 
Inscription : décembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 7
Points : 1
Points : 1
Voici à quoi ressemble la spécification de mon package liste:

Code ADA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
generic 
  type t is (<>);
  with procedure afficher(l: in liste);

package p_listes is

Type element;
Type liste is private;

function creer_liste_vide return liste;

procedure inserer (x:in t; l:in out liste);

private

Type liste is access element;
Type element is record
  tete: t;
  suiv: liste;
end record;

end p_listes;

Merci pour votre aide
joss63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 16h41   #6
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Ah non,

C'est with procedure afficher(E : in t);
La procédure afficher, il te faut la déclaré avant l'instance du paquetage.
En espérant que ça le fasse.

Donc une procédure par type pour chaque l'instance de paquetage.
Si je ne m'abuse.
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 12h44   #7
Responsable Algorithmes
 
Avatar de PRomu@ld
 
Homme Romuald Perrot
Attaché Temporaire d'Enseignement et de Recherche (ATER)
Inscription : avril 2005
Messages : 4 144
Détails du profil
Informations personnelles :
Nom : Homme Romuald Perrot
Âge : 26
Localisation : France

Informations professionnelles :
Activité : Attaché Temporaire d'Enseignement et de Recherche (ATER)
Secteur : Enseignement

Informations forums :
Inscription : avril 2005
Messages : 4 144
Points : 5 301
Points : 5 301
Citation:
Donc une procédure par type pour chaque l'instance de paquetage.
Si je ne m'abuse.
C'est bien ça.
__________________
http://rperrot.developpez.com
http://phos-graphein.fr

Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter.
PRomu@ld est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 12h45   #8
Invité de passage
 
Inscription : décembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 7
Points : 1
Points : 1
Merci de votre réponse
J'arrive à afficher un entier de cette façon.
Le problème, c'est que si je veux créer un package pour afficher un entier et un autre pour afficher un flottant, il me dit qu'il y a des problèmes

Voici ma partie spécification:
Code ADA :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
generic 
  type t is (<>);
  with procedure affiche(E: in t);

package p_listes is

Type element;
Type liste is private;

function creer_liste_vide return liste;

procedure inserer (x:in t; l:in out liste);

procedure afficher(l: in liste);

private

Type liste is access element;
Type element is record
  tete: t;
  suiv: liste;
end record;

end p_listes;

Voici le body de ma partie spécification:
Code ADA :
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
with text_io; with ada.text_io; with ada.integer_text_io; 
use text_io; use ada.text_io; use ada.integer_text_io; 

package body p_listes is

function creer_liste_vide return liste is
begin
 return(null);
end creer_liste_vide;

procedure inserer (x:in t; l:in out liste) is
l1:liste;
begin
  l1:=new element;
  l1.all.tete:=x;
  l1.suiv:=l;
  l:=l1;
end inserer;

procedure afficher(l:in liste) is
begin
  if l/= null then
    affiche(l.all.tete);
    new_line;
    if l.suiv/=null then 
      afficher(l.suiv);
    end if;
  else
    put("Liste vide");
  end if;
end afficher;

end p_listes;

et ma partie de test:
Code ADA :
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
with text_io; with ada.text_io, ada.float_text_io; with ada.integer_text_io; with ada.exceptions;
use text_io; use ada.text_io, ada.float_text_io; use ada.integer_text_io; 
with p_listes;

procedure Test is

procedure affichernombre(E:in integer) is
begin
  put(E);
end affichernombre;

procedure afficherflottant(E:in float) is
begin
  put(E);
end afficherflottant;

package Liste_entier is new p_listes(t=>Integer, affiche=>affichernombre);
use Liste_entier;

package Liste_flottant is new p_listes(t=>float, affiche=>afficherflottant);
use Liste_flottant;

l1,l2 : liste;

begin

l1:=creer_liste_vide;
l2:=creer_liste_vide;

inserer(1,l1);
inserer(2,l1);
inserer(3,l1);

afficher(l1);

inserer(2.0, l2);
inserer(4.0, l2);

afficher(l2);
end;

Il me dit que Liste_flottant n'est pas défini et il voudrait que je mette des éléments de type integer dans l2
Il me dit aussi
Code :
expect discrete type in instantiation of "t"
J'ai l'impression que c'est mon type t is (<>) qui va pas mais je sais pas quoi mettre (j'ai essayé type t is private mais ça allait pas non plus )

Merci beaucoup pour votre aide précieuse
joss63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h39   #9
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Bonjour joss,

Est-ce que par hasard tu pourrais pas mètre tes float dans un type article qui lui serait discret ?
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h43   #10
Membre confirmé
 
Inscription : juin 2006
Messages : 649
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : juin 2006
Messages : 649
Points : 276
Points : 276
Et puis, par hasard encore, est-ce qu'au lieu de type t is (<>), c'est pas type t(<>)...
jovalise est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 14h25   #11
Invité de passage
 
Inscription : décembre 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 7
Points : 1
Points : 1
Citation:
Envoyé par jovalise Voir le message
Et puis, par hasard encore, est-ce qu'au lieu de type t is (<>), c'est pas type t(<>)...
J'ai trouvé ça sur wikipedia:
type T is (<>); Any discrete type: integer, modular, or enumeration.

c'est pour ça que je peux pas mélanger integer et float.

Par contre, j'ai essayé la même chose avec un type défini par des enregistrement à la place de float et ça ne marchait pas non plus.
Je vais essayer ce que tu m'as dit avant et je vous tiens au courant.
joss63 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 10h25   #12
Membre confirmé
 
Avatar de Blackknight
 
Homme Frédéric Praca
Ingénieur développement logiciels
Inscription : février 2009
Messages : 140
Détails du profil
Informations personnelles :
Nom : Homme Frédéric Praca
Âge : 38
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 : 140
Points : 226
Points : 226
Envoyer un message via AIM à Blackknight Envoyer un message via MSN à Blackknight
Bon, je me réveille un peu tard mais disons que la solution se trouve du côté de cette page
Pour être encore plus précis, je pense qu'il te faut un type non limité sinon pas d'assignation et là, ça ne marcherait pas pour tes Float et Integer.
De plus, j'aurais aussi tendance à dire qu'il faut qu'il soit defini pour pouvoir créer des variables sans assigner la valeur.
Normalement, avec ça, tu as toutes les réponses.
Il reste quand même quelques petits trucs qui ne passent pas la compilation en l'état mais rien d'insurmontable
Blackknight est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h28.


 
 
 
 
Partenaires

Hébergement Web