[BIDE] Question con : utilité des call en VBScript - VB/VBA/VBS - Programmation
Marsh Posté le 15-01-2004 à 12:47:04
j'ai pas bossé lontemps en VB. Mais sauf erreur c'est lorsque l'on veut appeler dans un event depuis un autre
Code :
|
Permet donc de simuler le click sur le button.
A tester toutefois
Marsh Posté le 15-01-2004 à 13:06:00
Et sans, ça donne quoi ? Si ça marche, pas besoin...
En vieux VBasic 2 et 3, on pouvait faire
Call Fonct(A%, B$, C& )
ou
Fonct A%, B$, C&
ce qui n'aidait pas la relecture.
Up !
Marsh Posté le 15-01-2004 à 13:23:20
Voici une utilisation significative de call dans le premier exemple :
http://www.ddj.com/documents/s=150 [...] /jan00.htm
Marsh Posté le 15-01-2004 à 13:29:21
carbon_14 a écrit : Et sans, ça donne quoi ? Si ça marche, pas besoin... |
c'est toujours le cas en VB6
(et c'est bien chiant d'ailleurs ²)
Marsh Posté le 15-01-2004 à 14:00:43
mr_mat a écrit : en gros ca sert a rien |
Marsh Posté le 15-01-2004 à 14:21:11
dans mon expérience, l'emploi du Call diminue les possibilités de bugs (faudra surtout que je retrouve un bon exemple )
Je pense qu'on avait eu un problème avec une fonction qu'on appelait sans call (et donc sans parenthèse et sans récupérer la valeur de retour). Le comportement n'était pas normal mais je plus à quel niveau exactement
Marsh Posté le 15-01-2004 à 18:42:40
Quand on l'utilise systématiquement, ça permet de savoir que c'est un appel à une Function ou Sub, c'est plus lisible (rigoureux), ça peut aider à faire la "doc" des fonctions utilisées : suffit de chercher tout ce qui suit un "call".
Marsh Posté le 15-01-2004 à 19:51:33
Nan mais serieusement, lisez le lien que j'ai indiqué. Dans certains cas, il est possible d'ommetre le Call et ca change fondamentalement le comportement de l'appel au niveau des passages de paramètres par reference.
Marsh Posté le 16-01-2004 à 02:04:36
yep, et contrairement à drasche, je dirais que l'emploi de Call est source de bugs !
Sub testALaCon(a as Integer)
do while a > 0
msgbox(a)
a = a - 1
loop
End Sub
Dim a as Integer
a = 3
testALaCon a
MsgBox("Valeur après appel normal : " & a)
call testALaCon(a)
MsgBox("Valeur après appel call : " & a)
Et là, on voit que a est modifié lors de l'éxécution avec un call ! Assez moyen non ?
Sinon, si mes souvenirs sont bon, Call permet de lancer un appel à une fonction assychrone sans attendre le résultat, mais je suis pas sûr de moi (c'est peut-être plutôt le Call qu'on a avec le langage Batch sous DOS )
Marsh Posté le 16-01-2004 à 09:32:22
MagicBuzz, tu le fais exprès ou quoi? Ton paramètre est déclaré ByRef là (ça a toujours été comme ça en VB6) donc le comportement est parfaitement logique. C'est dingue comment t'arrive encore à m'épater (no offence hein )
Marsh Posté le 16-01-2004 à 09:35:52
MagicBuzz a écrit : yep, et contrairement à drasche, je dirais que l'emploi de Call est source de bugs ! |
Tu viens de montrer la bonne utilisation des appels de fonction en VB : en appelant depuis un call, c'est normal que le parametre est modifiable car tu n'as rien spécifié et donc le parametre est passé par référence (ByRef).
J'ai lu dans "Hardcore VB", de Microsoft Press de TOUJOURS utiliser les Call, car ca permet d'avoir un code propre et surtout, c'est plus rapide car VB sait directement qu'il s'agit d'un appel vers une sub/function.
MAJ : erf ! grilled
Marsh Posté le 16-01-2004 à 10:25:37
drasche a écrit : MagicBuzz, tu le fais exprès ou quoi? Ton paramètre est déclaré ByRef là (ça a toujours été comme ça en VB6) donc le comportement est parfaitement logique. C'est dingue comment t'arrive encore à m'épater (no offence hein ) |
Integer est par défaut byval, relis tes bouquins
La preuve, l'appel normal, sans call, ne modifie pas la variable (ou alors on n'a vraiment pas les mêmes versions de VB !)
Marsh Posté le 16-01-2004 à 10:35:42
je rêve ou quoi?
tout est byref par défaut, ya pas d'exception qui tienne (sauf celle mentionnée sur la page postée par Kristoph)
Marsh Posté le 16-01-2004 à 10:44:23
Code :
|
voilà Magic, essaie ceci avec et sans Call, tu verras que TOUS les types sont modifiés. Purée je me demande même pourquoi je me suis donné la peine de cette démonstration, j'étais sûr de mon fait! Et ça marche aussi si je déclare GetValues comme une fonction.
Marsh Posté le 16-01-2004 à 10:54:13
bah y'a un truc qui m'échappe alors
question : et avec une fonction, c'est aussi en byref ? (parcequ'à la base, j'utilise rarement les sub donc c'est possible que je me soit planté, mais je reste sur mon derrière quand même, j'étais sûr de moi)
Marsh Posté le 16-01-2004 à 10:56:41
vivivi les fonctions aussi, j'ai essayé les 3 possibilités (bon ici dans mon sample je renvoyais pas de valeur mais j'en ai tapé une pour être complet quoi )
donc:
FuncName param1, param2
Call FuncName(param1, param2)
Value = FuncName(param1, param2)
Le ByRef par défaut est opérationnel dans les 3 cas, tu peux copier/coller mon code dans un projet et essayer
Marsh Posté le 16-01-2004 à 10:58:33
faudrait déjà que je sois au boulot
j'attends un livreur pour me remplacer mon 22" qui a grillé, et il commence à me gonflé ! je bosse à 1h de paris mois, y'en a marre, j'aimerais au moins avoir le temps de bouffer à midi
Marsh Posté le 16-01-2004 à 14:01:59
KarLKoX a écrit : |
j'ai fait un petit test pour vérifier tes dire, j'ai appelé la fonction suivante 100 000 000 fois:
Code :
|
temps d'éxécution lors d'un appel de type "call incremente(i)": 0,94 secondes.
temps d'éxécution lors d'un appel de type "incremente i": 1,12 secondes.
le gain n'est franchement pas énorme quand on sait que mon programme de test passe son temps à appeler une fonction.
P.S. à noter que "incremente (i)" ne fonctionne pas.
EDIT: finalement après avoir refait les tests plusieurs fois, il semblerait que cette différence viennent plutot des aléas des tests. Après avoir fermé tout ce qui bouffait du CPU, j'arrive à des temps égaux pour les 2
Marsh Posté le 16-01-2004 à 14:13:25
Je vois le genre, c'est peut-être ce qui a induit MagicBuzz en erreur: une fonction appelée avec parenthèses et un seul paramètre, là effectivement, ça se passe comme du ByVal.
Edit: testé et approuvé. C'est nul de leur part quand même
Marsh Posté le 16-01-2004 à 14:16:31
drasche a écrit : Je vois le genre, c'est peut-être ce qui a induit MagicBuzz en erreur: une fonction appelée avec parenthèses et un seul paramètre, là effectivement, ça se passe comme du ByVal. |
Ben les parenthèse sont en fait un opérateur qui renvoit la valeur de ce q'ui y a entre parenthèse donc cette erreur s'explique
EDIT: faudrait tester avec un objet
Marsh Posté le 16-01-2004 à 14:28:20
j'ai testé en effet:
Code :
|
pis ceci:
Code :
|
j'ai demandé à un collègue qui a un peu plus d'expérience que moi et qui m'a confirmé tout ça.
Marsh Posté le 16-01-2004 à 14:44:16
Faut dire surtout que souvent je passe des fonctions, ou alors des constantes à mes requêtes donc à partir de là
Marsh Posté le 16-01-2004 à 14:48:34
'fin maintenant je sais pourquoi un appel sans Call avec un seul paramètre passe à la compile et pas plusieurs paramètres
Marsh Posté le 16-01-2004 à 14:52:53
mareek a écrit : EDIT: faudrait tester avec un objet |
j'ai testé: runtime error (object doesn't support this property or method)
je m'en doutais un peu
Marsh Posté le 16-01-2004 à 15:36:59
donc call sapuduku
moi je préfère les syntaxes génériques, au moins on peut pas se planter
Marsh Posté le 16-01-2004 à 15:42:23
sinon, en parlant des objets et tout ça, je pense à un truc qui peut être très pratique, mais aussi dangereux si on fait pas gaffe.
Quand on bosse avec des rs ADO en VB, on fait généralement :
|
Ceci marche aussi !!! C'est un peu magique, et plus lisible... Par contre faut faire gaffe parceque c'est pas du tout le même fonctionnement que l'autre :
|
Vive la gestion bordelique des objets avec une default value, et la gestion des byref et byval implicites
PS: oui, je sais, ça n'a aucun rapport avec le sujet initial, c'était juste pour parler du joyeux bordel de la syntaxe de VB
Marsh Posté le 16-01-2004 à 15:49:54
En parlant du joyeux bordel, on voit que les méthodes des objets, même quand elles sont de type "sub", acceptent les () lors de l'appel, alors que c'est impossible pour une sub normale
Marsh Posté le 16-01-2004 à 16:03:49
MagicBuzz a écrit : donc call sapuduku |
bin non
d'ailleurs on peut utiliser la même astuce avec un call:
Code :
|
"i" sera passé ByVal quoi q'il arrive avec cette méthode.
J'ai bien noté pour ta démo. Le premier exemple prend les valeurs à chaque itération et le second prend directement les objets avant l'itération (plus qu'à lire la valeur). Perso j'aime pas trop exploiter les propriétés par défaut, je préfère tout mettre explicitement (VB passe du temps à savoir quelle propriété il doit sortir quand tu ne le fais pas toi-même)
J'ai pas compris ta dernière phrase par contre
Marsh Posté le 16-01-2004 à 19:28:48
MagicBuzz a écrit : sinon, en parlant des objets et tout ça, je pense à un truc qui peut être très pratique, mais aussi dangereux si on fait pas gaffe.
|
Tu ne types pas tes variables et après tu t'étonne que ce soit le bordel
Marsh Posté le 16-01-2004 à 19:38:01
bin et s'il teste en ASP ou en VBScript?
Marsh Posté le 16-01-2004 à 20:17:17
drasche a écrit :
|
Bah simplement le fait que met "set" devant une affectation, quand il s'agit d'un objet avec une valeur par défaut, fait se comporter l'appli différement, sans pour autant faire le moindre warning.
Cette solution est en elle-même intéressante, mais je trouve que faire un peu plus de différence entre les deux syntaxe n'aurait pas été du luxe, car là on peut se retrouver avec un comportement "anormal" et avoir un mal de chien à trouver pourquoi. Je sais pas si d'autres langages permettent de faire ça aussi "implicitement". En C par exemple, à partir du moment où tu bosse par référence (donc pointeur) la façon de récupérer les informations contenues dans le pointeur demande un syntaxe bien spécifique, on trouve tout de suite l'erreur. Alors que là bah nan
En fait, mes exemple sont mauvais. Prends la seconde syntaxe, et vire les "set".
Ca va très bien marcher, sauf qu'il va t'afficher les première valeurs autant de fois qu'il y a de lignes dans le rs. On peut y passer des heures avant de s'appercevoir qu'on a oublié le mot clé "set".
Marsh Posté le 16-01-2004 à 20:18:12
drasche a écrit : bin et s'il teste en ASP ou en VBScript? |
Yep, je fais très rarement du VB, pratiquement que de l'ASP, langage dans lequel si on type les valeurs, on a une erreur d'interprétation
Marsh Posté le 15-01-2004 à 11:16:10
en Vbscript (asp) est ce que c utile d'utiliser call pr appelerles procedures ? si oui pourquoi ?
Message édité par Profil supprimé le 15-01-2004 à 12:19:04