3次元配列を1次元配列で表現
int hoge[][][]では足りないぐらい大きい三次元配列を確保したい方へ。C/C++でポインタによる多次元配列を連続したメモリ領域に作成するでもforで回してやる方法が書かれているけどこれだと確保が遅い。この方式のほうがまとまった領域を一気に確保してそのまま使えるので早い。ただアクセスするたびに若干の計算が必要になるけど。微妙ではある。
#include <stdio.h> #include <stdlib.h> #define WIDTH 1000 #define HEIGHT 1000 #define OFFSET(x,y,z) ((WIDTH + HEIGHT * (z)) + ((x) + WIDTH * (y))) int main(){ int *tmp = NULL; tmp = (int*) malloc( 1000*WIDTH *HEIGHT ); if(tmp == NULL){ exit(1); } tmp[OFFSET(1,1,1)] = 1; printf("%d",tmp[OFFSET(1,1,1)]); free(tmp); return 0; }
プログラミング初心者ですみません。
返信削除#define にこんな使い方があるなんて感動しました!
これなら分かりやすい上に計算式を入力ミスする心配も減っていいですね。
参考になりましたm(_ _)m
phanaさん
削除コメントありがとうございます><
#define は定数だけでなくこういうマクロっていう使い方もできます。普通の関数でもできますが、マクロにすると式が展開されるので余計な呼び出しがなくなり高速にアクセスできます。
また、よろしかったらお越しくださいませ
この方法は面白いですね!使わせてもらいます。
返信削除以下、余談です。
マクロ型定数は各項(x,y,z)を括弧で括っておいたほうがいいですよ。xに足し算を入れてしまうと演算順序がおかしくなります。
それとどうでもいいことですがOFFCETではなく、OFFSETではないでしょうか?
コメントありがとうございます!どうぞご自由にお使いくださいませw
削除ご指摘ありがとうございますっ。マクロの()は普段はC#を使っているがゆえ、気づきませんでした。スペルミス、お恥ずかしい限りです…w 2つとも修正いたしました!