Passage par adresse et par valeur

Passage par adresse et par valeur - Algo - Programmation

Marsh Posté le 29-12-2002 à 17:48:16    

salut all
 
j'ai cet algo bidon qui calcule le PGCD (plus gd commun diviseur) de 2 valeurs
 
voilà la fonction :
 
TQ A != B FAIRE
|  SI A > B ALORS
|  |  A := A-B
|  SINON
|  |  B := B-A
|  FSI
FTQ
 
on me demande de dire si les variables A et B sont passées par valeur ou par adresse...
 
ce qu'on peut dire c que à chaque passage dans le TQ un travaille sur les nouvelles valeurs de A et de B donc à priori je dirais qu'il faut les passer par adresse mais sur mon exo j'ai marqué par valeur
 
c par adresse ou par valeur alors ? :heink:


Message édité par schumacher le 29-12-2002 à 17:49:02

---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 17:48:16   

Reply

Marsh Posté le 29-12-2002 à 17:52:44    

:jap:


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 17:57:54    

Tu récupère le résultat comment ?
Si c'est dans A ou dans B alors oui, il faut les passer par adresses.

Reply

Marsh Posté le 29-12-2002 à 17:57:59    

personne? :cry:


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 18:01:13    

mrbebert a écrit :

Tu récupère le résultat comment ?
Si c'est dans A ou dans B alors oui, il faut les passer par adresses.


dans A !


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 18:02:03    

Dans ce cas, oui. Il faut que la fonction modifie A et pouvoir consulter sa nouvelle valeur après l'exécution. Donc passage par adresse.

Reply

Marsh Posté le 29-12-2002 à 18:02:27    

enfin à la fin je fais un :
 
nom_de_la_fonction := A


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 18:03:36    

ok donc 2 raisons pour le choix par adresse :
 
 

  • on récupère le résultat en sortie
  • à chaque passage la valeur est modifiée donc faut que ça soit pas adresse sinon ça irait pas


daccord pour les 2 points?
 
merci bcp


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 18:04:20    

schumacher a écrit :

enfin à la fin je fais un :
 
nom_de_la_fonction := A

Dans ce cas ce n'est plus utile. Un passage par valeur suffit puisque l'appelant n'a pas besoin de connaitre les nouvelles valeurs de A (il récupérera le résultat par le retour de la fonction).

Reply

Marsh Posté le 29-12-2002 à 18:06:24    

comment faire pour savoir alors?
 
il faut passer par adresse uniquement quand le résultat est utilisé en sortie ?


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 18:06:24   

Reply

Marsh Posté le 29-12-2002 à 18:25:19    

up


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 18:34:55    

schumacher a écrit :

ok donc 2 raisons pour le choix par adresse :
 
 

  • on récupère le résultat en sortie
  • à chaque passage la valeur est modifiée donc faut que ça soit pas adresse sinon ça irait pas


daccord pour les 2 points?
 
merci bcp

non
Ca dépend si tu veux que la fonction/procédure appelée puisse modifier directement la valeur de ta variable.
Si tu veux seulement qu'elle utilise la valeur mais sans la modifier, tu la passe par valeur. Si tu veux qu'elle modifie la variable, tu passes par adresse.
 
Par exemple, pour une fonction qui doublerait une variable :
1er cas :
A = 3
double(A)
echo "La nouvelle valeur de A est " . A // affiche 6
 
Dans ce cas, A doit être passée par adresse car tu veux que la fonction "double" modifie directement la valeur de A.
 
2ème cas :
A = 3
B = double(A)
echo "A vaut encore " . A // affiche 3 car A n'est pas modifiée
echo "B vaut " . B // affiche 6
 
Ici, tu ne veux pas que "double" puisse modifier A, tu la passes par valeur.
L'avantage, c'est que "double" ne peut pas modifier A, même si, en interne, rien ne l'empêche de faire quelque chose comme "A = A * 2". En passant par valeur, la fonction "double" travaille sur une copie de A, ce qui évite tout effet de bord.


Message édité par mrbebert le 29-12-2002 à 18:37:14
Reply

Marsh Posté le 29-12-2002 à 19:26:02    

c très clair
 
merci bcp t super sympa :jap:


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Marsh Posté le 29-12-2002 à 20:22:18    

Parfois, on passe par adresse une variable meme si on ne veut que la consulter sans la modifier pour gagner en perf. C'est le cas pour des variables volumineuses uniquement (pas des octets, hein !).
un passage par adresse => un pointeur
un passage par valeur  => on met sur la pile la valeur, meme si sa taile est enorme
 

Reply

Marsh Posté le 29-12-2002 à 20:54:51    

oui pour les tableaux par exemple  :)


---------------
L'impôt appauvrit l'ignorant et enrichit le connaisseur.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed