私はarduinoコードをstm32(c/C++)に移植します。 xはaとbArduinoの機能ポートを制限する
の間にある場合:Xの場合:xは
Bよりも小さい場合
constrain(x, a, b)
戻り
X:機能で私を助けてくださいはbより大きい
例
ここでsensVal = constrain(sensVal, 10, 150);
// limits range of sensor values to between 10 and 150
私はarduinoコードをstm32(c/C++)に移植します。 xはaとbArduinoの機能ポートを制限する
の間にある場合:Xの場合:xは
Bよりも小さい場合
constrain(x, a, b)
戻り
X:機能で私を助けてくださいはbより大きい
例
ここでsensVal = constrain(sensVal, 10, 150);
// limits range of sensor values to between 10 and 150
使用を実証するための完全なプログラムを含むテンプレート・バージョン、(あなたがそれをコピーして貼り付けることができるはずです):
#include <iostream>
template<class T>
const T& constrain(const T& x, const T& a, const T& b) {
if(x < a) {
return a;
}
else if(b < x) {
return b;
}
else
return x;
}
int main() {
int value = 10;
std::cout << constrain(value, 5, 20) << "\n" // prints "10"
<< constrain(value, 15, 20) << "\n" // prints "15"
<< constrain(value, 5, 9) << std::endl; // prints "9"
}
これはoperator<
を持っている任意のタイプのために使用することができます(これには、int
やfloat
などのすべての組み込み数値型が含まれます)。
Clamping (graphics)の下でWikipediaを見ると、タイプに依存しないテンプレートがあるようですね。
template<typename T>
T clamp(T Value, T Min, T Max)
{
return (Value < Min)? Min : (Value > Max)? Max : Value;
}
これをアンガーで楽しむための公正なプレー – thecoshman
Arduinoの場合、constrain
は#defineされたマクロです。
Arduino.hのArduino.hで定義されています。あなたは
それは定義があります:-)それを読むことができるように
Arduinoのソースコードは、オープンソースライセンスの下でリリースされています。STM32にあなたのポートで作業を続けるだろう
#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
。
もちろん、それはマクロなので、テキストを置き換えるだけです。したがって、パラメータはソースコードに表示されるため、新しいタイプの情報はありません。
マクロではなく関数を使用することをお勧めしますが、コードが既存のコードのポートであるため、マクロを引き続き使用する方が簡単です。その後、元のコードが改善または変更された場合は、はで新しいポートを生成する必要がありません。
型付き関数、またはマクロではなくテンプレート関数を使用しようとすると小さな問題が発生し、後で混乱する可能性があります。マクロではなく関数を使用すると、Arduinoコードを移植しようとすると、新しい警告、エラー、バグなどが発生する可能性があります。具体的には、元のコードで一致する関数がないタイプまたはクラスのconstrain
を使用している場合、Arduinoソースには明らかに存在しないエラーが発生します。あるいは、型付きやテンプレート化された関数が、マクロ版では発生しないC++型の変換を引き起こす可能性があります。あなたは、自分自身のために、またはあなたのコードを将来的に取る人のために、小さな「つかまえ」を残すかもしれません。
この機能は些細なことですが、何が問題になっていますか? –
これは正しいですか? http://pastebin.com/trTi6x3G – SevenDays
いいえ、これは正しくありません。C++では、各関数の戻り値の型だけでなく、各変数の型を指定する必要があります。あなたのパラメータには型がなく、関数には戻り値型の 'void'があります。つまり、値を返すことはできません。 –