ページ 1 / 1
4次元配列の動的確保
Posted: 2009年5月18日(月) 20:24
by はね
タイトルの通りなのですが、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;
Re:4次元配列の動的確保
Posted: 2009年5月18日(月) 20:47
by box
> 各要素をsizeofで調べると4バイトなど1つしか確保できていないようでした。
ということは、提示された断片部分だけでなく、
ひととおり動くコードを書かれたのですね?
sizeofで調べた箇所を含め、書かれたコードの全体を
見せていただけますか?
Re:4次元配列の動的確保
Posted: 2009年5月18日(月) 21:34
by はね
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次元配列の動的確保
Posted: 2009年5月18日(月) 21:38
by はね
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];
}
}
のすぐ下に書きました。
Re:4次元配列の動的確保
Posted: 2009年5月18日(月) 22:45
by Justy
>各要素を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]