J'utilise la fonction suivante pour éclaircir les valeurs de couleur (c'est un lambda dans mon code, mais cela ne devrait pas faire de différence) :
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (255 - i) \ 2
End Function
Il ne sera pas compilé, car le compilateur interprète 255
y 2
en tant qu'entiers plutôt qu'en tant qu'octets, ce qui fait que le résultat est de type Integer
. Malheureusement, il n'y a pas de caractère de type octet Je ne peux donc pas me contenter d'écrire 255B
ou quelque chose comme ça.
Il existe quelques solutions évidentes à ce problème :
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return i + (CByte(255) - i) \ CByte(2)
End Function
et
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Return CByte(i + (255 - i) \ 2)
End Function
et
Function ReduceDistanceTo255(ByVal i As Byte) As Byte
Dim FF As Byte = 255
Dim two As Byte = 2
Return i + (FF - i) \ two
End Function
La première est tout simplement laide et difficile à lire, parce que tous littérale doit être CByte
d. Le second effectue des calculs sur des entiers et convertit ensuite le résultat en octet, ce qui est correct, mais pas aussi élégant qu'une opération sur un octet pur. La troisième solution ne nécessite pas de CByte
mais ses inconvénients sont évidents.
Ai-je manqué une quatrième option (élégante) qui me permette de faire du calcul sur octets sans encombrer ma formule avec des CBools ?