Fonctions et variables

Résolu/Fermé
Panoramix. Messages postés 2655 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 28 décembre 2016 - Modifié par Panoramix. le 31/10/2012 à 20:36
Panoramix. Messages postés 2655 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 28 décembre 2016 - 1 nov. 2012 à 10:15
Bonjour à tous !

J'ai une petite question concernant la portée des variables en Pascal. Prenons l'exemple suivant (je schématise, ne faite pas attention à la syntaxe) :

PROGRAM test; 
VAR 
   Nom : STRING 
FONCTION AjouteNom(); 
  BEGIN 
    WRITE('Votre nom svp :'); 
    READ(Nom); 
  END; 
BEGIN test 
   AjouteNom(); 
END.  

Mes questions :
-> Est-ce que ça peut fonctionner ? La fonction AjouteNom sera-t-elle capable de modifier la variable Nom ?
-> La fonction est-t-elle bien positionnée ?
-> Nom est une variable globale ou non ?

Merci d'avance pour réponses :)

6 réponses

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 31/10/2012 à 23:46
Oui absolument, le programme est juste et la variable "nom" est globale, c'est à dire qu'elle est allouée sur le "tas" dans la mémoire globale, à contrario de la variable locale, déclarée dans la fonction même, allouée sur la pile donc temporairement...

Le chêne aussi était un gland, avant d'être un chêne
2
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 1/11/2012 à 08:56
Oui, en fait on se sert des variables globales lorsque c'est utile, tout simplement! Disons que leur avantage tiens au fait d'être très accessibles, y compris dans d'autres unités si la déclaration le permet, et leur inconvénient principal c'est d'être nommé de manière fixe, donc il faut les déclarer une à une, elles consomme de la mémoire en permanence tout en servant temporairement dans ce cas précis...Et souvent elles font enfler le code par rapport aux locales car les déclarations locales sont plus courtes à l'emploi.
Et du fait que le nom soit figé, la fonction l'est aussi! Dans certain cas ça pousserait à écrire une autre fonction équivalente du fait qu'elle doive placer son résultat ailleurs!

Donc on ferait plutôt :
PROGRAM test;    
VAR    
   Nom : STRING    
FUNCTION AjouteNom: String;    
  BEGIN    
    WRITE('Votre nom svp :');    
    READ(Result);    
  END;    

BEGIN test    
   Nom:= AjouteNom;    
END.  

Et là encore on reste en globale pour stocker le nom, mais c'est qu'on est dans le corps de programme, là où on ne reste pas longtemps!
Dans un programme normalement construit, tout est fonction, et donnerais plutôt:
PROGRAM test;    

FUNCTION AjouteNom: String;    
  BEGIN    
    WRITE('Votre nom svp :');    
    READ(Result);    
  END;    

Procedure AjouteNoms;   
  var    
    Nom : String;    
  begin   
     Nom:= AjouteNom;   
     // exploitation locale du nom puis abandon de la variable   
  end;   

BEGIN test    
   AjouteNoms;    
END.  

Donc là on ne travaille plus qu'en variables locales...
En fait il faut utiliser les variables globales lorsque leur contenu est utile dans différents points du programme, servant donc à mettre des données en commun de manière pratique, et là encore il vaut mieux les regrouper en enregistrements pour éviter de noyer le programme sous tout un tas de noms globaux valides, car il y a un risque de confusion avec le noms des variables locales ensuite!
Le chêne aussi était un gland, avant d'être un chêne
1
Panoramix. Messages postés 2655 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 28 décembre 2016 1 096
1 nov. 2012 à 07:47
Merci pour ta réponse !

Mais est-ce que cette façon de codé est propre ? J'ai entendu dire que les fonctions devaient être le plus possible indépendant du programme de base. Est ce que cette façon de déclarer la fonction est plus juste :

FONCTION AjouteNom(IN NouveauNom:STRING); 
  BEGIN 
     Nom := NouveauNom;
  END; 
0
Panoramix. Messages postés 2655 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 28 décembre 2016 1 096
1 nov. 2012 à 09:37
Merci pour ta réponse.

J'aurais encore une petite question :)

Quelle est la différence entre une fonction et une procédure en LDA ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 1/11/2012 à 10:03
Hé bien la différence est toute simple, la fonction renvoie obligatoirement un résultat, donc une procédure est une fonction qui ne renvoie pas de résultat, voilà!
En entendant par renvoi de résultat une manière de le renvoyer, sous cette forme:
Resultat:= (appel de la fonction)
D'autres formes sont possible pour retourner un ou plusieurs résultats, tel que les paramètres "var" en pascal...
0
Panoramix. Messages postés 2655 Date d'inscription mardi 13 avril 2010 Statut Membre Dernière intervention 28 décembre 2016 1 096
1 nov. 2012 à 10:15
Ok merci beaucoup pour ton aide !

Bonne fin de semaine :)
0