fonction ( titre austère s'il en est )

fonction ( titre austère s'il en est ) - Ada - Programmation

Marsh Posté le 24-08-2006 à 01:05:49    

Alors voilà mon problème, ça doit être très simple pour un type qui comprend la programmation mais pas pour moi, j'ai une fonction ,déjà je sais à peine m'en servir, en fait pas du tout.
 Est ce que je peux l'appeler dans une procedure ?
 Si oui comment, car tout ce que je tente me refuse la syntaxe de mon appel de fonction ( je suppose donc que je ne peux pas appeler une fonction dans une procedure mais j'en sais rien en fait ), et le problème c'est que ma fonction dépend de types déclarés dans une procedure, de plus je serais bien incapable de faire " fonctionner une fonction " toute seule. (déjà que je ne vois pas la différence entre fonction et procedure )
 
C'est une fonction qui renvoie un booleen true /false, mais soit l'appel ne lui plait pas, soit il me dit qu'il a perdu mes paramètres .
Comment faire ?  
 
 
 
 
 
Même si c'est une question surement inintéressante pour des experts , j'ai vraiment besoin d'une réponse .
 
Voilà sans oublier la politesse : merci d'avance .

Reply

Marsh Posté le 24-08-2006 à 01:05:49   

Reply

Marsh Posté le 24-08-2006 à 15:33:11    

Montres un peu ton code, et on pourra t'éclairsir plus précisemment.
 
Sinon:
1) Oui on peut évidemment appeler une fonction dans une procédure
2) La différence entre une procédure et une fonction c'est qu'une fonction renvoie une valeur et la procédure non.
3) Si tu déclares un type dans un sous-programme (procédure ou fonction), ce type ne sera visible que dans ce sous programme.
Alors déclares ton type avant le sous-programme qui en a besoin.

Reply

Marsh Posté le 24-08-2006 à 18:55:27    

Et moi j'attendais tranquillement dans ma boite mail , quelle tache , donc voilà tout le truc , ce qu'il y a en plus du problème d'appel de fonction , c'est que j'aimerais avoir les mêmes paramètres dans la procedure et la fonction :
 
 
WITH ADA.Text_IO,Ada.Integer_Text_IO;
USE Ada.Text_IO,Ada.Integer_Text_IO;
 
 
Procedure TP_7_g_If is
   SUBTYPE T_Mois IS Natural RANGE 1..12 ;
   SUBTYPE T_Jour IS Natural RANGE 1..31 ;
   SUBTYPE T_Annee IS Natural RANGE 1..9999;
   TYPE T_Date is RECORD
      J: T_Jour ;
      M: T_Mois ;
      A: T_Annee ;
   END RECORD ;  
   FUNCTION Anterieure_Ou_Egale( D3,D4 :T_Date )  RETURN Boolean IS
   BEGIN  
      IF (D3.A < D4.A)
          THEN return True;
      ELSIF (D3.A = D4.A )      
            THEN IF (D3.M < D4.M )
               THEN return True ;
            ELSIF  (D3.M = D4.M )
               THEN IF (D3.J <= D4.J)
                    THEN return True ;
                    ELSE return False ;
                    END IF;
            ELSE return False;    
            END IF;
      ELSE return False ;
      END IF ;        
  END Anterieure_Ou_Egale;
BEGIN
    LOOP
   Put("donnez le jour puis le mois puis l'annee , séparez par un espace , appuyez sur entrée en fin de saisi " );
   New_Line ;
      Get(D3.J);Get(D3.M);Get(D3.A);Skip_Line;
   Put("donnez le jour puis le mois puis l'annee , séparez par un espace , appuyez sur entrée en fin de saisi " );
   New_Line ;
      Get(D4.J);Get(D4.M);Get(D4.A);Skip_Line;
  -- C'est là que j'aimerais appeler ma fonction :
      Anterieure_Ou_Egale ; -- C'est là ( en partie ) que ça foire même si je met ( D3,D4)
   END LOOP;
   End;      
 
 
PS : Pourtant c'est pas dur de renvoyer une valeur avec une procedure je comprend pas pourquoi on écrit toujours ça .


Message édité par klinfran le 24-08-2006 à 21:05:16
Reply

Marsh Posté le 26-08-2006 à 18:45:34    

Premièrement, comme ton compilateur doit te signaler, D3 et D4 n'existent pas pour la procedure TP_7_g_If, comme je te l'ai dit dans mon précédent post.
 
Deuxièmement, Anterieure_Ou_Egale est une fonction qui a 2 paramètres de type natural.
Pourquoi écris-tu Anterieure_Ou_Egale sans paramètre ???
 
Tu dois (comme tu l'as indiqué en commentaire) rajouter les paramètres, et là, tu as une erreur de compilation qui te dis "tp_7_g_if.adb:59:07: expect procedure name in procedure call", car tu n'utilises pas la valeur renvoyée par ta fonction.
Le compilateur concidère cela comme un appel de procédure d'où le message...
 
En C, tu aurais pu compiler ce programme (un bien mauvais programme) et quel aurait été le résultat de ton programme? RIEN
 
Du devrais faire un truc du style

Code :
  1. if Anterieure_Ou_Egale(date1,date2) then
  2.  Ada.text_io.put("bla bla bla" );
  3. end if;


 
ps: utilise les balises de code pour écrire du code


Message édité par apprentitux le 26-08-2006 à 18:53:00
Reply

Marsh Posté le 27-08-2006 à 03:43:11    

J'ai corrigé les erreurs , ça m'a permis de comprendre (un peu) comment ça fonctionne :

Code :
  1. WITH ADA.Text_IO,Ada.Integer_Text_IO;
  2. USE Ada.Text_IO,Ada.Integer_Text_IO;
  3. Procedure TP_7_g_If is
  4.    SUBTYPE T_Mois IS Natural RANGE 1..12 ;
  5.    SUBTYPE T_Jour IS Natural RANGE 1..31 ;
  6.    SUBTYPE T_Annee IS Natural RANGE 1..9999;
  7.    TYPE T_Date is RECORD
  8.       J: T_Jour ;
  9.       M: T_Mois ;
  10.       A: T_Annee ;
  11.    END RECORD ;
  12.    FUNCTION Anterieure_Ou_Egale( DA,DB :T_Date )  RETURN Boolean IS
  13.    BEGIN
  14.       IF (DA.A < DB.A)
  15.           THEN return True;
  16.       ELSIF (DA.A = DB.A )     
  17.             THEN IF (DA.M < DB.M )
  18.                THEN return True ;
  19.             ELSIF  (DA.M = DB.M )
  20.                THEN IF (DA.J <= DB.J)
  21.                     THEN return True ;
  22.                     ELSE return False ;
  23.                     END IF;
  24.             ELSE return False; 
  25.             END IF;
  26.       ELSE return False ;
  27.       END IF ;       
  28.    END Anterieure_Ou_Egale;
  29.    D1,D2:T_Date;
  30.    B:Boolean ;
  31.  
  32. BEGIN
  33.     LOOP
  34.    Put("donnez le jour puis le mois puis l'annee , séparez par un espace , appuyez sur entrée en fin de saisi " );
  35.    New_Line ;
  36.       Get(D1.J);Get(D1.M);Get(D1.A);Skip_Line;
  37.    Put("donnez le jour puis le mois puis l'annee , séparez par un espace , appuyez sur entrée en fin de saisi " );
  38.    New_Line ;
  39.       Get(D2.J);Get(D2.M);Get(D2.A);Skip_Line;
  40.       B:=Anterieure_Ou_Egale(D1,D2) ;
  41.    END LOOP;
  42.    End;


 
Voilà, Maintenant je sais qu'une fonction ça s'appelle et que ça ne se pose pas bêtement comme une procedure .Pour ce qui est de la qualité du programme , je n'ai peut-être pas fait au plus simple mais je ne vois pas comment faire mieux sachant qu'on doit comparer d'abord les années , puis les mois si années égales, puis les jours si années égales et mois égaux, et puis les mots il faut bien les écrire, mais c'est vrai j'ai parfois l'impression de faire trop long .
 
Merci quand même !!!


Message édité par klinfran le 27-08-2006 à 03:48:15
Reply

Sujets relatifs:

Leave a Replay

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