Différence entre byref et byval

Résolu
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010 - 18 févr. 2005 à 18:48
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010 - 20 févr. 2005 à 17:05
Salut à tous,
bah voilà tou est ds le titre...............
Merci d'avance

5 réponses

zippro4012 Messages postés 216 Date d'inscription mardi 15 juin 2004 Statut Membre Dernière intervention 26 février 2006 1
18 févr. 2005 à 18:53
C'est simple :


- Avec ByVal, les valeurs seule des variables seronts passées en
paramètres : si la procédure appelée change ces valeur, elles n'auront
pas changé dans la procédure appelante.


- Avec ByRef, les références des variables sont passées en
paramètres : si la procédure appelée change la valeur de ces variables,
elle auronts changé au retour dans la procédure appelante.
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
19 févr. 2005 à 01:00
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Sub Command1_Click()
Dim x As Long
Dim s As String
x = 123
s = "chaine"
MsgBox "Adresse de x: " & VarPtr(x)
MsgBox "Adresse de s: " & VarPtr(s)
Test x, x, s, s
MsgBox "la valeur de x est modifié: " & x
End Sub


Private Sub Test(x1 As Long, ByVal x2 As Long, s1 As String, ByVal s2 As String)
Dim Z As Long
Dim Z1 As Long
Dim Z2 As Long
Dim Z3 As Long
Dim P As Long


' même adresse que x
MsgBox "Adresse de x1: " & VarPtr(x1)
' adresse différente de x
MsgBox "Adresse de x2: " & VarPtr(x2)
' même adresse que s
MsgBox "Adresse de s1: " & VarPtr(s1)
' adresse différente de s
MsgBox "Adresse de s2: " & VarPtr(s2)

' quand les adresses sont les mêmes ça veut dire que c'est la même variable
' x1 et x sont la même variable avec des noms différents
' quand les adresses sont diffentes ça veut dire que les zones sont différentes
' x2 et x sont 2 variables différentes avec la même valeur

' pour un API c'est différent BYval renvoie un pointeur sur la variable
x2 = VarPtr(x1)
CopyMemory Z, ByVal x2, 4
MsgBox "on retrouve la valeur de x: " & Z
' explications:
' x2 et x1 sont 2 variables différentes
' dans x2 on met l'adresse de x1 donc l'adresse de x puisque c'est la même variable
' ByVal x2 renvoie la valeur qui se trouve à l'adresse contenue dans x2
' l'adresse contenue dans x2 c'est bien celle de x
' donc dans Z on retrouve x

' on peut même modifier x en passant par ByVal x2
' voir le dernier MsgBox
Z = 456
CopyMemory ByVal x2, Z, 4

' en VB l'adresse d'une chaîne est un pointeur sur la chaîne en Unicode
P = VarPtr(s1)
CopyMemory Z, P, 4
MsgBox "toujours Adresse de s1: " & Z
P = Z
CopyMemory Z, ByVal P, 4
MsgBox "pointeur sur s1: " & Z & " = " & StrPtr(s1)
P = Z
CopyMemory Z1, ByVal P, 4
P = P + 4
CopyMemory Z2, ByVal P, 4
P = P + 4
CopyMemory Z3, ByVal P, 4
' REMARQUE: le contenu des zones numériques est inversée
' 680063 - 690061 - 65006E --> hc - ia - en

MsgBox "contenu de s1 : " & Hex$(Z1) & " - " & Hex$(Z2) & " - " & Hex$(Z3) '65006E e-n

' API: une chaîne passée avec ByRef est un pointeur sur une chaîne clonée en non Unicode
CopyMemory Z, s1, 4
' ATTENTION: pas de manipulation de chaîne sous peine de perdre la chaîne clonée
' MsgBox "pseudo pointeur sur s1= " & (Z)

' Longueur de la chaîne sur 4 caractères (= 6)
P = Z - 4
CopyMemory Z1, ByVal P, 4
' ensuite contenu de la chaîne
P = Z
CopyMemory Z2, ByVal P, 4
P = Z + 4
CopyMemory Z3, ByVal P, 4
' 6 - 69616863 - 656E --> iahc - en
MsgBox "contenu du clone de s1: " & Hex$(Z1) & " - " & Hex$(Z2) & " - " & Hex$(Z3)

' API: une chaîne passée avec ByVal est directement l'adresse de la chaîne clonée
P = Z
CopyMemory Z, ByVal s1, 4
MsgBox "contenu du clone de s1: " & Hex$(Z) '69616863

' comment l'API peut elle modifier une chaîne alors qu'elle travaille sur un clone ?
' il semblerait que VB intervient et remodifie la chaîne d'origine

End Sub

Daniel
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
19 févr. 2005 à 15:28
Salut
Si tu avais tapé ces mots dans la recherche, tu serais tombé sur cette source spécialement déposée pour y répondre, alors un peu de courage, fait des recherches avant de poser ce genre de questions : http://www.vbfrance.com/code.aspx?id=7081

Vala
Jack
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)
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
19 févr. 2005 à 17:21
A savoir, question différences entre vb6 et vb.net :
en vb6, par défaut les parametres sont passés ByRef
en vb.net, par défaut les parametres sont passés ByVal

Dans tous les cas, il faut mieux préciser le mode de transmission des valeurs pour éviter les surprises.

Loup Gris
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ludovicanceaux Messages postés 440 Date d'inscription mardi 21 octobre 2003 Statut Membre Dernière intervention 6 mai 2010
20 févr. 2005 à 17:05
Car en fait moi je demande ca car en fait j'orai voulu appelé un procédure ki se trouve sur un module ke j'ai fai, et importer dc ds cette procédure la structure k'il y a sur ma form de ce style:


Structure Fiche

Dim DateCréation
As
String
Dim Nom
As
String
Dim NomOriginale
As
String
Dim Acteurs
As
String
Dim Réalisateur
As
String
Dim Année
As
String
Dim Durée
As
String
Dim Genre
As
String
Dim Nationalité
As
String
Dim Pour
As
String
Dim Photo
As
String
Dim Avis
As
String
Dim Histoire
As
String
Dim Disponible
As
String
Dim NbCDS
As
String
Dim Numéro
As
String
Dim Support
As
String
End
Structure
Dim Structure_Fiche
As Fiche
et en fait le module doit me rapporter les différentes valeurs k'il trouve, ds ma structure de ma form,
Dc ds ma form je met:
Module_Allociné.Aspi_GaleriePhoto(
Structure_Fiche,
Me.TextBox_Adresse.Text)

et ds mon module je dois mettre si je compren bien:
Public
Sub Aspi_GaleriePhoto(
ByRef MyStructure
As Gestion_dune_vidéothéque.Form_Insérer1sur3.Fiche,
ByVal Adresse
As
String)
et non:
Public
Sub Aspi_GaleriePhoto(
ByVal MyStructure
As Gestion_dune_vidéothéque.Form_Insérer1sur3.Fiche,
ByVal Adresse
As
String)
0
Rejoignez-nous