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 :

Paramètres de fonction


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 Paramètres de fonction
    Bonjour , j'ai un petit soucis , j'ai écrit un programme qui quand je tape une valeur au clavier me retourne son image par une fonction , , par exemple si je tape 1 , mon programme me retourner 2*1 - 3 , soit -1 , mais il compile pas , regardez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    program mafonction;
     
    function toto(const x: INTEGER; const y: INTEGER):INTEGER;
    begin
    y = 2*x - 3;
    writeln(y);
    end;
     
    begin
     
    readln(x);
    toto(y);
     
    end.
    le message d'erreur est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ fpc fonction.pas
    Free Pascal Compiler version 2.0.4 [2006/08/20] for i386
    Copyright (c) 1993-2006 by Florian Klaempfl
    Target OS: Linux for i386
    Compiling fonction.pas
    fonction.pas(5,12) Error: Illegal expression
    fonction.pas(11,8) Error: Identifier not found "x"
    fonction.pas(11,10) Error: Illegal expression
    fonction.pas(12,10) Error: Identifier not found "y"
    fonction.pas(15) Fatal: There were 4 errors compiling module, stopping
    fonction.pas(15) Fatal: Compilation aborted
    etrange tout ceci non ?

    merci

  2. #2
    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
    Non pas étrange, car il n'est pas correct de passer des paramètres avec const devant. La seule modification possible est var pour les paramètres d'une fonction. Voici la différence entre les deux : sans modificateut, par exemple procedure x(y: integer);, le paramètre y est passé par valeur, ca veut dire que la valeur du paramètre est copié dans la pile, ce qui a pour conséquence que la valeur y n'est pas modifiée. Avec var, procedure X(var y: integer);, alors la valeur de y est passé par adresse, donc y peut être modifié.

    En résumé, sans var, le paramètre y est une constante, et avec var, il est une varaible qu'on peut modifier (grosso modo).

    Dans ton cas, ton code sera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure toto(x: INTEGER; var y: INTEGER);
    begin
      y = 2 * x - 3;
    end;
     
    var y: Integer;
    begin
      toto(25, y);
      writeln('Resultat : ', y);
      readln;
    end.
    Et pense à indenter ton code aussi

  3. #3
    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
    là worm je crois que ya un petit soucis car ton programme ne fait pas ce que je veux , je m'explique :

    1.déjà toi tu prends une précodure , moi je veux une fonction , pour m'entrainer aux fonctions , alors quand je déclare ma fonction c'est çà ( avec ta correction ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure toto(x: INTEGER; var y: INTEGER);
    begin
      y = 2 * x - 3;
    writeln(y);
    end
    j'ai bien changé le var comme tu m'as dit mais j'ai rajouté writeln(y) car je veux que cette fonction m'affiche le résultat .

    Ensuite pour le corps du programme , je veux juste qu'une variable soit lue au clavier , donc c'est :

    begin
    readln(x); , çà c'est indiscutable je pense .

    et ensuite j'exécute ma fonction qui calcule y en fonction de x , donc j'écris simplement

    toto(y);

    toi ce que tu as fait c'est très différent , d'ailleurs je ne comprends pas la logique de ton code .

  4. #4
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Euh... je crois que tu ferais bien d'essayer de comprendre ce qu'ont bien voulu t'expliquer les autres avant de critiquer leur code...

    Ici wormful_sickfoot te montrait l'intérêt de déclarer un attribut avec ou sans "var". Le fait qu'il ne lise pas la variable 'x' avec un readln ne change pas grand chose au problème !

    Et de là à dire que c'est complètement différent de ce que tu voulais faire y'a un monde !

    Qui plus est, les procedures et les fonctions sont presque équivalente. Le seul intérêt d'une fonction est que tu dois retourner une valeur (déclarée par :type). Et l'intérêt de retourner une valeur est de la réutiliser par la suite. Or dans ton code de départ, non seulement tu ne retournes pas de valeur, mais en plus tu ne t'en sers pas (normal remarque) dans ton code principal. Donc en gros tu faisais une procédure.

    Exemple de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function f(x : integer) : integer;
    begin
      f := x+1;
    end;
     
    var n : integer
    begin
      readln(n);
      writeln(f(n));
    end.
    Exemple de procedure :
    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
    procedure f1(var x : integer);
    begin
      x := x+1;
    end;
     
    procedure f2(x : integer);
    begin
      writeln(x+1);
    end;
     
    var n : integer
    begin
      readln(n);
     
      f1(n);
      writeln(n);
     
      f2(n);
    end.

  5. #5
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    1ere erreur: tu veux lire x alors que tu n'as pas déclaré de variable x dans ton programme principal.

    2e erreur: tu passes y en paramètre de ta fonction alors que tu n'as pas non plus déclaré et initialisé de variable y.

    3e erreur: tu passes 1 paramètre à une fonction qui en attend 2.

    4e erreur: tu tentes de modifier y dans la fonction alors que tu l'a déclaré constante en paramètre.

    5e erreur: tu passes x en paramètre alors que tu ne l'utilises pas dans la fonction

    6e "erreur": tu ecris une fonction parce que tu veux t'entrainer, ok. Mais une fonction a pour but de renvoyer un resultat, pas d'afficher quelque chose.
    Donc si tu veux absolument utiliser une fonction, fait la calculer le resultat, et affiche le resultat dans ton programme principal.

    ca fait beaucoup non?
    Comme quelqu'un te l'avait deja dit, il serait temps de lire un cours, ou de bien relire le tien avant de tenter des programmes plus difficile.

    A part ca, ta function devrait plutot ressembler a ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function toto (const x: integer): integer;
    begin
       result := 2*x-3;
    end;
    et dans le prog principal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    readln(x);
    writeln(toto(x));

  6. #6
    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
    Euh... je crois que tu ferais bien d'essayer de comprendre ce qu'ont bien voulu t'expliquer les autres avant de critiquer leur code...
    Je critiquais pas .
    Comme quelqu'un te l'avait deja dit, il serait temps de lire un cours, ou de bien relire le tien avant de tenter des programmes plus difficile.
    Pas évident d'avoir un bon cours en pascal...

    DOnc voici le code complet du programme :

    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
    function toto (const x: INTEGER):INTEGER;
    begin
    result := 2*x - 3;
    end; 
     
    var
       result : INTEGER;
       x : INTEGER;
     
    begin
     
    readln(x);
       writeln(toto(x));
     
    end.
    mais il ne compile pas , j'ai :

    Compiling fonction.pas
    fonction.pas(5,1) Error: Identifier not found "result"
    fonction.pas(18) Fatal: There were 1 errors compiling module, stopping
    fonction.pas(18) Fatal: Compilation aborted

  7. #7
    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
    jai tout rechangé krachik comme t'avais dit et celà marche :

    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
    program mafonction;
     
    function toto (const x: INTEGER):INTEGER;
    begin
    toto := 2*x - 3;
    end; 
     
    var
     
       x,y: INTEGER;
     
    begin
     
    readln(x);
       y := toto(x);
       writeln(y);
     
    end.

  8. #8
    Membre chevronné Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Par défaut
    Je ne vois pas ce qui vous pose probleme dans le fait de mettre const en parametre, je le met toujours quand je veux etre sur de ne pas modifier la valeur d'un parametre par erreur. Maintenant peut-etre que ca n'existe qu'en Delphi?

    Pour ton erreur de compilation deja il ne faut pas declarer de variable result, c'est une variable fournie automatiquement ( mais peut-etre seulement en delphi, je n'ai jamais programmer en pascal dans un autre environnement).
    Si result n'existe pas dans ton environnement utilise le nom de la fonction a la place.

    EDIT: voici ce que dit l'aide delphi a propos des parametres constants (désolé si ca n'est valable que pour delphi):
    A constant (const) parameter is like a local constant or read-only variable. Constant parameters are similar to value parameters, except that you can’t assign a value to a constant parameter within the body of a procedure or function, nor can you pass one as a var parameter to another routine. (But when you pass an object reference as a constant parameter, you can still modify the object’s properties.)
    Using const allows the compiler to optimize code for structured- and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.

  9. #9
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Citation Envoyé par Mushroom7
    A part ca, ta function devrait plutot ressembler a ça:


    Code :
    function toto (const x: integer): integer;
    begin
    result := 2*x-3;
    end;
    Non c'est justement ce qu'on refuse
    petite correction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function toto(x:integer):integer;
    begin
        toto:=2*x-3;
    end;
    apres dans ton programe principal,
    apres avoir declarer par exemple une variable comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var x,y:integer;
     
    ....
    ......
        readln(x);
        y:=toto(x);
    je crois qu'on t'a deja fait les remarques qu'il faut donc a toi d'en tenir compte

Discussions similaires

  1. Réponses: 10
    Dernier message: 04/01/2006, 16h57
  2. liste énumérée de const. perso comme paramètre de fonction
    Par batou22003 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 13/12/2005, 20h37
  3. Paramètres de fonction : pointeurs ou valeurs ?
    Par Xandar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/11/2005, 16h50
  4. Retrouver les valeurs des paramètres des fonctions d'une DLL
    Par Bernard Martineau dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 10h42
  5. Paramètre de fonction
    Par Reynald dans le forum Débuter
    Réponses: 6
    Dernier message: 05/01/2005, 21h48

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