ورود

View Full Version : سوال در مورد ساخت آرایه ای از آرایه ها به صورت دینامیک .



clover
جمعه 12 تیر 1388, 18:06 عصر
برای کار با ماتریس دو بعدی معمولا از آرایه دو بعدی استفاده میشه که محدودیت هایی داره از جمله اینکه باید طول آرایه را در ابتدا مشخص کرد .
من برای ساخت یک ماتریس دوبعدی (با تعیین طول و عرض در طول برنامه ) از عملگر new استفاده کردم و آرایه ای متشکل از آرایه ها به شکل زیر تعریف کردم .


int row, col;
cin>>row>>col;

int **array = new int * [row];
for (int i=0; i<col; i++)
{
array[i] = new int [col];
}

حالا به راحتی می تونم به شکل زیر با عناصر آرایه array کار کنم .


for (int i=0; i<row; i++)
{
for (int j=0; j<col; j++)
{
cin>>array[i][j];
}
}

for (int i=0; i<row; i++)
{
for (int j=0; j<col; j++)
{
cout<<array[i][j];
}
}

سوال اولم اینه که آرایه array یه آرایه تک بعدی اما من با دو اندیس ازش استفاده میکنم و کامپایلر نه تنها از اون ایراد نمیگیره بلکه به صورت اتوماتیک به خانه های آرایه های داخل این آرایه اشاره می کنه ، می خوام بدونم مکانیزم این کار به چه صورتی هست ، یعنی کامپایلر این دو اندیس رو چطور استفاده می کنه .
سوال دوم اینه که چطور می تونم حافظه ای را که تخصیص دادم به طور صحیح آزاد کنم .

آیا اصلا این کار مجاز است ؟ یا من بدون اینکه بدانم دارم محتویات حافظه را رونویسی می کنم ؟

tdkhakpur
شنبه 13 تیر 1388, 10:50 صبح
سلام

cin>>array[i][j];
کد زیر اشتباه شما فضایی برای دریافت ورودی ندارید

clover
شنبه 13 تیر 1388, 11:52 صبح
سلام

cin>>array[i][j];
کد زیر اشتباه شما فضایی برای دریافت ورودی ندارید

مشکل منم همینه دوست عزیز ، این برنامه به نظر مشکل دار میاد اما به درستی کار میکنه . بدون هیچ خطایی !!! می خوام بدونم کار من مجازه ؟ یا دارم حافظه رو رونویسی میکنم .

clover
شنبه 13 تیر 1388, 11:55 صبح
اصلا اگه میشه راهنمایی کنید که چطور می تونم یه آرایه دوبعدی را به صورت دینامیک ایجاد کنم ؟
با عملگر new فقط می تونم آرایه یه بعدی ایجاد کنم . و قتی دو تا اندیس می دم اررور میده .

cups_of_java
شنبه 13 تیر 1388, 16:17 عصر
برای کار با ماتریس دو بعدی معمولا از آرایه دو بعدی استفاده میشه که محدودیت هایی داره از جمله اینکه باید طول آرایه را در ابتدا مشخص کرد .
من برای ساخت یک ماتریس دوبعدی (با تعیین طول و عرض در طول برنامه ) از عملگر new استفاده کردم و آرایه ای متشکل از آرایه ها به شکل زیر تعریف کردم .


int row, col;
cin>>row>>col;

int **array = new int * [row];
for (int i=0; i<col; i++)
{
array[i] = new int [col];
}حالا به راحتی می تونم به شکل زیر با عناصر آرایه array کار کنم .


for (int i=0; i<row; i++)
{
for (int j=0; j<col; j++)
{
cin>>array[i][j];
}
}

for (int i=0; i<row; i++)
{
for (int j=0; j<col; j++)
{
cout<<array[i][j];
}
}سوال اولم اینه که آرایه array یه آرایه تک بعدی اما من با دو اندیس ازش استفاده میکنم و کامپایلر نه تنها از اون ایراد نمیگیره بلکه به صورت اتوماتیک به خانه های آرایه های داخل این آرایه اشاره می کنه ، می خوام بدونم مکانیزم این کار به چه صورتی هست ، یعنی کامپایلر این دو اندیس رو چطور استفاده می کنه .
سوال دوم اینه که چطور می تونم حافظه ای را که تخصیص دادم به طور صحیح آزاد کنم .

آیا اصلا این کار مجاز است ؟ یا من بدون اینکه بدانم دارم محتویات حافظه را رونویسی می کنم ؟

کار شما درسته! برای درست کردن آرایه ای از آرایه ها به طور پویا همین روش مورد استفاده می شه. مشکلی هم نداره. موقع جمع کردن حافظه هم از این کد استفاده کنید:



for (int i=0; i<col; i++) {
delete[] array[i];
}
delete[] array;

tdkhakpur
شنبه 13 تیر 1388, 16:40 عصر
سلام
ولی سورس قبلی شما به این شکل بود:اشتباه:ا


int ***array = new int * [row];