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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top