CInt ne fonctionne pas comme prévu dans .Net MF
-
26-10-2019 - |
Question
J'ai quelque chose d'assez noddy pour Fondu enchaîné la couleur d'un RGB conduit et je vais avoir des problèmes pour obtenir les valeurs souhaitées.
Je l'ai déshabillé cet exemple à un minimum nu mais Start
, End
et Steps
seront tous variables ...
devrait linéaire R
incrément (UInt) de 0 à 255 en 100 étapes. Je ne suis pas trop inquiet de la précision ici, donc je ne me soucie pas vraiment si elle arrondit correctement ou tout simplement fait un Floor
/ Ceiling
Dim Start As UInteger = 0
Dim [End] As UInteger = 255
Dim Steps = 100
For x = 1 To Steps
Dim Temp = ([End] - Start) / Steps * x + Start
Dim R = CUInt(Temp)
Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
LedR.SetPulse(255, R)
Threading.Thread.Sleep(20)
Next
Sorties:
1: Temp: 2.5500, R:196608
2: Temp: 5.1000, R:327680
3: Temp: 7.6500, R:524288
4: Temp: 10.2000, R:655360
5: Temp: 12.7499, R:851968
...
95: Temp: 242.2488, R:15859712
96: Temp: 244.7988, R:16056320
97: Temp: 247.3488, R:16187392
98: Temp: 249.8988, R:16384000
99: Temp: 252.4488, R:16515072
100: Temp: 254.9988, R:16711680
Comme vous pouvez le voir, la variable Temp est assez-bien correcte, ce qui permet une légère imprécision, mais je ne vois pas ce que la corrélation est avec R
.
Il est possible que CUint est en train de lire simplement les bits pour le traitement de la température et Double
comme UInt
- mais si oui, comment puis-je le convertir correctement
(Incidemment, cela est exécuté sur un Netduino ), .NET Micro Framework 4.2
Edit: tests demandés ci-dessous:
Dim Test As Integer = 2
Debug.Print(Test.ToString)
Debug.Print(CInt(Test).ToString)
Debug.Print(CUInt(Test).ToString)
2
2
2
Dim Test As Double = 2.5
Debug.Print(Test.ToString)
Debug.Print(CInt(Test).ToString)
Debug.Print(CUInt(Test).ToString)
2.5000
131072
131072
En utilisant le code suivant ...
For x = 0 To Steps
Dim Temp As Long = ([End] - Start) \ Steps * x + Start
Dim R = CType(Temp, UInteger)
Debug.Print(x.ToString & ": Temp: " & Temp.ToString & ", R:" & R.ToString)
LedR.SetPulse(255, R)
Threading.Thread.Sleep(20)
Next
je reçois (sur la ligne de Dim Temp
):
An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe
Il n'y a pas une exception intérieure, mais juste au-dessus de la sortie est une exception de première chance que je devine est la cause racine:
A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll
La solution
Essayez d'utiliser Convert.ToUInt32, décrite ici: http://msdn.microsoft .com / fr-fr / bibliothèque / y3569ft9.aspx
Sur mon .Net 4.0 (non Micro) sur Windows 7 64bit je ne vois pas ce que vous voyez avec CInt / CUInt (convertis de mines correctement). Cela peut être une erreur de mise en œuvre Netduino / le Micro Framework ... Si je l'avais je tester pour vous ci-dessus.
Autres conseils
Quelle que soit se passe, je vous conseille d'éviter uints autant que vous le pouvez (que je suis là-bas). Je voudrais écrire le code comme ceci:
Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Steps As Integer = 100
For x As Integer = 1 To Steps
Dim Temp As Integer = ([End] - Start) \ Steps * x + Start
LedR.SetPulse(255, CType(Temp,UInteger))
Threading.Thread.Sleep(20)
Next
Je ne peux pas essayer parce que je n'ai pas le compilateur Vb.Net disponible et je l'ai écrit le code directement sur le SO, s'il vous plaît pardonnez-moi s'il y a des erreurs de compilation.
Une autre approche complètement différente. Comme les regards de problème pour être avec doubles et les conversions que nous pourrions éviter doubles ne faire que soustraient:
Dim Start As Integer = 0
Dim [End] As Integer = 255
Dim Increment As Integer = 3
Dim Current as Integer = Start
While Current < End
Current = Current + Increment
LedR.SetPulse(255, CType(Current ,UInteger))
Threading.Thread.Sleep(20)
End While
rapide et sale, mais il fonctionne.
Qu'en est-
Debug.Print(Test.ToString().Split("."c)(0))
Je n'ai pas travaillé sur les bord des cas, mais cela a fonctionné sur quelques exemples que j'essayées. Je ne recommanderais pas cette solution si cela devra être effectué dans une boucle car il ne fonctionnera pas bien, mais il pourrait être un palliatif jusqu'à ce que vous pouvez trouver quelque chose de mieux.