PDA

View Full Version : سوال: در مورد آرایه ها



kavehmj
چهارشنبه 29 مهر 1394, 17:17 عصر
دوستان یه سوال داشتم.
می شه یک آرایه ی دوبعدی رو در سلول های یک آرایه ی دو بعدی دیگر ریخت؟

یه چیزی مثل شکل زیر:

http://img.upload724.com/images/88146140969244002681_thumb.jpg (http://img.upload724.com/viewer.php?file=88146140969244002681.jpg)

که آرایه های دو بعدی 2x3 در هر سلول یک آرایه ی دو بعدی 4x3ریخته شده.


اگر می شه، ممنون می شم که نحوه اختصاص دادنش رو هم برام توضیح بدید.

با تشکر

AliBahar
چهارشنبه 29 مهر 1394, 20:28 عصر
نمی دونم چقدر جوابم درسته. اما فکر کنم بشه یک آرایه دوبعدی تعریف کرد که هر عنصرش یک پوینتر باشه و هر پوینتر به یک آرایه دوبعدی دیگه اشاره میکنه. اینکه چه جوری میشه پوینتر به آرایه دوبعدی تعریف کرد از این لینک استفاده کن:
http://stackoverflow.com/questions/14808908/c-pointer-to-two-dimensional-array

Ananas
جمعه 01 آبان 1394, 22:21 عصر
برای تخصیص حافظه میتونید به این شکل عمل کنید:

int main()
{
int v_2x2_2x2[4][3][2][3];
for (int J = 0; J < 4; J++)
{
for (int I = 0; I < 3; I++)
{
for (int j = 0; j < 2; j++)
{
for (int i = 0; i < 3; i++)
{
std::cout << v_2x2_2x2[J][I][j][i];
std::cout << " ";
};
std::cout << endl;
};
std::cout << endl;
};
std::cout << endl;
};

getchar();
getchar();
return 0;
};

و یا با وکتور کار کنید:


int main()
{
vector< vector< vector< vector< int > > > > v_2x2_2x2;
v_2x2_2x2.resize(4);
for (int J = 0; J < (int)v_2x2_2x2.size(); J++)
{
v_2x2_2x2[J].resize(3);
for (int I = 0; I < (int)v_2x2_2x2[J].size(); I++)
{
v_2x2_2x2[J][I].resize(2);
for (int j = 0; j < (int)v_2x2_2x2[J][I].size(); j++)
{
v_2x2_2x2[J][I][j].resize(3);
};
};
};

for (int J = 0; J < (int)v_2x2_2x2.size(); J++)
{
for (int I = 0; I < (int)v_2x2_2x2[J].size(); I++)
{
for (int j = 0; j < (int)v_2x2_2x2[J][I].size(); j++)
{
for (int i = 0; i < (int)v_2x2_2x2[J][I][j].size(); i++)
{
std::cout << v_2x2_2x2[J][I][j][i];
std::cout << " ";
};
std::cout << endl;
};
std::cout << endl;
};
std::cout << endl;
};

getchar();
getchar();
return 0;
}

ولی به نظر بنده در این شرایط از کلاس استفاده کنید. کنترلش راحت تره. مثال:


#include <stdio.h>
#include <iostream.h>
using namespace std;

#include <stdlib.h>

class MyArray2x2
{
private:
int __Width;
int __Height;
int * __p_Data;

int * __p_GetIJ(const int I, const int J)
{
if ((I < 0) || (I >= __Width) ||
(J < 0) || (J >= __Height)) // Out of Index Range
return NULL;
else
return &__p_Data[J * __Width + I];
};
public:
MyArray2x2(const int Width, const int Height)
{
__Width = Width;
__Height = Height;
__p_Data = (int *)malloc(sizeof(int) * __Width * __Height);
};
int GetWidth() { return __Width; };
int GetHeight() { return __Height; };
int GetIJ(const int I, const int J)
{
int * p = __p_GetIJ(I, J);
if (p == NULL) // Out of Index Range
return 0;
else
return *p;
};
bool SetIJ(const int I, const int J, const int Value)
{
int * p = __p_GetIJ(I, J);
if (p == NULL) // Out of Index Range
return false;
else
*p = Value;
return true;
};
};

class MyArray2x2Of2x2
{
private:
int __Width;
int __Height;
MyArray2x2 ** __p_Data;

MyArray2x2 * __p_GetIJ(const int I, const int J)
{
if ((I < 0) || (I >= __Width) ||
(J < 0) || (J >= __Height)) // Out of Index Range
return NULL;
else
return __p_Data[J * __Width + I];
};
public:
MyArray2x2Of2x2(
const int Width,
const int Height,
const int subWidth,
const int subHeight)
{
__Width = Width;
__Height = Height;
__p_Data = (MyArray2x2 **)malloc(sizeof(MyArray2x2 *) * __Width * __Height);
int count = __Width * __Height;
for (int i = 0; i < count; i++)
{
__p_Data[i] = new MyArray2x2(subWidth, subHeight);
};
};
int GetWidth() { return __Width; };
int GetHeight() { return __Height; };

MyArray2x2 * ArrayIJ(const int I, const int J)
{
MyArray2x2 * p = __p_GetIJ(I, J);
if (p == NULL) // Out of Index Range
return 0;
else
return p;
};
};


int main()
{
MyArray2x2Of2x2 * p_2x2_2x2 = new MyArray2x2Of2x2(3, 4, 3, 2);
for (int J = 0; J < p_2x2_2x2->GetHeight(); J++)
{
for (int I = 0; I < p_2x2_2x2->GetWidth(); I++)
{
for (int j = 0; j < p_2x2_2x2->ArrayIJ(I, J)->GetHeight(); j++)
{
for (int i = 0; i < p_2x2_2x2->ArrayIJ(I, J)->GetWidth(); i++)
{
std::cout << p_2x2_2x2->ArrayIJ(I, J)->GetIJ(i, j);
std::cout << " ";
};
std::cout << endl;
};
std::cout << endl;
};
std::cout << endl;
};

getchar();
getchar();
return 0;
}




دو تا کلاس هست که یکی آرایه ای دو بعدی از int هست و اونیکی آرایه ای دو بعدی از کلاس اول.
و البته میتونید از vector کمک بگیرید. مثال:

class MyArray2x2
{
private:
int __Width;
int __Height;
vector< vector< int > > __vec_2x2;

int * __p_GetIJ(const int I, const int J)
{
if ((I < 0) || (I >= __Width) ||
(J < 0) || (J >= __Height)) // Out of Index Range
return NULL;
else
return &__vec_2x2[J][I];
};
public:
MyArray2x2(const int Width, const int Height)
{
__Width = Width;
__Height = Height;
__vec_2x2.resize(__Height);
for (int j = 0; j < __Height; j++)
{
__vec_2x2[j].resize(__Width);
};
};
int GetWidth() { return __Width; };
int GetHeight() { return __Height; };
int GetIJ(const int I, const int J)
{
int * p = __p_GetIJ(I, J);
if (p == NULL) // Out of Index Range
return 0;
else
return *p;
};
bool SetIJ(const int I, const int J, const int Value)
{
int * p = __p_GetIJ(I, J);
if (p == NULL) // Out of Index Range
return false;
else
*p = Value;
return true;
};
};

class MyArray2x2Of2x2
{
private:
int __Width;
int __Height;
vector< vector< MyArray2x2 * > > __vec_2x2;

MyArray2x2 * __p_GetIJ(const int I, const int J)
{
if ((I < 0) || (I >= __Width) ||
(J < 0) || (J >= __Height)) // Out of Index Range
return NULL;
else
return __vec_2x2[J][I];
};
public:
MyArray2x2Of2x2(
const int Width,
const int Height,
const int subWidth,
const int subHeight)
{
__Width = Width;
__Height = Height;
__vec_2x2.resize(__Height);
for (int j = 0; j < __Height; j++)
{
__vec_2x2[j].resize(__Width);
};
for (int j = 0; j < __Height; j++)
{
for (int i = 0; i < __Width; i++)
{
__vec_2x2[j][i] = new MyArray2x2(subWidth, subHeight);
};
};
};
int GetWidth() { return __Width; };
int GetHeight() { return __Height; };

MyArray2x2 * ArrayIJ(const int I, const int J)
{
MyArray2x2 * p = __p_GetIJ(I, J);
if (p == NULL) // Out of Index Range
return 0;
else
return p;
};
};