ByVal ?!

Signaler
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
24 janvier 2014
-
Gobillot
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
-
Slu



a quoi cela sert il de mettre byval ?

Herve

16 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
pour une procédure interne:

ByRef variable c'est l'adresse de variable, qui est donc directement modifiable parce qu'on connait son adresse

ByVal variable c'est l'adresse d'une copie temporaire de la variable qui elle ne sera plus modifiable

pour une procédure externe:

ByRef variable c'est l'adresse de variable, qui est donc directement modifiable parce qu'on connait son adresse

ByVal variable c'est le contenu qui se trouve à l'adresse pointée par variable (qui peut être aussi une adresse, qui elle sera modifiable)

cas particulier des chaînes:
- elles sont toujours clonées
- elles sont toujours modifiables
- ByRef est un pointeur sur la chaîne VarPtr()
- ByVal est l'adresse de la chaîne StrPtr()

Daniel
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
24 janvier 2014

Merci !

Quel est la difference pour les parametres d une fonction de mettre un ByVal ou de ne rien mettre ?



Gobillot > developpeur pro ?

Herve
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
ByRref c'est par défaut, quand on met rien c'est Byref (VB6)

pour une procédure interne, mettre ByVal c'est une sécurité, ainsi la procédure ne pourra jamais modifier ta variable.
(cas particulier: même avec ByRef, si tu mets une constante au lieu d'une variable, bien sûr celle ci ne sera jamais modifiée puisque c'est une copie temporaire)

pour une procédure externe, on n'a pas beaucoup le choix, il faut donner les paramètres demandés sinon plantage assuré, mais on peut parfois jouer avec les pointeurs et par exemple envoyer ByVal pointeur sur l'adresse au lieu d'envoyer l'adresse directe.

pour les chaînes c'est spécial parce que les API's demandent des chaînes en ASCII et non en Unicode (sauf quelques rares exeptions), c'est pourquoi VB est obligé de les convertir avant de les envoyer et il le fait dans les deux sens.

Ps: t'as réussi à faire marcher mon code.

Daniel
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
24 janvier 2014

oui j ai reussi ! encore merci.

alors developpeur pro ?

Herve
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
ex developpeur pro

appelé à l'époque "pisseur de lignes"

Daniel
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
24 janvier 2014

ca se voit tu as l air de tres bien connaitre VB !


Herve
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
Vb c'est tout récent , moins d'un an en fait.
"pisseur de lignes" c'était parce qu'il fallait saisir son code sur des feuilles spéciales et ensuite les donner à la saisie, et puis recevoir son bac de cartes.
t'as connu ça les cartes 80 colonnes ?
il fallait les trier, les passer à la compil pour enfin avoir son listing d'erreur.

que de changements depuis et quelles facilités maintenant, c'est un plaisir de programmer.

Daniel
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
24 janvier 2014

Moins d un an !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

moi ca fait plus longtemps et j ai l impression de moins en connaitre !



les cartes 80 colonnes ?!

je connais les imprimantes 80 colonnes.

Herve
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
tout ton programme était codé sur des cartes 80 colonnes, peut être ça rappellera des souvenirs à ceux qui ont connu la P80 ?
au lieu d'avoir ton écran devant toi, t'avais ton bac de 2000 cartes devant toi, ton crayon et ton listing.
quand on a l'habitude de programmer on se met plus facilement à un nouveau langage, le support change met la logique reste toujours la même, ensuite c'est une question de pratique pour connaître les particularités du langage.

Daniel
Messages postés
567
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
24 janvier 2014

c aussi ce que je pense ....programmer n est qu une question de logique sinon ce n est que la syntaxe qui change

Herve
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
65
Salut
Comme d'hab, 30 sec de recherche sur le site pour trouver la soluce sans réveiller tout le monde http://www.vbfrance.com/code.aspx?id=7081
Vous ètes féniant ou quoi ? je comprends pas

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4
Salut ;O)

Comme dit précédemment, VB6 passe ses paramètres par référence si l'on ne lui demande pas le contraire. Donc la procédure ne reçoit pas une copie de la variable en paramètre mais son adresse mémoire afin de la manipuler directement. On pourrait se demander pourquoi Microsoft a appliqué ce procédé, car comme tout bon programmeur le sait, le passage par valeur est le plus souvent utilisé.

Aussi, si l'on ne prend pas garde à cela, il se peut que le résultat retourné par une fonction et/ou procédure soit complétement biaisé à cause de ce passage par référence par défaut.
Il faudrait mettre un ByVal dans tout sous-programme ne demadnant pas un passage par référence. Ce serait plus logique et plus propre et cela éviterait, dans certaisn cas, des erreurs difficiles à trouver pour un débutant.

Faut-il aussi souligner qu'il ne faut pas être un pro de VB6 pour savoir ce qu'est un passage par référence et par valeur. C'est le fondement de tout appel de procédure en programmation. Tout informaticien (en devenir ou déjà diplômé) devrait connaître cela.

Guy
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
merci les gars.
puisque vous avez l'air d'en savoir plus, vous allez peut-être pouvoir m'expliquer comment est passée l'adresse d'un tableau de chaînes de longueur fixe avec et sans ByVal ?

Daniel
Messages postés
797
Date d'inscription
jeudi 17 mai 2001
Statut
Membre
Dernière intervention
5 mai 2009
4
Comme pour une variable ! Que veux-tu dire ?
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
certainement pas.

Daniel
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
23
un exemple:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Dim s(2) As String * 4
Dim P As Long
Dim Z As Long

s(0) = "ABCD"
s(1) = "EFGH"
s(2) = "1234"

'pourquoi c'est toujours la même adresse ?
MsgBox VarPtr(s(0))
MsgBox VarPtr(s(1))

'pourquoi c'est encore une autre adresse ?
CopyMemory P, s(0), 4
MsgBox "ByRef " & P

'encore la même bizarre ?
'comment passer le deuxième élément du tableau ?
CopyMemory P, s(1), 4
MsgBox "ByRef " & P

'et pourquoi la valeur n'est pas passée ?
CopyMemory Z, ByVal P, 4
MsgBox Hex$(Z)

Daniel