C言語で2次元配列に対するループで制御文から添字を省く試み
教育用の覚書。2次元配列、例えば画像データの画素に関するループで、添字に関するfor文を書くときに添字の範囲をタイポしそうなので、添字のインクリメントと範囲チェックを関数化してwhileの中に入れるとタイポのエラーが回避しやすいかもと思った。書いてみた。
画像データを格納するための構造体
typedef struct { int xMax, yMax; // 画素数 int **r, **g, **b; // 画素アクセス用のポインタのポインタ int x, y, flagSweep, margin; // 画素のループ用の変数 [その他必要なもの] } BMPData *img;
画素のループの処理
initSweepPixel(img,margin); // ループ処理の初期化 while( sweepPixel(img) ) { // ループ処理の本体 blue= img->b[img->y][img->x]; green= img->g[img->y][img->x]; red= img->r[img->y][img->x]; ... }
添字を変化させ、添字の範囲をチェックする関数
int initSweepPixel ( BMPData *img, int margin ) { img->flagSweep= 1; img->x= margin; img->y= margin; img->margin= margin; return 1; } int sweepPixel ( BMPData *img ) { img->x++; if ( img->x - img->xMax + img->margin ) return 1; img->x= img->margin; img->y++; if ( img->y - img->yMax + img->margin ) return 1; img->flagSweep= 0; return 0; }
for文がwhile文のシュガーシンタックス(for(A;B;C){D;} ⇔ A;while(B){D;C;})であることを言い換えたような感じ。