OVH Cloud OVH Cloud

ByRef... question très bête

18 réponses
Avatar
NTH
Bonsoir
J'ai une question très bête mais je ne comprends pas pourquoi... pourtant je
ne suis pas débutant en vb...
Voici :

Sub Test(ByRef x As String)
x = "XXX"
End Sub

Private Sub Form_Load()
Dim x As String
x = "ABC"
Test(x)
MsgBox (x)
Ens Sub

Ca m'écrit "ABC" pourtant je croyais que ça devait écrire XXX ?
Bizarre non? mon système est corrompu ou quoi?

Merci

8 réponses

1 2
Avatar
christophe-pasde
Bon ça arrive de dire des conneries de temps en temps et à tout le monde.

Je ne pense pas méconnaître gravement VB ( ni quelques autres langages,
le et tout les autres me parait présomptueux), mais être étourdi et un
peu fatigué.

Christophe.



Jean-Marc a écrit :

"christophe-pasde<> @wanadoo.fr>" <"christophe-pasde<> a écrit dans le
message de news:4165914d$0$16592$

bonjour,

ta variable X est déclarée uniquement dans form_load

en entête de ta form ecrit
option explicit et tu verras de suite l'erreur à la compilation,
dans la sub test il va te dire variable inconnue.




Hello,

Tu te trompes. Tu méconnais gravement VB (et tous les autres
lanages de programmation) pour écrire cela.

La variable X n'est pas du tout inconnue dans SUb Test, c'est
son paramètre.

Le fait que par hasard le nom du paramètre soit x, comme dans
la Sub form_load n'a rien à voir ici.

Voir de toute urgence:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vastmSub.asp



Avatar
christophe-pasde
Les () ça peut s'utiliser

Christophe

ci dessous l'extrait de la MSDN
<<
Si vous spécifiez un type de données pour un argument passé par
référence, vous devez passer une valeur de ce type à l'argument. Vous
pouvez contourner cette exigence en passant une expression, plutôt qu'un
type de données, comme argument. Visual Basic évalue une expression et
la passe dans le type requis, pour autant que cela soit possible.

La manière la plus simple de transformer une variable en une expression
est de la mettre entre parenthèses. Par exemple, pour passer une
variable déclarée comme entier à une procédure qui s'attend à recevoir
une chaîne comme argument, vous devez procéder de la manière suivante :

Sub CallingProcedure()
Dim intX As Integer
intX = 12 * 3
Foo(intX)
End Sub

Sub Foo(Bar As String)
MsgBox Bar ' La valeur de Bar correspond
' à la chaîne "36".
End Sub



Jean-Marc a écrit :

"TTT" a écrit dans le message de
news:4165935a$0$286$

quelle différence entre :
test x
et
test(x)
?




Hello,

voila j'ai retrouvé dans la doc:
Remarks

You are not required to use the Call keyword when calling a procedure.
However, if you use the Call keyword to call a procedure that requires
arguments, argumentlist must be enclosed in parentheses. If you omit the
Call keyword, you also must omit the parentheses around argumentlist.

et la référence complète est:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbenlr98/html/vastmCall.asp



Avatar
Patrice Henrio
Avec un integer on a le même problème.

Donc "test x" passe l'adresse de x et dans la fonction, si on est byref, on
continue avec l'adresse, si on est byval, on se contente de copier la
valeur.
Pour "test(x)" on ne passe que la valeur.
Quand à savoir pourquoi ??? J'ai l'impression que là on touche aux
fondements même de VB.

"TTT" a écrit dans le message de news:
4165986f$0$297$
désolé mais il n'y a pas d'explication satisfaisante pour le moment...
en plus
si j'exécute le même code en visual studio .net le x est bien modifiée :

Autrement dit :

Sub Test(ByRef x As String)
x = "XXX"
End Sub

Private Sub Form_Load()
Dim x As String
x = "ABC"
Test(x)
MsgBox (x)
Ens Sub

Sous VS6 ça m'affiche ABC
et sous VS.NET 2003 ça m'affiche XXX

je ne comprends plus rien, c'est mon VS6 qui est mal installé ou corrompu?




Avatar
TTT
> Pour "test(x)" on ne passe que la valeur.
Quand à savoir pourquoi ??? J'ai l'impression que là on touche aux
fondements même de VB.



Ben vois tu, depuis que je fais du vb, je ne savais pas !
merci à vous tous
Avatar
Pascal B.
Bonjour,

En écrivant Test (x), tu passes à la procédure une EXPRESSION au lieu d'une VARIABLE;
il n'y donc pas de modification en retour, puis que ce n'est pas l'ADRESSE de la variable qui est passer à la procédure mais bien la
VALEUR de l'expression.

Les parenthéses utilisées lors d'un Call font partie de la syntaxe et ne produit donc pas le meme effet sauf si on double les
parenthèses: Call Test((x)). Dans ce cas, c'est (x) qui est passer comme argument au lieu de x.

Cordialement

Pascal B.

"NTH" wrote in message news:416589df$0$25753$
| Bonsoir
| J'ai une question très bête mais je ne comprends pas pourquoi... pourtant je
| ne suis pas débutant en vb...
| Voici :
|
| Sub Test(ByRef x As String)
| x = "XXX"
| End Sub
|
| Private Sub Form_Load()
| Dim x As String
| x = "ABC"
| Test(x)
| MsgBox (x)
| Ens Sub
|
| Ca m'écrit "ABC" pourtant je croyais que ça devait écrire XXX ?
| Bizarre non? mon système est corrompu ou quoi?
|
| Merci
|
|
Avatar
Gloops
Salut,

Fais gaffe, en .NET c'est complètement différent cette histoire de
parenthèses pour l'appel d'une procédure.
ça fait que si tu essaies d'assimiler les deux à la fois, ça a des
risques d'être indigeste.

(Voir chez Ms Press, Ms Visual Basic.NET étape par étape, Mickael
Halvorson, dépôt légal avril 2002, p. 283/284) (HS ici)
___________________________________
TTT a écrit, le 07/10/2004 21:26 :

désolé mais il n'y a pas d'explication satisfaisante pour le moment...
en plus
si j'exécute le même code en visual studio .net le x est bien modifiée :

Autrement dit :

Sub Test(ByRef x As String)
x = "XXX"
End Sub

Private Sub Form_Load()
Dim x As String
x = "ABC"
Test(x)
MsgBox (x)
Ens Sub

Sous VS6 ça m'affiche ABC
et sous VS.NET 2003 ça m'affiche XXX

je ne comprends plus rien, c'est mon VS6 qui est mal installé ou corrompu?




Avatar
Patrice Henrio
OK c'est plus clair.

"Pascal B." a écrit dans le message de news:

Bonjour,

En écrivant Test (x), tu passes à la procédure une EXPRESSION au lieu
d'une VARIABLE;
il n'y donc pas de modification en retour, puis que ce n'est pas l'ADRESSE
de la variable qui est passer à la procédure mais bien la
VALEUR de l'expression.

Les parenthéses utilisées lors d'un Call font partie de la syntaxe et ne
produit donc pas le meme effet sauf si on double les
parenthèses: Call Test((x)). Dans ce cas, c'est (x) qui est passer comme
argument au lieu de x.

Cordialement

Pascal B.

"NTH" wrote in message
news:416589df$0$25753$
| Bonsoir
| J'ai une question très bête mais je ne comprends pas pourquoi...
pourtant je
| ne suis pas débutant en vb...
| Voici :
|
| Sub Test(ByRef x As String)
| x = "XXX"
| End Sub
|
| Private Sub Form_Load()
| Dim x As String
| x = "ABC"
| Test(x)
| MsgBox (x)
| Ens Sub
|
| Ca m'écrit "ABC" pourtant je croyais que ça devait écrire XXX ?
| Bizarre non? mon système est corrompu ou quoi?
|
| Merci
|
|




Avatar
NTH
> En écrivant Test (x), tu passes à la procédure une EXPRESSION au lieu


d'une VARIABLE;
Oui oui c'est explication finale que j'ai trouvée.
C'est qd même tordu le VB (sans compter qu'il faut faire aussi avec le
VB.NET)
Bref, je suis soulagé, je vais passer en C# bientôt !!!
1 2