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

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

5 réponses

Meilleure réponse
Messages postés
218
Date d'inscription
mardi 15 juin 2004
Dernière intervention
26 février 2006
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Dernière intervention
31 mars 2015
0
Merci
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
Messages postés
14010
Date d'inscription
samedi 29 décembre 2001
Dernière intervention
28 août 2015
0
Merci
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)
Messages postés
3758
Date d'inscription
mardi 23 septembre 2003
Dernière intervention
13 mars 2006
0
Merci
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
Messages postés
441
Date d'inscription
mardi 21 octobre 2003
Dernière intervention
6 mai 2010
0
Merci
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.