PDA

View Full Version : سوال: تعداد آرایه یا سایز آرایه؟



mahsafar
پنج شنبه 19 خرداد 1390, 12:23 عصر
#include <iostream>
using namespace std;
void main(void)
{int a[1],i;
for (i=0; i<40; i++)
{ a[i]=i;
cout<<a[i]<<"\n";
}
cin>>i;
}

این برنامه از عدد 0 تا 39 رو چاپ می کنه .در صورتیکه ما اگر عدد یک رو که در تعریف آرایه به کار بردیم در نظر بگیریم فقط باید یک آرایه رو چاپ کنه
اگر هم اون عدد یک ,سایز آرایه هست منظور از یک چیست ؟
یک بیت یک بایت و...؟
چون در این برنامه اگر i بزرگتر از 40 بشه دیگه برنامه جواب نمیده؟
سایز عددهای بزرگتر از 40 چه تغئیری میکنه؟

mahsafar
پنج شنبه 19 خرداد 1390, 17:04 عصر
در واقع یک عدد مرموز 39 این وسط وجود داره
شما اگر 100 آرایه بخوای داشته باشی؛ کافیه 61 آرایه تعریف کنی تا 100 آرایه داشته باشی
یا مثلا برای 339 آرایه؛ تعریف 300 آرایه کافیه
حالا این عدد 39 چی هست بنده نمی دونم

quiet_programmer
پنج شنبه 19 خرداد 1390, 19:39 عصر
با سلام.


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


اگر هم اون عدد یک ,سایز آرایه هست منظور از یک چیست ؟یعنی برای آریه من یک عنصر از نوع int در حافظه هیپ رزرو کن.


یک بیت یک بایت و...؟یک int


چون در این برنامه اگر i بزرگتر از 40 بشه دیگه برنامه جواب نمیده؟jتو ماشینهای مختلف این عدد فرق میکنه. اگه سیستمت رو دوباره راه اندازی کنی این عدد هم عوض میشه. ببین حالا چرا بره تو بیشتر از 40 جواب نمیده بخاطر اینه که احتمالا وقتی میخوای تو این ایندکس چیزی بنویسی یکی از دادهای مهم که قبلا تو حافظه هیپ بوده و به اجرای برنامه کمک میکنه دچار مشکل میشه.


سایز عددهای بزرگتر از 40 چه تغئیری میکنه؟ اندازه اعداد در بازه 32768- تا 32767+ هیچ تغییری نمیکنه و همون 2 بایتی هستن.


در واقع یک عدد مرموز 39 این وسط وجود دارهالبته از نظر شما


شما اگر 100 آرایه بخوای داشته باشی؛ کافیه 61 آرایه تعریف کنی تا 100 آرایه داشته باشی

یا مثلا برای 339 آرایه؛ تعریف 300 آرایه کافیه

این کار اصلا شدنی نیست و اشتباهه (خیلی خطرناکه حسن!)

mahsafar
پنج شنبه 19 خرداد 1390, 19:54 عصر
تو ماشینهای مختلف این عدد فرق میکنه. اگه سیستمت رو دوباره راه اندازی کنی این عدد هم عوض میشه. ببین حالا چرا بره تو بیشتر از 40 جواب نمیده بخاطر اینه که احتمالا وقتی میخوای تو این ایندکس چیزی بنویسی یکی از دادهای مهم که قبلا تو حافظه هیپ بوده و به اجرای برنامه کمک میکنه دچار مشکل میشه
بعد از ریستارت کردن تغئیری نکرد
میشه بگید تو کامپیوتر شما این عدد چنده؟

quiet_programmer
پنج شنبه 19 خرداد 1390, 20:22 عصر
این عدد 43.

hi.alir
پنج شنبه 19 خرداد 1390, 20:53 عصر
تو ++C یه Operator داریم که اینه []. برای آرایه ها معمولا این عملگر به شکل زیر تعریف میشه:


type & operator[](const unsigned int index)
{
return *(this + sizeof(*this)*index);
}


وقتی شما برای مثال یک آرایه ی دو عضوی ایجاد می کنید یعنی در جایی از حافظه به اندازه ی دو عضو از نوع مربوطه حافظه رزرو میشه. با توجه به کد بالا کسی نگاه نمی کنه که ببینه index داده شده بیشتر از تعداد رزرو شده هست یا نه. فقط از آدرس شروع به اندازه ضرب اندازه نوع در اندیس داده شده جلو میره و برمیگردونه. بنابراین وقتی در آرایه ی دو عضوی، شما از عضو سوم استفاده می کنید در حقیقت دارید با حافظه به اندازه ی 3 خونه جلوتر از آدرس شروع آرایه کار می کنید. حالا اونجا می تونه به برنامه ی شما تعلق داشته باشه که ممکنه اطلاعاتتون بپره و یا نداشته باشه و سیستم عامل برنامه رو متوقف کنه. البته اتفاق هایی که تو stack یا heap یا ... می افته بسته به سیستم عامل و نوع کامپایلر فرق داره ولی در کل کار خطرناکی هست. بیشتر کلاس هایی که برای آرایه ها نوشته میشند اندیس رو کنترل می کنند تا از سایز رزرو شده بزرگتر نشه ولی آرایه های پیش فرض ++C اینکار رو انجام نمی دند و طبیعی هم هست. چون آرایه ها تو ++C فقط یه اشاره هستند و عملگر [] برای تمام انواع داده ی اصلی از کد بالا استفاده می کنه. پس در واقع حقیقتا کسی آرایه در خود ++C درست نکرده، بلکه اومدن ترکیب این دو قابلیت رو اسمش رو گزاشتند تعریف و استفاده از آرایه تو ++C!

اعدادی هم که تو بالا شما به دست آوردید برای این ثابت هستند که آرایه ی شما تو Stack هست ولی در Heap دیگه چنین نخواهد بود و اون عدد هر نانو ثانیه ممکنه تغییر کنه.