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 :

Transmission par valeur ou par adresse [FAQ]


Sujet :

Langage Pascal

  1. #1
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Transmission par valeur ou par adresse
    Bonjour,

    Je reprends le (Turbo) Pascal là où je l'avais laissé il y a 20 ans...

    Ceci petit code montre que var dans un paramètre permet le passage par référence. Est-ce bien exact ? Est-ce du code correct, pas de choses qui manquent (uses etc.).
    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
    26
    27
    28
    29
     
    program snippets;
     
    procedure f(s:string);
    begin
     s := "Hello";
    end;
     
    procedure g(var s:string);
    begin
     s := "Hello";
    end;
     
    procedure main;
    var
     s : string;
    begin
     s := '?';
     f(s);
     writeln(s);
     g(s);
     writeln(s);
    end;
     
    begin
     main;
     writeln('press a key ...');
     readln; 
    end.
    Merci de m'avoir lu.

    Emmanuel
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Non tout est bien, ca devrait compiler. Comme tu l'as vu, g() permet de modifier la variable s passée en paramètre grâce au paramètre var, alors que f() la laisse telle quelle. Concrètement, l'adresse de la variable s est passée dans la pile lors de l'appel à g(), alors que seule la valeur de s est passée à f.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Non tout est bien, ca devrait compiler. Comme tu l'as vu, g() permet de modifier la variable s passée en paramètre grâce au paramètre var, alors que f() la laisse telle quelle. Concrètement, l'adresse de la variable s est passée dans la pile lors de l'appel à g(), alors que seule la valeur de s est passée à f.
    OK. Ca veut donc dire que, contrairement au C, les tableaux sont réellement passés par valeur ? Donc pour un type string, si on ne met pas var, c'est 256 octets copiés systématiquement, c'est bien ça ?

    Est-ce que ça a un sens de mettre const var pour un paramètre (passage par référence en lecture seule) ?
    Pas de Wi-Fi à la maison : CPL

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    OK. Ca veut donc dire que, contrairement au C, les tableaux sont réellement passés par valeur ? Donc pour un type string, si on ne met pas var, c'est 256 octets copiés systématiquement, c'est bien ça ?
    A priori, je dirai oui, mais je ne suis pas du tout certain de la réponse en fait. Le problème est que pour les tableaux, on ne doit pas préciser de taille lorsqu'on en passe en paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure f(var t: array of integer)
    Quant à savoir ce qui est effectivement copié, il faut se pencher dans les entrailles des compilateurs. Il y a deux écoles pour le passage de paramètres modifiables : l'école Pascal avec l'utilisation de var, et l'école C (que tu connais bien) avec les pointeurs. Il est clair que les types complexes (record et object) il faut passer par les pointeurs, mon opinion est qu'il est intéressant d'étendre cette technique aux types plus simples mais pas atomiques comme les tableaux... A toi de choisir selon tes habitudes

    Citation Envoyé par Emmanuel Delahaye
    Est-ce que ça a un sens de mettre const var pour un paramètre (passage par référence en lecture seule) ?
    Sémantiquement ca n'a pas de sens, puisque var est utilisé principalement pour pouvoir modifier les valeurs des paramètres. Cette construction n'est d'ailleurs pas possible (ca ne compile pas normalement). Avec Delphi, on peut spécifier simplement const, mais je ne sais pas exactement ce que ca fait... Pas très utile à mon avis, mais c'est discutable !
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par wormful_sickfoot
    <...>
    OK. Merci beaucoup.
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Les chaînes de caractères sont toujours transmises par adresse. La procédure ou fonction en réalise une copie comme variable locale.
    Pour les tableaux et enregistrements, si leur taille ne dépasse pas 8 octets, ils sont transmis par valeur; sinon, ils sont transmis par adresse.

    Les modes de passage des paramètres sont abordés dans la nouvelle FAQ :
    http://pascal.developpez.com/faq/?pa...re-ou-fonction
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Alcatîz
    Les modes de passage des paramètres sont abordés dans la nouvelle FAQ :
    http://pascal.developpez.com/faq/?pa...re-ou-fonction
    Très bien, Merci.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par wormful_sickfoot
    Avec Delphi, on peut spécifier simplement const, mais je ne sais pas exactement ce que ca fait... Pas très utile à mon avis, mais c'est discutable !
    Je sais, je ressucite un fil déjà vieux, mais... un passage par valeur s'accompagne d'une copie des données de la variable au sommet de la pile, quand bien même cette variable serait volumineuse. L'utilisation du mot-clef const a deux usages complémentaires : éviter la copie des données sur la pile, ce qui accroît la performance de façon non négligeable, tout en interdisant du coup l'affectation de la variable transmise en paramètre.

    Pour reprendre le code précédent,

    Dans f, s est une variable locale créée au lancement de la fonction, et contenant une copie de la valeur qui a été transmise en paramètre (valeur, variable, ou expression). À la sortie de la fonction, si c'est une variable qui avait été transmise en paramètre, elle n'est pas plus modifiée que ne le serait une constante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure f(s:string);
    begin
     s := "Hello";
    end;
    Dans g, on ne peut transmettre qu'une variable du bon type pour s. La valeur de la variable transmise en paramètre est alors modifiée. Techniquement, c'est un pointeur qui est transmis, et sémantiquement, s représente la variable passée en paramètre, il n'y a pas de variable locale de créée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure g(var s:string);
    begin
     s := "Hello";
    end;
    Enfin, le code suivant déclenche une erreur à la compilation ! En effet, c'est un pointeur sur la variable ou sur l'expression évaluée qui est directement transmis -> accroissement de la performance, mais toute modification est interdite puisqu'il n'y a pas de variable locale de créée !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure g(const s:string);
    begin
     s := "Hello";
    end;
    Quand on sait qu'un paramètre n'est pas modifié localement par la fonction, il vaut toujours mieux spécifier const. C'est d'ailleurs ce que fait systématiquement la VCL.

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par CapJack
    Je sais, je ressucite un fil déjà vieux, mais... un passage par valeur s'accompagne d'une copie des données de la variable au sommet de la pile, quand bien même cette variable serait volumineuse. L'utilisation du mot-clef const a deux usages complémentaires : éviter la copie des données sur la pile, ce qui accroît la performance de façon non négligeable, tout en interdisant du coup l'affectation de la variable transmise en paramètre.
    <...>
    Quand on sait qu'un paramètre n'est pas modifié localement par la fonction, il vaut toujours mieux spécifier const. C'est d'ailleurs ce que fait systématiquement la VCL.
    OK, merci.
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Passage par valeur ou par adresse
    Par BlackMulet dans le forum Langage
    Réponses: 6
    Dernier message: 29/10/2009, 16h20
  2. Par référence ou par valeur ?
    Par Kropernic dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/06/2009, 09h20
  3. Réponses: 36
    Dernier message: 06/03/2009, 11h00
  4. Sous-totaux classé par valeur et par année
    Par Goutlett dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/07/2008, 17h21
  5. Passage par valeur / passage par adresse
    Par jeje99 dans le forum C++
    Réponses: 13
    Dernier message: 16/02/2006, 10h29

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