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

Langage Pascal Discussion :

Variable locale ou pas ?


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut Variable locale ou pas ?
    Bonsoir , j'ai réalisé un petite programme qui m'affiche le résultat d'une division avec son reste , en colonne , par divisions successives , le voici :

    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
    program division;
     
    function div_ise(a: INTEGER; m: INTEGER): INTEGER;
     
    begin
     
    while(a <> 0) do
    begin
       a := a div 10;
       m := a mod 10;
       writeln(a,' ',m);
    end;
    end;
     
    var
     
       x:INTEGER;
       y:INTEGER;
     
    BEGIN
     
    readln(x);
    writeln(div_ise(x,y));
     
    end.
    Mes questions sont ici : est ce que les variables a et m j'aurais dû les déclarer en local ou les mettre en paramètres c'est aussi bien ?

    Et j'ai appris qu'une fonction devait retourner une valeur mais j'ai l'impression que la mienne renvoit rien , j'aurais pas oublié une ligne car à chaque fois que j'écris une fonction ya une petite erreur de compil ( qui au passage m'empeche pas de compiler ) , mais c'est pas très propre :

    divise.pas(3,10) Warning: Function result does not seem to be set

  2. #2
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour Maxence,
    Comme je te l’ai déjà dit dans un autre post, une fonction retourne forcément une valeur.
    D’ailleurs c’est la raison du " Warning" que te renvois le compilo.
    Pour faire simple il faut qu’avant décrire le corps de ton program t’écrives :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Function truc(par1,…,par : TYPE) : TYPESORTIE ;
    var res : TYPESORTIE ;
    begin
    …. // Ta fonction affecte une valeur à res (si c’est une fonction simple, tu ne déclares pas res)
    truc := res ;  // Ligne Obligatoire.
    end ;
    D’autre part, ta fonction div_ise manipule les variables a et m, et leur affecte une valeur,
    Je t’ais déjà dis dans un autre poste que tu ne peux pas faire ça car normalement a et m son des constante.
    Écris par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function (const a,m : INTEGER) : INTEGER ;
    Tu va voir le compilateur n’acceptera plus ton code.
    Vu que t’es débutante, je te propose d’adopter cette syntaxe pour éviter que le compilateur n’accepte de compiler n’importe quoi.

    Il y a d’autre anomalie à constater, mais fais déjà ce que je te demande la, et tien nous au courant.
    Salut, et courage.

  3. #3
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonsoir,
    J’ai oublié de dire une chose, Les paramètres d’une fonction sont par défaut des variable locales, alors ta question "locales ou pas ?", n’a pas lieu d’être.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    Je comprends pas a et m ne peuvent pas etre des constantes vu qu'ils varient à chaque tour de boucle .
    tu dis que si je mets const çà va plus compilé ? alors tt ce que j'ai fait çà sert à rien ...
    Pour mon exemple , j'arrive pas à voir quelle ligne je dois écrire pour que la fonction retourne une valeur , est ce que çà çà irait :

    div_ise := a,m;

  5. #5
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonsoir,
    Ok je vois tu ne sais pas comment faire pour retourner deux valeur en même temps.
    Il suffit d’utiliser une procédure.

    Remarque: une fonction ne peut agir que sur les variables que tu lui as mis en paramètre,
    une procédure peut agir sur toutes les variables globales.


    Remplaces ta fonction div_ise par ma procédure, ne change rien d’autre
    Tien nous au courant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure div_ise(var quo,res : INTEGER);
    Begin
      if (quo <> 0) then  // if et non while, avec while t'auras une boucle infini si a <> 0
      begin
         quo := quo div 10;
         res := quo mod 10;
         writeln(quo,' ',res);  // Une procedure à le droit d'afficher qqch, mais une fonction n'en a pas le droit.
      end;
    End;

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par Ultima
    Remarque: une fonction ne peut agir que sur les variables que tu lui as mis en paramètre,
    une procédure peut agir sur toutes les variables globales.
    Ça vient de sortir ?

    Une fonction, tout comme une procedure, a accès aux variables globales.

    Citation Envoyé par wormful_sickfoot
    Comme ce sont déjà des valeurs, tu ne peux pas leur affecter de valeur... Donc, tu dois passer par des variables locales à ta fonction pour pouvoir faire des calculs...
    On peut parfaitement utiliser les paramètres comme des variables globales.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function hello(a : integer) : integer;
    var
      i,n : integer;
    begin
      n = 1;
      while (a > 0) do
      begin
        n = n + a;
        a := a -1;
      end;
      hello := n 
    end;
    compile et fonctionne parfaitement.

    Comme on a passé a par valeur, c'est une copie locale qui est utilisée, et on ne touche pas à la variable ayant servi à appeler la fonction.

  7. #7
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Ouh la la... Bon va falloir commencer à faire des efforts !

    a et m sont les paramètres de la fonction. a et m sont des données locales à la fonction. La fonction connait a et m parce que le programme a donné les valeurs de a et m à la fonction. Donc a et m font référence à des valeurs qui sont connues dans le programme principal. a et m sont juste des valeurs, ce ne sont pas des variables, elles ne peuvent donc pas varier.

    Comme ce sont déjà des valeurs, tu ne peux pas leur affecter de valeur... Donc, tu dois passer par des variables locales à ta fonction pour pouvoir faire des calculs...

    Ensuite ta fonction ne renvoie rien, le mieux serait qu'elle renvoie la valeur de la division. Ceci est fait avec la ligne div_ise := res; . On écrit le nom de la fonction suivi de l'affectation suivi de la valeur à renvoyer.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    450
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 450
    Par défaut
    ultima mais moi je tiens absolument à utiliser une fonction et non une procédure .
    Wormful , oui je comprends qu'il faille acquérir de la rigueur tôt mais jusqu'à preuve du contraire mon programme marche quand même .

    Donc a et m font référence à des valeurs qui sont connues dans le programme principal. a et m sont juste des valeurs, ce ne sont pas des variables, elles ne peuvent donc pas varier.
    OH la la j'ai lu vos tutoriaux et sans vouloir les critiquer rien de tout çà n'est expliqué , ni sur votre site ni sur aucun site d'ailleurs , donc sois pas si dur quand tu me corriges .
    Je suis pas d'accord a et m varient puisque à chaque tour de boucle dans mon programme leur valeur change , si c'est pas une variable je suis folle .

    Ensuite oui ma fonction ne renvoit rien mais pour mon programme je dois vraiment écrire div_ise := res; ?
    J'ai déclaré res nullepart .

  9. #9
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonsoir,
    J’ai fait une petite gaffe dans mon code (peut-être une grosse) ;
    En tout cas pour m’excuser voici une version fonctionnelle de ton programme.
    N’hésites pas à émettre des questions, ou commentaires.

    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
    program maxFCT;
     
    procedure div_ise_et_affiche(var quo : INTEGER;out res : INTEGER); // quo a une valeur dès le départ; on va donner une valeur à res
    Begin
      if (quo <> 0) then  // if et non while, avec while t'auras une boucle infini si a <> 0
      begin
         quo := quo div 10;
         res := quo mod 10;
         writeln(quo,' ',res);  // Une procedure à le droit d'afficher qqch, mais une fonction n'en a pas le droit.
      end;
    End;
     
    var
       x,y : INTEGER;
     
    BEGIN
     
    readln(x);
    div_ise_et_affiche(x, y) // x a déja une valeur, on va donner une valeur a y
                  // dans la procedure div_ise, x correspond à quo, et y à res
                  // Remarque la procedure div_ise_et_affiche affiche aussi le résultat
    end.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 02/07/2012, 17h30
  2. Réponses: 0
    Dernier message: 02/09/2008, 12h14
  3. Réponses: 3
    Dernier message: 15/06/2006, 16h43
  4. [JSTL] Mes variables ne sont pas remplacées par leur valeur
    Par thomine dans le forum Taglibs
    Réponses: 9
    Dernier message: 18/03/2005, 10h00
  5. variables locales ou globales ???
    Par elvivo dans le forum C
    Réponses: 13
    Dernier message: 03/07/2002, 08h22

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