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

Algorithmes et structures de données Discussion :

[vocabulaire] passage par adresse et par valeur.


Sujet :

Algorithmes et structures de données

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [vocabulaire] passage par adresse et par valeur.
    bonjour ,
    j'ai un souci ! je débute et j'aimerais avoir la définition précise du passage par adresse et en paramétre ( le prof en a parler sans expliquer)
    merci:

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Le vocabulaire exact est passage de paramètre par adresse ou par valeur. Cela tiens au fonctionnement de la mémoire d'un ordinateur : il y a des adresses mémoires, chacune pouvant avoir un contenu mémoire. Ainsi, pour un paramètre entier A, on peut passer à une fonction f aussi bien l'adresse mémoire de A que le contenu de A (un entier donc. Disons 15 par exemple). Dans le premier cas, le paramètre A peut être modifié depuis l'intérieur de la fonction, alors que c'est impossible dans le second cas. Dans les deux cas, il est bien sûr possible d'accéder au contenu (15 dans notre exemple).
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Hephaistos007 Voir le message
    Dans le premier cas, le paramètre A peut être modifié depuis l'intérieur de la fonction, alors que c'est impossible dans le second cas.
    Je pense qu'il faut bien s'accorder sur le sens de cette affirmation : tu veux dire par là que le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Fonction Modifie(entier A) :
      A <- 10
      Renvoie A
    FinFonction
     
    entier N;
    N <- 5
    M <- Modifie(N)
    Affiche(N)
    Affiche(M)
    affichera "5 10" dans le cas d'un langage à appel par valeur alors qu'il affichera "10 10" dans le cas d'un langage à appel par référence.

    Une autre différence notable entre les deux modes d'appel est que dans le cas de l'appel par valeur, la valeur est copié entièrement sur la pile alors qu'avec l'appel par référence seule son adresse est copié sur la pile. Pour une valeur composée de grande taille comme un tableau, un gros objet ou structure, cela peut avoir de lourde conséquences sur les performances.

    --
    Jedaï

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 368
    Points : 23 620
    Points
    23 620
    Par défaut
    Citation Envoyé par debutantenalgo Voir le message
    bonjour ,
    j'ai un souci ! je débute et j'aimerais avoir la définition précise du passage par adresse et en paramétre ( le prof en a parler sans expliquer)
    merci:
    Pour faire simple, au lieu de transmettre l'objet entier (qui peut être très lourd), tu peux choisir à la place de passer en paramètre l'emplacement en mémoire de cet objet, pour que ta fonction aille directement le lire, voire travailler dessus.

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    114
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 114
    Points : 120
    Points
    120
    Par défaut
    Dans le premier cas, le paramètre A peut être modifié depuis l'intérieur de la fonction, alors que c'est impossible dans le second cas.
    Ces propos, bien que je sois certains que leur auteur, maitrise bien le concept, peuvent porter à confusion. il est possible de modifier un paramètre depuis l'intérieur de la fonction, même dans un passage par valeur. Cependant lors du passage par valeur, les variables à l'intérieur et à l'extérieur de la fonction sont dissocié (par le biais de la copie), aussi toute modification à l'intérieur de la fonction n'aura aucune répercussion en dehors de la fonction. En gros, la variable que l'on passe en paramètre par valeur ne change pas.

    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
     
    void main()
    {
    <div style="margin-left:40px">
    int a = 5;
    passageparvaleur(a);
    afficher(a); // 5
    passageparreference(a);
    afficher(a); // 10</div>}
     
    void passageparvaleur(int a)
    {
    <div style="margin-left:40px">a=a*2; //modification (possible) du parametre a, n'ayant aucune incidence sur la variable a de la fonction main</div>}
    void passageparreference(int &a)
    {
    <div style="margin-left:40px">a=a*2;//modification du parametre a, impliquant une modification de la variable a de la fonction main</div>}
    que dans le cas de l'appel par valeur, la valeur est copié entièrement sur la pile
    Je me permet de mettre en doute cette affirmation. Mes informations datent un peu, il se peut donc que je me trompe, mais que ce soit un appel par valeur ou par référence,je pense que seule l'adresse mémoire est copié sur la pile.

    La seule différence est que dans le cas d'un passage par valeur, une copie de l'objet est faite dans l'espace mémoire de l'application et que c'est l'adresse de cette copie qui est empilé alors que dans le cas d'un passage par réference, y'a pas de copie, c'est simplement l'adresse de l'objet qu'on emile.


    Cela ne change en rien tout ce qui a été dit d'autre.

    J'aimerais avoir la confirmation d'un spécialiste si possible.

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par lcfseth Voir le message
    Je me permet de mettre en doute cette affirmation. Mes informations datent un peu, il se peut donc que je me trompe, mais que ce soit un appel par valeur ou par référence,je pense que seule l'adresse mémoire est copié sur la pile.

    La seule différence est que dans le cas d'un passage par valeur, une copie de l'objet est faite dans l'espace mémoire de l'application et que c'est l'adresse de cette copie qui est empilé alors que dans le cas d'un passage par réference, y'a pas de copie, c'est simplement l'adresse de l'objet qu'on emile
    Cela dépend peut-être du langage, mais dans le cas de C++ (ou C) par exemple je me permets de douter de ta version : cela impliquerait que lors du retour de la fonction, C++ soit conscient de quelles parties de la pile sont des pointeurs et aille libérer l'espace vers lequel ils pointent... Or l'avantage de la pile c'est justement qu'il n'y a rien à faire pour libérer l'espace à la fin d'une fonction, il suffit de changer la valeur du registre de pile. En bref ton interprétation exigerait une forme de GC intégré dans C++, ce qui me paraît improbable.

    --
    Jedaï

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par lcfseth Voir le message
    La seule différence est que dans le cas d'un passage par valeur, une copie de l'objet est faite dans l'espace mémoire de l'application et que c'est l'adresse de cette copie qui est empilé alors que dans le cas d'un passage par réference, y'a pas de copie, c'est simplement l'adresse de l'objet qu'on emile.
    Non, pas en C/C++ en tout cas. L'objet est intégralement copié sur la pile, avec (de mémoire) un appel du constructeur par copie pour le C++ (en C, c'est un memcpy correspondant au sizeof qui est fait). Si ton objet fait 500 Mo, alors tu auras 500 Mo poussés sur la pile directement (=> stack overflow direct).
    Seul un passage par référence garantit que seule l'adresse de l'objet (copie ou pas, peu importe) sera poussé sur la pile. Autrement, tu as au minimum sizeof(objet) octets poussés sur la pile.

    Tu peux faire le test assez facilement à l'exécution, en affichant l'adresse de chaque paramètre de ta fonction, ainsi que le sizeof correspondant. Aux contraintes d'alignement près, tu verras que ça se suit parfaitement.

    C'est pareil pour tous les langages impératifs natifs que j'ai manipulé consciencieusement, en tout cas, inclus Delphi/Pascal, Ada, C et C++. C'est peut-être différent pour les langages interprétés (ex : Python, LUA, ...) ou semi-interprétés (Java, .NET), mais là on arrive dans le monde des GC et autres gestions automatiques de la mémoire.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

Discussions similaires

  1. passage de gros tableaux par adresse
    Par ol9245 dans le forum MATLAB
    Réponses: 7
    Dernier message: 10/10/2012, 11h51
  2. Passage de paramètres par adresse ou par copie ?
    Par EpiTouille dans le forum Langage
    Réponses: 6
    Dernier message: 24/12/2011, 10h31
  3. Passage par adresse ou par valeur ?
    Par Maverick27 dans le forum Débuter
    Réponses: 7
    Dernier message: 08/10/2008, 18h53
  4. Réponses: 12
    Dernier message: 26/01/2008, 20h23
  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