Différence entre byref et byval [Résolu]

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

5 réponses

zippro4012 218 Messages postés mardi 15 juin 2004Date d'inscription 26 février 2006 Dernière intervention - 18 févr. 2005 à 18:53
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 19 févr. 2005 à 01:00
0
Utile
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
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 19 févr. 2005 à 15:28
0
Utile
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)
cs_CanisLupus 3758 Messages postés mardi 23 septembre 2003Date d'inscription 13 mars 2006 Dernière intervention - 19 févr. 2005 à 17:21
0
Utile
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
ludovicanceaux 441 Messages postés mardi 21 octobre 2003Date d'inscription 6 mai 2010 Dernière intervention - 20 févr. 2005 à 17:05
0
Utile
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)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.