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;
}

コメント

  1. プログラミング初心者ですみません。
    #define にこんな使い方があるなんて感動しました!
    これなら分かりやすい上に計算式を入力ミスする心配も減っていいですね。

    参考になりましたm(_ _)m

    返信削除
    返信
    1. phanaさん

      コメントありがとうございます><
      #define は定数だけでなくこういうマクロっていう使い方もできます。普通の関数でもできますが、マクロにすると式が展開されるので余計な呼び出しがなくなり高速にアクセスできます。

      また、よろしかったらお越しくださいませ

      削除
  2. この方法は面白いですね!使わせてもらいます。
    以下、余談です。
    マクロ型定数は各項(x,y,z)を括弧で括っておいたほうがいいですよ。xに足し算を入れてしまうと演算順序がおかしくなります。

    それとどうでもいいことですがOFFCETではなく、OFFSETではないでしょうか?

    返信削除
    返信
    1. コメントありがとうございます!どうぞご自由にお使いくださいませw

      ご指摘ありがとうございますっ。マクロの()は普段はC#を使っているがゆえ、気づきませんでした。スペルミス、お恥ずかしい限りです…w 2つとも修正いたしました!

      削除

コメントを投稿

このブログの人気の投稿

初めてのC# -メモ帳でも作ってみる?-

【ファイル偽装】zipとしてもjpgとしても扱えるファイル

Javaにおいて引数付でスレッドを走らせる