9차원 배열.

suncrunch의 이미지

안녕하세요.
9차원 배열을 사용하고 싶은데요.
0xc00000fd - stack overflow error가 발생해서요.
local memory에 저장이 안돼는 것 같아서
new를 통해 할당하려고 하는데 error가 발생해서 질문 드립니다.

9차원 배열 선언이 가능한가요?

class A {
int a,b;
}

A m_A[2][2][2][2][2][2][2][2][2];

이런식으로가 가능한건지 궁금합니다.
아니면

A *********m_A=new A[2][2][2][2][2][2][2][2][2];

이렇게 선언이 가능한지도요.

혹시 경험 있으신 분 답변 부탁드립니다.
감사합니다.

chadr의 이미지

무엇을 하시는데 9차원이 되는 배열이 필요하신가요?
다른 해결 방법을 찾아보시라고 권해드리고 싶네요..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

klper의 이미지

A m_A[2][2][2][2][2][2][2][2][2];

이건 가능하고요

2번째껀

저렇게 하시면 안돼고요..

할당하고 다시 또 안에 할당해야해요..

점점 세분화되서 쪼개지는 것이기 때문에..

동적할당으로는 저렇게 못할껄요...

일단 안돼서...

aerockh2의 이미지

무식하게 아래와 같이 하면 안될 껀 없습니다만....
template이나... void *를 써서 좀더 generic하게 할 수 있는 방법이 없을까요 ?

아래는 그냥 날로 코딩한거네요.
9차원까지는 귀찮아서 안해봤지만 5차가 SIZE 10로 했는데 메모리 엄청나게 잡아 먹는군요.
10에 5승이니까 헐-_- 3 word X 10 ^ 5승만큼 메모리를 잡아먹네요.
장난 아닙니다.

	Information ******p3 = new Information *****[SIZE];
 
	for ( int i5 = 0 ; i5 < SIZE ; ++i5)
	{
		p3[i5] = new Information ****[SIZE];
		for (int i4 = 0 ; i4 < SIZE ; ++i4 )
		{
			p3[i5][i4] = new Information ***[SIZE];
			for ( int i3 = 0 ; i3 < SIZE ; ++i3)
			{
				p3[i5][i4][i3] = new Information **[SIZE];
				for ( int i2 = 0 ; i2 < SIZE ; ++i2)
				{
					p3[i5][i4][i3][i2] = new Information *[SIZE];
					for ( int i1 = 0 ; i1 < SIZE ; ++i1)
					{
						p3[i5][i4][i3][i2][i1] = new Information [SIZE];
						p3[i5][i4][i3][i2][i1]->x = i3;
						p3[i5][i4][i3][i2][i1]->y = i5;
						p3[i5][i4][i3][i2][i1]->z = i4;
					}
				}
			}
		}
	}

STL Vector를 이용해 봤습니다.

typedef std::vector<Information> Information1D;
typedef std::vector<Information1D> Information2D;
typedef std::vector<Information2D> Information3D;
typedef std::vector<Information3D> Information4D;
typedef std::vector<Information4D> Information5D;
typedef std::vector<Information5D> Information6D;
typedef std::vector<Information6D> Information7D;
typedef std::vector<Information7D> Information8D;
typedef std::vector<Information8D> Information9D;
 
Information9D vector9D(SIZE,
		Information8D(SIZE,
		Information7D(SIZE,
		Information6D(SIZE,
		Information5D(SIZE,
		Information4D(SIZE,
		Information3D(SIZE,
		Information2D(SIZE,
		Information1D(SIZE)
		) // Information2D
		) // Information3D
		) // Information4D
		) // Information5D
		) // Information6D
		) // Information7D
		) // Information8D
		); // Information9D 
 
Information4D vector4D(SIZE,
		Information3D(SIZE,
		Information2D(SIZE,
		Information1D(SIZE)
		) // Information2D
		) // Information3D
		); // Information4D
vector4D[1][1][1][1].x = 0;

9단계에는 template인자 명의 길이 제한에 훌쩍 넘어 버려 컴파일 자체가 안됩니다.
4단계는 잘되는 군요.

먼가 멋진게 없을까요 ?

klara의 이미지

9차원짜리 배열을 쓰는 거 그자체로 이미 멋지지 않은것 같은데요-_-;

madman93의 이미지

무의미하기는 하지만..

재미있는 내용이네요 ㅋㅋㅋ

---------------------------------------------
svn + trac + my project --> success ???
---------------------------------------------

---------------------------------------------
git init
git add .
git commit -am "project init"
---------------------------------------------

neogeo의 이미지

template < typename T,int SIZE,unsigned int n > struct n_d_array
{
	n_d_array < T,SIZE,n-1 > data[SIZE];
	static const unsigned int dimension = n;
	static const unsigned int size = SIZE;
 
	n_d_array < T,SIZE,n-1 > & operator[](unsigned int index) { return data [ index ] ; }
};
 
template < typename T,int SIZE > struct n_d_array < T,SIZE,1 >
{
	T data[SIZE];
	static const unsigned int dimension = 1;
	static const unsigned int size = SIZE;
 
	T& operator[](unsigned int index) { return data [ index ] ; }
};

사용법

struct A
{
	int x;
};
 
...
 
typedef n_d_array < A, 2, 9 > A_array_9d; /* A[2][2][2][2][2][2][2][2][2] type defined */ 
A_array_9d a;
 
a[1][0][1][1][0][0][0][0][0].x = 0;

단점은 항상 SIZE 가 일정한 중첩 array 밖에 만들지 못 합니다.

만약 A[10][2][10][5].. 이런게 선언하고 싶으시면 가능할지.. ( 안에 size 나 dimention 을 넣어두었지만, 임의의 저런 모양의 array 는 될지 저조차도 의문이군요. )

Neogeo - Future is Now.

Neogeo - Future is Now.

aerockh2의 이미지

이렇게 표현하고 싶어서 고민 중이었는데....
아마 물리학 그 언저리에서 실제로 쓰이는 것 같아(?)
고민했었는데...

제가 몰랐던 핵심이 바로

template < typename T,int SIZE > struct n_d_array < T,SIZE,1 >

이렇게 끝을 알려줘야 재귀적인 template의 끝이 되는군요.
무자게 배워갑니다.
질문하신 분보다 제가 더 감사하네요.

아.......

neogeo의 이미지

template 에는 더 재미있는 세계가 많답니다.

C++ template meta programming 과 modern c++ design 을 꼭 한번 보시기 바랍니다.

Neogeo - Future is Now.

Neogeo - Future is Now.

mandami의 이미지

그냥

int *array_2_9 = (int*)malloc( 2*2*2*2*2*2*2*2*2 );
 
int *get_array_2_9(int p0,int p1, int p2,int p3,int p4,int p5,int p6,int p7,int p8){
     return array+(p0<<0)+(p1<<1)+(p2<<2)+(p3<<3)+(p4<<4)+(p5<<5)+(p6<<0)+(p7<<7)+(p8<<8);
}

이렇게 사용하면 안될까요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.