4次元配列の動的確保

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はね

4次元配列の動的確保

#1

投稿記事 by はね » 16年前

タイトルの通りなのですが、4次元配列の各要素を動的に確保したいです。

要素としましてはVolume Frame Y X があります。
VolumeがFrameを含んでおり、Frameの縦横サイズがYXです。
各値はそれぞれ受け取っています。

すべてint型です。

ようするにint Array[Volume][Frame][Y][X]のように各要素の大きさを設定できれば良いです。


一応いろいろ調べ、以下のように作ってみたのですが、
各要素をsizeofで調べると4バイトなど1つしか確保できていないようでした。

どうかご教示ください。
int ****Array = new int ***[Volume];
	for(int k=0;k<Volume;k++){
		Array[k] = new int**[Frame] ;
		for(int j=0;j<=Frame;j++){
			Array[k][j] = new int*[y];
			for(int i=0;i<=y;i++){
				Array[k][j] = new int[x];
			}
		}
	}
for(int l=0;l<Volume;l++){
		for(int k=0;k<Frame;k++){
			for(int j=0;j<y;j++){
				delete [/url] vv[[/url][k][j];
			}
		}
	}
	for(int l=0;l<Volume;l++){
		for(int k=0;k<Frame;k++){
			delete [/url] vv[[/url][k];
		}
	}
	for(int l=0;l<Volume;l++){	
		delete [/url] vv[[/url];
	}
	delete [/url] vv;

box

Re:4次元配列の動的確保

#2

投稿記事 by box » 16年前

> 各要素をsizeofで調べると4バイトなど1つしか確保できていないようでした。

ということは、提示された断片部分だけでなく、
ひととおり動くコードを書かれたのですね?

sizeofで調べた箇所を含め、書かれたコードの全体を
見せていただけますか?

はね

Re:4次元配列の動的確保

#3

投稿記事 by はね » 16年前

box様

申し訳ありませんが、ソースは公開することができないのでかなり省略させて頂きました。
すみません。


void Calc(){	
	int ****Array = new int ***[Volume];
	for(int k=0;k<Volume;k++){
		Array[k] = new int**[Frame] ;
		for(int j=0;j<Frame;j++){
			Array[k][j] = new int*[y];
			for(int i=0;i<y;i++)
				Array[k][j] = new int[x];
		}
	}
	
	for(int l=minVol;l<maxVol;l++){
		for(int k=minFrame;k<=maxFrame;k++){
			for(int j=miny;j<=maxy;j++){
				for(int i=minx;i<=maxx;i++){
                                 /*
                                         ijklで計算
                         ここの4重forはArrayの要素と同じ数だけ回ります。
                                  */ 				
					Array[[/url][zcounte[/url][ycounte[/url][xcounte[/url] = 計算結果;
					xcounter++;
				}
				ycounter++;
				xcounter=0;
			}
			zcounter++;
			ycounter=0;
		} 
		zcounter=0;
	}

       
	for(int l=0;l<Volume;l++){
		for(int k=0;k<Frame;k++){
			for(int j=0;j<y;j++){
				delete [/url] vv[[/url][k][j];
			}
		}
	}
	for(int l=0;l<Volume;l++){
		for(int k=0;k<Frame;k++){
			delete [/url] vv[[/url][k];
		}
	}
	for(int l=0;l<Volume;l++){	
		delete [/url] vv[[/url];
	}
	delete [/url] vv;
}

はね

Re:4次元配列の動的確保

#4

投稿記事 by はね » 16年前

sizeofが抜けてました。

cout << sizeof(vv) / sizeof(vv[0]) <<endl;
cout << sizeof(vv) / sizeof(vv[0][0]) <<endl;
cout << sizeof(vv) / sizeof(vv[0][0][0]) <<endl;
cout << sizeof(vv) / sizeof(vv[0][0][0][0]) <<endl;

これを
int ****Array = new int ***[Volume];
	for(int k=0;k<Volume;k++){
		Array[k] = new int**[Frame] ;
		for(int j=0;j<Frame;j++){
			Array[k][j] = new int*[y];
			for(int i=0;i<y;i++)
				Array[k][j] = new int[x];
		}
	}


のすぐ下に書きました。

Justy

Re:4次元配列の動的確保

#5

投稿記事 by Justy » 16年前


>各要素をsizeofで調べると4バイトなど1つしか確保できていないようでした

 ポインタに sizeofは……。



>4次元配列の各要素を動的に確保したいです

 これ、4次元配列である必要はありますか?
 せっかく C++なのでもう少しなんとかしましょう。

 単純に考えても、XとYのところは一次元にしておいて、
XとY値を指定してアクセスする関数があれば事足りますし、
Volumeや Frameはクラスにするとか、適当なコンテナを使って typedefしておけば
それぞれに意味を持たせられますし、途中で例外が発生してもメモリリークしません。

[color=#d0d0ff" face="monospace]
#include <vector>
#include <iostream>

class Frame
{
public:
Frame(int x, int y) : m_X(x), m_Y(y)
{
m_Data.assign(x*y, 0);
}

int get(int x, int y) const { return m_Data.at(y * m_X + x); }
void set(int x, int y, int val) { m_Data.at(y * m_X + x) = val; }

private:

int m_X, m_Y;
std::vector<int> m_Data;
};

typedef std::vector<Frame> Volume;
typedef std::vector<Volume> VolumeArray;

int main()
{
VolumeArray volArray;
volArray.assign(5, Volume(10, Frame(100, 100)));

volArray[1][2].set(1, 5, 10);
std::cout << volArray[1][2].get(1, 5) << std::endl;

Frame &frame = volArray[1][2];
std::cout << frame.get(1, 5) << std::endl;

return 0;
}
[/color]

閉鎖

“C言語何でも質問掲示板” へ戻る