変数の範囲チェック

ある変数の取れる値を制限したい場合がある。

int   x;

// xにいろんな処理

// xの値を0 〜 255に制限
if( x > 255 ) x = 255;
if x < 0 ) x = 0;

いちいち上のようなコードを書くのはくたびれるので、こんなマクロを用意しておくと役立つ

#define RANGE_CHECK(x,min,max) ((x= (x<min  ? min : x<max ? x : max)))

上限、または下限を制限したいだけなら

// 上限を255に制限
x = std::min( x, 255 );

// 下限を0に制限
x = std::max( x, 0 );

><

ところで、こういう処理をしたい場合には、変数の型は変数の取りうる値より大きくとっておく必要がある。例えば値の範囲が0〜255だからといってunsigned char型を使ってしまうと・・・

unsigned char   c;

// cにいろんな処理

// だめぽ
if( c > 255 ) c = 255;
if c < 0 ) c = 0;

当然、このコードは期待したとおりに動かない。これに気づかずハマったことが何度も・・(ry

>

ループする変数

オイラー角みたいに360まで行ったら0に戻るという処理に剰余を用いるテクニック。
http://www.cranehouse.jp/program/other.html
大変参考になりました。