PDA

نسخه کامل مشاهده نسخه کامل : قرار دادن عدد در استرینگ در c++



vahid-p
27-05-2012, 20:01
مشکل من اینه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

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

خلاصه به علت بزرگ بودن آرایه تا 100000 درایه قبول میکنه ولی یک میلیون نه. از char هم نمیشه استفاده کرد چون از 9 که بیشتر شد دو رقمی میشه و مشکلات خاص خودش رو خواهد داشت.

چیکار کنم؟

vahid-p
28-05-2012, 14:34
کسی نیست جواب بده؟
حالا این هیچی. کسی میتونه بگه چطور یه آرایه از نوع integer با 1 میلیون درایه تعریف کنیم؟ وقتی تعریف میکنم برنامه وقتی کامپایل و اجرا میشه هنگ میکنه.
چیکار کنم؟
این هنگ میکنه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

senaps
28-05-2012, 17:39
درود....
میشه بپرسم که این یک میلیون داده برا چی میخواد بره تو یه ارایه؟!؟ اخه شما برنامه رو که ببندی، همش پریده!!!! اگرم میخوای بریزی تو دیتابیس که دیگه....!!!!

به هر صورت، Long Int مقدار بزرگتر از اینت هستش... لانگ اینت ۳۲ بیتی هستش و تا ۲ میلیارد عدد رو میتونه بگیره!!

god of war 2
28-05-2012, 21:59
آرایه یک میلیون عضوی از نوع int که 32 bit اندازه هر عنصر اون (البته در سیستم عامل های 32 بیتی) هست فقط 3 مگابایت از حافظه رو اشغال میکنه.
فقط تنها مشکلی که در کدهای شما هست روش گرفتن حافظه هست.معمولا در این جور مواقع باید بصورت داینامیک از سیستم حافظه بگیرید.
قطعه کد زیر یک نمونه از این روش هست.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

senaps
28-05-2012, 22:32
انساین اینت با لانگ اینت چه تفاوتی دارن؟
انساین منفی نمیگیره نه؟ و لانگ اینت منفی میگیره.........اطلاعی دارین که لانگ اینت چقد حافظه میگیره؟!

p d
29-05-2012, 09:31
انساین اینت با لانگ اینت چه تفاوتی دارن؟
انساین منفی نمیگیره نه؟ و لانگ اینت منفی میگیره
همینطوره.

اطلاعی دارین که لانگ اینت چقد حافظه میگیره؟!
معمولا به این شکل است(تاکیید بر معمولا) که long مقدار حافطه رو 2برابر میکنه.
مثلا اگه کامپایلر شما برای int ا2 بایت در نطر بگیره .برای long int میشه 4 بایت.
البته کامپالر های جدید تر 4 بایت برا Int در نطر میگیرند.

p d
29-05-2012, 09:36
مشکل من اینه :

میگه نوع کاراکتر مشکل داره. و از طرفی چون تعداد اعدادی که لازم دارم ذخیره کنم بیشتر از یک میلیون عدده از آرایه نوع دیگه نمیشه استفاده کرد. وگرنه بهتر بود حتی از آرایه عددی استفاده میکردم.
چون من میخوام اندیس های یک آرایه رو در آرایه دیگری ذخیره کنم.
خلاصه به علت بزرگ بودن آرایه تا 100000 درایه قبول میکنه ولی یک میلیون نه. از char هم نمیشه استفاده کرد چون از 9 که بیشتر شد دو رقمی میشه و مشکلات خاص خودش رو خواهد داشت.


اولا long double عددی بسیار بزرگتر از این چیزا رو ذخیره میکنه.
دوما اگه عددتون خیلی خیلی بزرگه معمولا از string استفاده میکنن.
سوما شما داری ارایه ای از Int به اندازه ی 100000 تعریف میکنی . میشه 100000 * 4 بایت که تو هر 4 بایت میخوای 1 عدد 1 رقمی بریزی ؟ چه کاریه واقعا ؟

vahid-p
29-05-2012, 14:25
ببینید مشکل در int یا long long int نیست که. چون اعدادم اونقدرا زیاد نمیشن فوقش تا 1 میلیون (شش رقم ). مهم تعداد عناصر آرایست که P d درست میفرمایند و حافظه زیادی رو میبره. خب برای همین هم میگم که برنامه هنگ میکنه.
اما راه حلی ندادین بهم.
منم خودم گفتم که برای اینکه بتونم یک میلیون عنصر رو تو یه متغیر ذخیره کنم، متغیرم رو از نوع String انتخاب میکنم. اما مشکل اینه که باید بتونم از هر عنصر یک عدد حداکثر شش رقمی بگیرم. که کار کردن باهاش راحت باشه. یکی از راهاش تبدیل عدد به رشته و رشته به عدده که مشکلش رو گفتم که از نوع char میشه استفاده کرد ولی از string نه. از char استفاده کنم که باز مشکلش اینجاست که هر عنصر میشه یک عدد یک رقمی نه یک عدد شش رقمی. پس مجبورم از String استفاده کنم که استرینگ برای کار با itoa و atoi مشکل داره. تازه اینا هم کلی زمان بره برای اجراش(حتی اگه براش تابع بنویسم تا خیلی برنامه پیچیده نشه ولی تو اجراش باز زمان بیشتری رو میبره ).
چون برای اجرای این برنامه سنگین حداکثر دو ثانیه وقت دارم.

اگه امکان پذیر نیست بگید تا به فکر الگوریتم دیگه ای باشم.
ممنون

vahid-p
29-05-2012, 14:43
اینو که کپی کردم هنگ نکرد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

ولی میشه در مورد ساختار و تفاوتش با حالت های معمولی توضیح بدین؟

god of war 2
30-05-2012, 00:41
ولی میشه در مورد ساختار و تفاوتش با حالت های معمولی توضیح بدین؟
ببینید زمانی که یک برنامه برای اجرا بارگزاری میشه در یک پشته (Stack) قرار میگیره. این پشته بسته به نوع سیستم عامل دارای حافظه محدودی هست(در حد چند مگابایت).وقتی شما یک آرایه از متغییر های اتوماتیک مثل زیر

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تعریف میکنید این متغییر از حافظه پشته مربوط به برنامه استفاده میکنه همونطور که گفتم این حافظه محدود هست و ممکنه به اندازه کافی فضا برای آرایه شما نداشته باشه و در نهایت اجرا با مشکل مواجه میشه.
ولی زمانی که شما از حافظه heap برای ایجاد آرایتون استفاده (heap-allocated) میکنید مثل زیر:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دیگر محدودیت خاصی ندارید تنها محدودیت شما مقدار حافظه فیزیکی سیستمتون (فضای آزاد RAM) هست و میتونید به اندازه کل فضای آزاد RAM تخصیص حافظه انجام بدید.
فاکتور ها و مسائل فنی زیادی با توجه به نوع برنامه وجود داره که تعیین میکنه چه موقع از فضای Heap استفاده بشه و چه موقع از فضای Stack و توضیحش از وقت و حوصله بنده خارج هست.

vahid-p
30-05-2012, 16:39
god of war 2 عزیز عالی عالی توضیح دادید. کاملا گیرا بود حتی برای من که رشتم کامپیوتر نیست.

مشکلم هم رفع شد چون یا از نوع دینامیک استفاده میکنم یا الگوریتم رو تغییر میدم. ممنون از همه.

فقط یه سوال دیگه که ربطی به این موضوع نداره اینه که متغیر string که میتونه هر مقداری رو بگیره، چجوری فضای RAM رو اشغال میکنه؟ مثل همین متغیر دینامیک بر حسب افزایش اندازش حافظه رو اشغال میکنه؟ یعنی در حین برنامه هر چی مقدارش افزایش پیدا کنه همون موقع فضای بیشتری رو میگیره؟

اینو هم جواب بدید دیگه نور علی نور میشه. :20:

god of war 2
30-05-2012, 17:36
فقط یه سوال دیگه که ربطی به این موضوع نداره اینه که متغیر string که میتونه هر مقداری رو بگیره، چجوری فضای RAM رو اشغال میکنه؟ مثل همین متغیر دینامیک بر حسب افزایش اندازش حافظه رو اشغال میکنه؟ یعنی در حین برنامه هر چی مقدارش افزایش پیدا کنه همون موقع فضای بیشتری رو میگیره؟
کلاس استرینگ بسته به نوع الگوریتمش از همین روش استفاده میکنه.یعنی بصورت داینامیک از حافظه استفاده میکنه هرچه قدر حجم محتویاتش بیشتر بشه طبیعتا حافظه بیشتری لازم داره و بلعکس.تمام این تخصیص(گرفتن/آزاد کردن) های حافظه در زمان اجرای برنامه صورت میگره.برای اینکه بتونید براحتی این اعمال رو مشاهده کنید کافی از Task Manager سیستمتون کمک بگیرید و حجم برنامه در حافظه رو در شرایط مختلف نگاه کنید.