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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top