Visual Basic 6.0 & 2005

J’ai beau matter les documentations de VB6 et VB2005, j’ai toujours du mal à capter les subtilité des mots clé byref et byval, c’est quoi que c’est drole de truc ? Selon la doc il y a un grand changement entre VB6 et VB2005 pour ces deux mots clé. GloP tu peux me renseigner :stuck_out_tongue: ?

Sinon, Visual Basic 2005 Express à l’ai sympa, mais j’ai du mal à comprendre les différences entre VB 2005 Express et VB.Net. Je n’ai pas trouvé non plus comment on gérer les packages, je ne suis même sur que c’est possible.

Bon meme si j’ai fait du VB il y a quelques annees (mes annees sombres), je pense m’en souvenir:

byval: On force le passage de parametre dans une fonction 'BY VALue". C’est a dire qu’on prend la variable, on la copie (en C, c’est dans la stack) et hop, c’est la variable dans la fonction. Le truc, c’est qu’au retour de la fonction, la variable d’origine ne change pas - en fait, ne peux pas changer.

byref: On force le passage de parametre dans une fonction 'BY REFerence". C’est a dire qu’on prend un POINTEUR sur la variable et qu’on utilisera, en realite, la variable d’origine dans la fonction: Si la fonction modifie la variable, elle sera modifie une fois sortie de la fonction.

Est ce que je suis clair? Et est ce que j’ai pas dit de connerie, je suis pas sur du comportement de VB, quand meme… :stuck_out_tongue:

Enfin ca marche comme ca en C (valeur ou pointeur) donc j’imagine que ca doit etre similaire.

LoneWolf
Sinon, le C, ca poutre.

Disclamer : Si j’ai faux pas taper et corriger svp, j’ai vu ça ce matin à la fac :stuck_out_tongue:

Comme le dit Lonewolf ça ressemble fortement aux passages par valeur (un paramètre int i dans une fonction par exemple) et aux passages par référence (int& i) en C++ (il y a les pointeurs aussi mais c’est un chouia plus compliqué, puisque les références se traitent comme des variables classiques). En Pascal les références se passent avec le mot clé var (on passe la variable elle-même et non pas seulement sa valeur).

J’imagine que tu n’as pas fait le lien avec tes connaissances dans d’autres languages, parce que ça m’étonnes que tu ne connaisses pas ça, ça fait partie des bases de la programmation :stuck_out_tongue:

Outre le fait que C# est plus simpa (pour moi) que VB, surtout pour quelqu’un habitué a des languages comme java ou C++…

les mot clés byval et byref correspondent effectivement aux passage par valeur ou par référence, a savoir si la variable est copiée ou pas avant que la fonction soit éxecutée.

Par défaut, tout les appels sont par valeur, mais faut savoir, cependant, que lorsque la variable est un objet, on manipule en fait sa référence. Donc on passe une copie de la référence a l’objet.

Je sais, c’est compliqué, faudrait faire un exemple pour expliquer et tout…*

bon ok

[code]class TypeA
{
  int b;
}

fonction( TypeA a, int b)
{
  b+=2;
  a.B = b;
}

TypeA objA = new TypeA();
objA.b = 4;
int  i = 3;
fonction(objA , i);[/code]

Ici, les deux paramètres de fonction sont passés par valeur.
Cependant, l’objet passé en parametre n’est pas copié (sa référence l’est), du coup, en sortie de la fonction, l’objet référencé par objA est bien modifié. i reste inchangé.

[code]class TypeA
{
  int b;
}

fonction( TypeA a, ref int b)
{
  b+=2;
  a.B = b;
}

TypeA objA = new TypeA();
objA.b = 4;
int  i = 3;
fonction(objA , ref i);[/code]

Ici, on passe le deuxieme parametre (l’int) par reference. Résultat, en sortie de fonction i est modifié et vaut 5 (et non plus 3).

[code]class TypeA
{
  int b;
}

fonction( TypeA a, int b)
{
  b+=2;
  a.B = b;
  a = new TypeA();
  a.B = 146;
}

TypeA objA = new TypeA();
objA.b = 4;
int  i = 3;
fonction(objA , i);[/code]

Ici, le membre b de objA est égal à 9 en sortie. a = new TypeA(); change l’objet référencé par la variable a (sans détruire l’ancien ni changer l’objet référencé par objA).

[code]class TypeA
{
  int b;
}

fonction( ref TypeA a, int b)
{
  b+=2;
  a.B = b;
  a = new TypeA();
  a.b = 146;
}

TypeA objA = new TypeA();
objA.b = 4;
int  i = 3;
fonction(ref objA , i);[/code]

Ici, par contre, on passe objA par référence. Donc en sortie de fonction, l’objet référencé par objA est un objet tout neuf. (l’ancien étant voué a la destruction s’il n’est plus référencé nulle part).

Bon, alors comme le disais tzim, kinox, lonewolf, etc, byval et byref ca fait des trucs un peu bizarre… je vais pas me répéter.
Par contre, je vais innover (corrigez-moi si y a quelqu’un qui a deja expliqué ca) et essayant d’expliquer a quoi qu’ça sert :
grosso modo, les mecs qui ont fait le fortran (c’est le langage le plus ancien que je maitrise… a part l’asm) se sont dit que copier une valeur dans la pile,appeler une fonction, copier la valeur en local, la modifier (ou pas), quitter la fonction et remettre la valeur bien comme il faut, c’est pas ce qu’il y a de plus rapide, donc au lieu de passer une copie de ta variable (comme ca se fait --obligatoirement, car quand on pase un pointeur, on passe une copie du pointeur, donc même le passage par adresse est un passage par valeur (a priori)-- en C), bah on lui refile directement la variable… ca évite de faire un truc du style x=f(x); , f(x); suffit largement…
Un autre endroit ou tu peux utiliser le passage par référence (attention, danger), c’est dans les fonctions qui ne modifient pas la valeur de ta variable (style un printf ou un calcul de moyenne de tableau qui ne va pas changer ton tableau)… Pourquoi danger ? bah si tu modifie ta fonction et que finalement elle change la valeur de la variable passée par référence et que ca ne devrait être que temporaire, bah crac, si t’oublies de dégager le byref
Bon et histoire de finir sur un troll : quitte a avoir visual studio 2005, autant l’utiliser pour programmer en c++ (je commence a apprécier ce langage… qui l’eu cru ???) parce que le vb est le seul langage a m’avoir fait rigoler pendant 4h de TP, tellement c’est bourré de trucs hérité d’un langage qui l’avait lui même hérité d’un autre qui font que c’est très hautement incompréhensible, comme code (sauf si c’est codé proprement, bien sûr, mais c’est tellement rare, un code propre), même comparé à un c++ qui inclu de l’asm, du java et du fortran 77 (je vous rassure, j’ai jamais eu affaire a ce genre de code :P)…

[quote name=‘molyss’ date=’ 30 Sep 2005, 02:15’]Bon et histoire de finir sur un troll : quitte a avoir visual studio 2005, autant l’utiliser pour programmer en c++ (je commence a apprécier ce langage… qui l’eu cru ???) parce que le vb est le seul langage a m’avoir fait rigoler pendant 4h de TP, tellement c’est bourré de trucs hérité d’un langage qui l’avait lui même hérité d’un autre qui font que c’est très hautement  incompréhensible, comme code (sauf si c’est codé proprement, bien sûr, mais c’est tellement rare, un code propre), même comparé à un c++ qui inclu de l’asm, du java et du fortran 77 (je vous rassure, j’ai jamais eu affaire a ce genre de code :P)…
[right][post=“402813”]<{POST_SNAPBACK}>[/post][/right][/quote]

Je sais c’est pas bien de troller mais là c’est plus fort que moi, j’ai matter un peu les codes C++ .net et je trouve ça laid et pas qu’un peu. Serieusement les dernieres versions de visual studio, c’est pour developper en .net avant tout et le langage le plus joli et agréable pour le .net c’est pas le C++ qui se fait un peu vieux. (Perso je suis un partisant du C# mais je comprends que ceux qui ont appris avec VB utilisent VB.Net)

Bon j’ai lu en diagonale par manque de temps mais j’aimerai faire quelques remarques : vous comparez ça a du C, du fortran ou du C++, moi mon truc c’est le Java, et en Java, fini les pointeurs, seulement deux types : les types primitifs et les objets. Les types primitifs sont manipulés par leur valeur et les objets par leur référence, si j’ai bien compris, en VB, on peut fournir des types primitifs par référence ? Je trouve ça assez dégeux.
Faudrai que j’approfondisse vraiment la doc.

[quote name=‘majinboo’ date=’ 29 Sep 2005, 22:00’]Serieusement les dernieres versions de visual studio, c’est pour developper en .net avant tout
[right][post=“402825”]<{POST_SNAPBACK}>[/post][/right][/quote]
Non. Pas forcement du tout.

Bon, j’ai bien approfondi aujourd’hui et je trouve ça vraiment zarb, le fait de passer les variables par référence, comme j’ai dit plus haut c’est moche, ca peut créer pleins des bugs si on fait pas gaffe. Heureusement, MS a changer ça en ByVal par défaut.
Dès fois ils font des trucs bien chez MS :stuck_out_tongue:

Ben on peut trouver ça moche, mais c’est nécessaire quand en VB on fait appel à des fonctions qui sont dans des .dll et qui demander des pointeurs vers des types “primitifs”.
C’est pas un truc à utiliser tous les jours, mais c’est quand meme bien pratique.
De plus, je sais pas si c’est encore d’actualité pour VB.net, mais c’est surement un héritage de l’existant…