cintは.net mfで予想どおりに機能しません
-
26-10-2019 - |
質問
RGB LEDの色をクロスファードするためにかなりのノディがあり、望ましい値を取得するのに問題があります。
この例を最小限に抑えましたが Start
, End
と Steps
すべてが可変になります...
これ したほうがいい 線形増分 R
(uint)100ステップで0から255まで。私はここでの精度についてあまり心配していないので、それが適切に丸くなっているのか、それともただのことをするかどうかは本当に気にしません 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
これは出力です:
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
ご覧のとおり、温度変数はかなり正しいものであり、わずかな不正確さを可能にしますが、相関関係が何であるかはわかりません R
.
Cuintが一時のビットを単に読んで、 Double
として UInt
- しかし、もしそうなら、どうすればそれを正しく変換させることができますか?
(ちなみに、これはaで実行されています netduino)、.NETマイクロフレームワーク4.2
編集:以下にリクエストしたテスト:
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
次のコードを使用して...
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
私は取得します(上 Dim Temp
ライン):
An unhandled exception of type 'System.Exception' occurred in Netduino_VBTest.exe
内部例外はありませんが、出力のすぐ上の例外が最初のチャンス例外です。
A first chance exception of type 'System.NotImplementedException' occurred in Microsoft.SPOT.Native.dll
解決
convert.touint32を使用してみてください。ここで概説します。 http://msdn.microsoft.com/en-us/library/y3569ft.aspx
Windows 7 64bitの私の.NET 4.0(マイクロではない)では、CINT/CUINTで見ているものが表示されていません(私の変換は適切に変換されます)。これは、NetDuino/The Micro Frameworkの実装エラーかもしれません...それがあれば、上記をテストします。
他のヒント
何が起こっていても、できる限りuintsを避けることをお勧めします(私はそこに行ったことがあります)。私はこのようなコードを書きます:
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
VB.NETコンパイラが利用できないので試してみません。コードを直接書きました。コンピレーションエラーがあれば許してください。
別のアプローチはまったく異なります。問題はダブルスとコンバージョンにあるように見えます。
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
素早く汚れていますが、それは機能します。
どうですか
Debug.Print(Test.ToString().Split("."c)(0))
私はエッジケースを解決していませんが、これは私が試したいくつかの例に取り組みました。これをループで実行する必要がある場合は、このソリューションを実行する必要がある場合は、このソリューションをお勧めしませんが、より良いものを見つけることができるまで、ストップギャップかもしれません。