FONCTION ROUND

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 - 17 déc. 2005 à 14:51
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 17 déc. 2005 à 15:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35132-fonction-round

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
17 déc. 2005 à 15:16
Je rejoins l'avis d'econs et je rajouterai : il faut absolument que le type de retour soit un double, ainsi que le type de n.

Travailler avec des string ralentit l'éxécution de ta fonction, car il faut que VB fasse tout plein de cast. Et surtout, tu ne fait même pas de test sur la valeurs envoyée à la fonction, donc :
Round("Toto", 2) plante irrémédiablement (normal !).

Autre chose, pourquoi passer tes variables par référence ??? Il ne s'agit pas d'objet, donc le temps perdu pour la copie de la valeur de la variable est largement compensé par le temps perdu pour les cast du type String en Int !!! Surtout que tu ne modifie pas la valeurs des paramètres, donc le passage par référence est vraiment grotesque ! Autant prendre des bonnes habitudes, et ne passer des arguments par référence que lorsque c'est nécéssaire (modification du paramètre, ou passage de "gros" objets).

DarK Sidious
econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
17 déc. 2005 à 14:51
Si 'n' est une String et 'e' est un Long, quel peut bien être le type de
(10 ^ e) * n ?
Si en plus, tu castes çà par la fonction Int(), si par miracle (et hélas VB fait ce genre de miracle) il y a un résultat à l'opération précédente, çà retournera un Integer.

Tu divises donc un Integer par un Long, et tu claques çà dans Round.
Mais ta fonction doit retourner une String. "Function Round(...,...) As String"

Quelle catastrophe sur le plan du typage !!
Si tu devais compiler ce code en C ou en Ada par exemple, tu te ferais insulter par le compilo.

La variable 'n' ne doit pas être de type String. Type Long à la rigueur, ou Double.
Et la fonction Round ne doit surtout pas renvoyer une String (oulàlà), mais un type Long (ou Double).


L'avantage de cette technique (et il y en a cependant un), c'est qu'on n'a pas à se soucier de la longueur des nombres qu'on arrondit car tu utilises des chaines de caractères. C'est VB qui fait tout le travail tout seul. Du coup, pas de dépassement de capacité.
Parfois, VB, c'est magique !