CInt non funziona come previsto in .Net MF
-
26-10-2019 - |
Domanda
ho qualcosa abbastanza Noddy di dissolvenza incrociata il colore di un led RGB e sto avendo problemi per ottenere i valori desiderati.
Ho spogliato questo esempio fino a un minimo, ma Start
, End
e Steps
saranno tutti variabili ...
Questo dovrebbe linearmente R
incremento (UInt) da 0 a 255 in 100 passi. Io non sono troppo preoccupato per la precisione qui in modo non mi interessa se arrotonda correttamente o semplicemente fa 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
Questa Uscite:
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
Come si può vedere, la variabile Temp è piuttosto-molto corretto, consentendo qualche lieve imprecisione, ma non riesco a vedere ciò che la correlazione è con R
.
E 'possibile che CUint semplicemente leggendo i bit Temp e trattare la Double
come UInt
-? Ma se è così, come faccio a farlo convertire correttamente
(Per inciso, questa è in esecuzione su un Netduino ), .Net Micro Framework 4.2
Modifica: test richiesti di seguito:
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
utilizzando il seguente codice ...
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
I get (sulla linea Dim Temp
):
An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe
Non c'è eccezione interna, ma solo sopra di esso in uscita è una prima eccezione di possibilità, che sto cercando di indovinare è la causa principale:
A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll
Soluzione
Provare a utilizzare Convert.ToUInt32, delineato qui: http://msdn.microsoft .com / it-it / library / y3569ft9.aspx
Sul mio .Net 4.0 (non micro) su Windows 7 a 64 bit non sto vedendo quello che si sta vedendo con CInt / CUInt (convertiti miniera correttamente). Questo può essere un errore di implementazione in Netduino / Quadro Micro ... Se ho avuto ho iniziato ad esaminare quanto sopra per voi.
Altri suggerimenti
Qualunque cosa sta accadendo vi consiglio di evitare uints tanto quanto è possibile (ci sono stato). Vorrei scrivere il codice in questo modo:
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
Non riesco a provare perché non ho la Vb.Net compilatore a disposizione e ho scritto il codice direttamente su SO, ti prego perdonami se ci sono errori di compilazione.
Un altro approccio completamente diverso. Mentre gli sguardi problema da con doppi e conversioni potremmo evitare doppie facendo solo sottrae:
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
Quick & sporco ma funziona.
Come su
Debug.Print(Test.ToString().Split("."c)(0))
Non ho lavorato eventuali edge-casi, ma questo ha lavorato su un paio di esempi che ho provato. Io non consiglierei questa soluzione se questo dovrà essere eseguita in un ciclo in quanto non funzionare bene, ma potrebbe essere un tappabuchi fino a quando si può trovare qualcosa di meglio.