utilisation de with et use en ada

utilisation de with et use en ada - Ada - Programmation

Marsh Posté le 16-03-2006 à 12:01:55    

voila, pour le moment je tatonne avec les with et les use pour appeller les packages, mais j'aimerai savoir quelle est l'utilité du with, et du use pour les utiliser a bon escient. Merci !

Reply

Marsh Posté le 16-03-2006 à 12:01:55   

Reply

Marsh Posté le 16-03-2006 à 19:35:42    

Je ne suis pas spécialiste mais pour moi, "with" appel le package, et use indique qu'on va utiliser les fonctions dans celui-ci.
 
par exemple avec un  
with ada.text_io;
use ada.text_io;
 
lorsque tu mettras un put("hello" ); cette fonction sera appelée dans le package text_io.
 
Mais si tu surcharges le put(t : string); dans un package perso par exemple, en en-tête tu mettras juste
 
with ada.text_io;
with tonpackage;
 
et dans ton programme tu pouras mettre :
 
text_io.put("texte affiché avec la fonction générique" );
tonpackage.put("texte affiché avec ta fonction perso" );
 
bref si tu ne veux pas t'embéter à mettre package.fonction à chaque fois tu peux mettre un "use" en en-tête, mais attention aux conflits avec les surcharges.


Message édité par ChOoN le 16-03-2006 à 19:37:05
Reply

Marsh Posté le 20-03-2006 à 15:03:29    

merci.
maintenant j'ai un autre probleme: je dispose de 2 packages et je dois en créer un troisième qui apelle les 2 autres. il s'agit de
1/ Plistgen : regroupant le type liste générique et les fonctions associées.
2/ Pmot : définissant un mot comme une liste générique instanciée avec le type caractère
3/ un type pphrase définissant une phrase comme une liste générique instanciée avec le type tmot (définit dans pmot, représente un mot)
 
le probleme de ce dernier package est que soit il ne reconnait pas le type tmot définit dans pmot, soit il ne reconnait pas certaines fonctions de plistgen instanciées dans pphrase comme une liste de tmot. quelqu'un a-t-il une idée ?

Reply

Marsh Posté le 20-03-2006 à 15:10:56    

voila le package listegénérique

Code :
  1. generic
  2. type TElement is private;
  3. with procedure écrire (x : in TElement);
  4. package PlistGen is
  5. type TptrCellule is private;
  6. procedure INIT_LISTE( p : out TptrCellule);
  7. -- pre-requis : aucun
  8. -- action : Crée une liste vide : la tête de liste p est initialisée a null
  9. function VIDE( p : in TptrCellule) return boolean ;
  10. -- pre-requis : p est la tête d'une liste simplement chainee
  11. -- résultat : retourne vrai si la liste L(p) est vide, faux sinon
  12.  
  13. procedure INSERE_EN_TETE(p : in out TptrCellule; e : in TElement);
  14. -- pre-requis : p repère une liste simplement chainee
  15. -- action :   Ajoute l'élément e en tête de la liste L(p)
  16. procedure INSERE_APRES (s : in out TptrCellule; e : in TElement);
  17. -- pre-requis : s repère une cellule d'un liste simplement chainee
  18. -- action : Ajoute l'élément e après la TCellule repérée par s
  19. function LONGUEUR ( P : in TptrCellule) return integer;
  20. -- pre-requis : tête repère une liste simplement chaînée L(tete)
  21. -- résultat :   calcule et retourne la longueur de la liste L(tete)
  22. procedure AFFICHE_LISTE(p : in TptrCellule);
  23. -- pre-requis : p est la tête d'une liste simplement chainee
  24. -- action : affiche a l'écran toutes les valeurs de la liste
  25. function PRESENT( p : in TptrCellule; e : in TElement) return boolean ;
  26. -- résultat : retourne vrai si la valeur e est présente dans une TCellule de L(p), faux sinon
  27. procedure PASSER_AU_SUIVANT ( r : in out TptrCellule) ;
  28. -- pre-requis : aucun
  29. -- action : si r est différent de null, r retourne la valeur contenue dans r.suiv sinon r reste inchange a null
  30. function VALEUR_CELLULE ( r : in TptrCellule) return TElement;
  31. -- pre-requis : r repère une cellule effective d'une liste simplement chainee
  32. -- résultat : la fonction reourne la valeur de r.val
  33. private
  34. type TCellule ;
  35. type TptrCellule is access TCellule;
  36. type TCellule is record
  37. val : TElement;
  38. suiv : TptrCellule;
  39. end record;
  40. end PlistGen;


 
Le package Pmot

Code :
  1. with plistgen;
  2. with text_io; use text_io;
  3. package pmot is
  4. type tmot is private;
  5. procedure saisie_mot (mot: out tmot);
  6. procedure affiche_mot (mot: in tmot);
  7. private
  8. package PListeCar is new Plistgen (character, put);
  9. use plistecar;
  10. type tmot is new Plistecar.tptrcellule;
  11. end;


 
et la package Pphrase

Code :
  1. with plistgen;
  2. with pmot; use Pmot;
  3. with text_io; use text_io;
  4. package Pphrase is
  5. type tphrase is private;
  6. procedure saisie_phrase (phrase: out tphrase);
  7. procedure affiche_phrase (phrase: in tphrase);
  8. private
  9. package PListeMot is new Plistgen (tmot, affiche_mot);
  10. use plisteMot;
  11. type tphrase is new PlisteMot.tptrcellule;
  12. end;


le probleme est une erreur dans le corps du package pphrase:

Code :
  1. package body pphrase is
  2. procedure saisie_phrase (phrase: out tphrase) is
  3. mot:Tmot; fin:tphrase;
  4. begin
  5. init_liste(phrase);
  6. saisie_mot(mot);
  7. insere_en_tete(phrase,mot);
  8. saisie_mot(mot);
  9. fin:=phrase;
  10. while not present(mot,'.') loop                <===== line 11 col 12
  11.  insere_apres (fin,mot);
  12.  passer_au_suivant(fin);
  13.  saisie_mot(mot);
  14. end loop;
  15. end;
  16. procedure affiche_phrase (phrase: in tphrase) is
  17. fin:tphrase:=phrase;
  18. begin
  19. for i in 1..longueur(phrase) loop
  20.  affiche_mot(valeur_cellule(fin));put(' ');
  21.  passer_au_suivant(fin);
  22. end loop;
  23. end;
  24. end;


l'erreur :

Citation :


--------------------Target: Win32 (Intel) Debug--------------------
pphrase.adb: Error: line 11 col 12 LRM:8.6(28), Cannot resolve; if calling the PRESENT at line 40 of file plistgen.ads, type mismatch for param 1, p: TptrCellule (found tmot), type mismatch for param 2, e: tmot; if calling the PRESENT at line 40 of file pphrase.ads, type mismatch for param 1, p: tphrase (found tmot), type mismatch for param 2, e: tmot.
Front end of ..\pphrase.adb failed with 1 error.
Tool execution failed.
il n'y a pas de ligne 40 dans pphrase.ads, je pense qu'il veut parler de l'instanciation de plistgen  
(package PListeMot is new Plistgen (tmot, affiche_mot);
 use plisteMot;
 type tphrase is new PlisteMot.tptrcellule;)



Message édité par tris le 21-03-2006 à 15:21:25
Reply

Marsh Posté le 20-03-2006 à 16:52:20    

Bon, alors 1er conseil:
 
Utilises les balises de code source pour éditer ton code, comme ça on a accès facilement aux numéros de ligne (c'est + pratique).
 
Faut nous aider un peu si tu veux qu'on t'aide, j'ai pas envie de m'embêter à chercher où est la ligne 40 de Plistgen.ads ou la ligne 11 d'un autre fichier...


Message édité par apprentitux le 20-03-2006 à 16:56:50
Reply

Marsh Posté le 20-03-2006 à 19:09:21    

étant donné que je n'ai pas trouvé comment afficher les N° de lignes avec object ada, j'ai rajouté des commentaires en rouge pointant les erreurs.
(au passage si quelqu'un sait comment on fait pour les N° de lignes)

Message cité 1 fois
Message édité par tris le 20-03-2006 à 20:08:33
Reply

Marsh Posté le 21-03-2006 à 01:20:44    

normalement avec les versions un peu recente de Jgrasp(autre environment de developpement Ada 95) tu as directement les numeros de lignes dans l'icone Toggle lines number, il suffit juste de cliquer dessus pour que les numeros de lignes de ton code s'affiche. Qd tu veux plus tu cliques de nouveau dessus pour desactiver. et ca marche :) :)

Reply

Marsh Posté le 21-03-2006 à 12:59:45    

ok merci je note Jgrasp. et sinon pour mon problème ?

Reply

Marsh Posté le 21-03-2006 à 15:01:26    

tris a écrit :

étant donné que je n'ai pas trouvé comment afficher les N° de lignes avec object ada, j'ai rajouté des commentaires en rouge pointant les erreurs.
(au passage si quelqu'un sait comment on fait pour les N° de lignes)


 
Quand tu édites ton source dans un post utilises les balises C/C++ comme ça:

Code :
  1. ton code .....


 
Il suffit ensuite de double clicker sur la zone d'affichage pour faire apparaitre ou disparaitre les numéros de ligne.
 

Reply

Marsh Posté le 21-03-2006 à 15:11:08    

Bon pour ton problème, ça à l'air évident : le compilateur te dit exactement ce qui ne va pas :
 
Tu appèles Present(..) avec un paramètre de type Tmot alors qu'il faut un Tptrcellule.

Reply

Marsh Posté le 21-03-2006 à 15:11:08   

Reply

Marsh Posté le 21-03-2006 à 15:17:19    

mais le type tmot est un tptrcellule qui pointe dans ce cas une cellule avec un caractère.

Reply

Marsh Posté le 21-03-2006 à 15:30:38    

tris a écrit :

mais le type tmot est un tptrcellule qui pointe dans ce cas une cellule avec un caractère.


 
NON, le type Tmot n'est pas un Ptrcellule.
 
Lorsque tu déclare :

Code :
  1. type tmot is private;


 
Tu dis aux utilisateurs de ce paquetage (les parties du programme qui utilisent ton paquetage) que Tmot est un type sur lequel sont permises les opérations d'affectation et de comparaison (= et /=).
 
Donc pas question d'inventer des opérations sur ce type.
 
(Je sens que tu galères un peu là).
 
Bon pour l'instant j'ai pas trop le temps de me pencher sur ton prog, alors a+ et lis un peu des cours sur la dérivation de type (genre  cours de l'iut de Luminy de Daniel Feneuille)
 
Bon travail ...

Reply

Marsh Posté le 21-03-2006 à 15:38:45    

la définition est complétée plus bas:

Code :
  1. private   
  2. package PListeCar is new Plistgen (character, put);   
  3. use plistecar;   
  4. type tmot is new Plistecar.tptrcellule;
  5. end;

Message cité 1 fois
Message édité par tris le 21-03-2006 à 15:39:07
Reply

Marsh Posté le 22-03-2006 à 14:16:07    

Oui mais non, le type Tmot n'est pas un Ptrcellule.
 

tris a écrit :

la définition est complétée plus bas:

Code :
  1. private   
  2. package PListeCar is new Plistgen (character, put);   
  3. use plistecar;   
  4. type tmot is new Plistecar.tptrcellule;
  5. end;



 
Bon apparemment par:

Code :
  1. while not present(mot,'.')


Tu veux dire ça :

Code :
  1. while not Pmot.present(mot,'.')


 
N'est-ce pas?
 
Est ce que tu comprends pourquoi ce prog ne compile pas ? :

Code :
  1. with Ada.Text_Io;
  2. procedure truc is
  3.   type Entier is new Integer;
  4.   i : Integer;
  5.   e : Entier;
  6. begin
  7.   Ada.Text_Io.Get(i); -- Ok
  8.   Ada_Text_Io.Get(e); -- Non !!
  9. end Truc;


 
Réponse : parceque Get n'est pas une primitive de Integer (puisque Integer est déclaré dans standard et get dans Ada.Text_Io => Integer est "figé" à la fin des déclarations de Standard).
 
Par contre tu peux écrire :

Code :
  1. procedure truc is
  2.   type Entier is new Integer;
  3.   i : Integer := 2;
  4.   e : Entier  := 0;
  5. begin
  6.   e := e**2 + 5;
  7.   -- tout comme :
  8.   i := 2 + 3*i;
  9. end Truc;


 
car "+", "*", "**", .... sont déclarées comme primitives de Integer dans standard et donc héritées par Entier.
 
Bon, maintenant autre chose :
 

Code :
  1. Package P1 is
  2. type T1 is private;
  3. -- puis des primitives pour ce type :
  4. procedure proc1 (var1 : in out T1);
  5. -- ....
  6. private
  7.   type T1 is .... ;
  8. end Truc;


 
En dérivant ce type en un type T2, tu peux évidemment utiliser les primitives de T1 appliquées à T2.
 
Mais toi tu dérives dans la partie privée :

Code :
  1. private
  2.     package PListeCar is new Plistgen (character, put);
  3.     use plistecar;
  4.     type tmot is new Plistecar.tptrcellule;
  5. end;


Tu ne peux pas utiliser (dans Pphrase) les primitives de Tptrcellule appliquées à Tmot car dans Pphrase tu ne sais pas que Tmot dérive de Tptrcellule.

Reply

Marsh Posté le 22-03-2006 à 23:03:31    

j'ai résolu le probleme en créant une autre fonction  
dernier_mot(in tmot) return boolean  
dans pmot pour tester si le . est présent

Reply

Sujets relatifs:

Leave a Replay

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