ورود

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



jaho
26-11-2009, 22:37
دوستان خوبم سلام

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

توی خط اول برنامه به آرایه ی string1 اندازه ی 5 رو دادم اما وقتی بیشتر از 5 کاراکتر وارد می کنم باز هم اونا رو نمایش میده!
پس فلسفه ی وجودی:31: این اندازه چیه؟

hoax3r
27-11-2009, 02:20
فلسفش اینه که اون اندازه یعنی کشک :31: برای همینه که خالق ++C توصیه میکنه از آرایه های C تا حد ممکن استفقاده نکنیین

p d
27-11-2009, 10:59
فكر نكنم اين قدر هم كشك باشه!!!
اين 5تا براي string1 در نظر گرفته ميشه. حالا اگر تصادفا(تويه حافظه) string2 بعد از string1 ذخيره شده باشه و اول به string2 مقدار داده باشيد و بعد بجاي وارد كردنه 5تا , 6تا براي string1 وارد كنيد , اونوقت ديگر تويه اولين خونه ي string2 مقدار ششم string1 است, در حالي كه بايد اولين مقدار string2 باشد.:31:

sin2x=2sinxcosx
27-11-2009, 11:45
بله به راحتی می تونه تو خونه های رزرو نشده هم عدد بذاره . چون دقیقا آدرسشو داره . چون آدرس خونه آخر آرایه رو که داره و نوع داده رو هم می دونه . پس می تونه تو اون خونه قرار بده . موقع خوندن هم آرایه هیچ وقت بررسی نمی کنه که اندیسش out of range هست یا نه . پس هر اندیسی بدین مقدارشو از حافظه پیدا می کنه میاره .

jaho
27-11-2009, 16:46
خب پس اگر اینطور که میگید باشه یعنی اصلا به اندازه ای که به آرایه میدیم توجهی نمی کنه خب این همون....کشک میشه دیگه:27: نمیشه؟

sin2x=2sinxcosx
27-11-2009, 16:54
خب پس اگر اینطور که میگید باشه یعنی اصلا به اندازه ای که به آرایه میدیم توجهی نمی کنه خب این همون....کشک میشه دیگه:27: نمیشه؟
نه . تقریبا کشکه . پست جناب pd رو یه بار دیگه بخونین :



فكر نكنم اين قدر هم كشك باشه!!!
اين 5تا براي string1 در نظر گرفته ميشه. حالا اگر تصادفا(تويه حافظه) string2 بعد از string1 ذخيره شده باشه و اول به string2 مقدار داده باشيد و بعد بجاي وارد كردنه 5تا , 6تا براي string1 وارد كنيد , اونوقت ديگر تويه اولين خونه ي string2 مقدار ششم string1 است, در حالي كه بايد اولين مقدار string2 باشد.[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

jaho
27-11-2009, 17:26
خب اگر تصادفاstring2 بعد از string1 ذخیره نشده باشه چی؟
از 5 به بعد رو توی اولین متغیر همنوع بعد از خودش ذخیره می کنه؟
به هر حال منظورتون اینه که مقدار اضافه توی یه متغیر دیگه ذخیره میشه پس چرا وقتی همین متغیر روcout می کنیم با تمام اجزایی که گرفته اونو نمایش میده مگر اونا توی یه متغیر دیگه ذخیره نشدن؟:23:

sin2x=2sinxcosx
27-11-2009, 17:33
خب اگر تصادفاstring2 بعد از string1 ذخیره نشده باشه چی؟

اون موقع همون کشک می شه .



به هر حال منظورتون اینه که مقدار اضافه توی یه متغیر دیگه ذخیره میشه پس چرا وقتی همین متغیر روcout می کنیم با تمام اجزایی که گرفته اونو نمایش میده مگر اونا توی یه متغیر دیگه ذخیره نشدن؟:23:
توی متغیر دیگه نه . توی یه آدرس از حافظه که اسم آرایه هم براش به منزله اسم متغیر هست .
من هیچ وقت نگفتم توی یه متغیر دیگه .

hoax3r
27-11-2009, 17:45
پس چرا وقتی همین متغیر روcout می کنیم با تمام اجزایی که گرفته اونو نمایش میده مگر اونا توی یه متغیر دیگه ذخیره نشدن؟
کامپایلر موقع تعریف متغییر های محلی اول مقدار متغیرهایی که مقدار ثابت (رشته ای یا عدد) دارن رو در حافظه (آدرس متغییرها) میریزه بعد از این
متغییر های مقدار دهی نشده رو قرار میده برای همین تو مثال شما به string1 هر مقداری بدی به string2 کاری ندراه
ولی بعدش به دلایلی احتمال کرش برنامتون هست(اگه مقدار string1 زیاد باشه)

jaho
27-11-2009, 17:46
توی متغیر دیگه نه . توی یه آدرس از حافظه که اسم آرایه هم براش به منزله اسم متغیر هست .
من هیچ وقت نگفتم توی یه متغیر دیگه .

یعنی چیییییییییییییییییییییییی ؟
یه آدرس از حافظه که اسم آرایه هم به منزله ی اسم متغیر هست خب یه متغیره دیگه!نیست؟
؟

jaho
27-11-2009, 17:54
کامپایلر موقع تعریف متغییر های محلی اول مقدار متغیرهایی که مقدار ثابت (رشته ای یا عدد) دارن رو در حافظه (آدرس متغییرها) میریزه بعد از این
متغییر های مقدار دهی نشده رو قرار میده برای همین تو مثال شما به string1 هر مقداری بدی به string2 کاری ندراه
ولی بعدش به دلایلی احتمال کرش برنامتون هست(اگه مقدار string1 زیاد باشه)

ok قبول string1 به string2 کاری نداره تصور من اینه که مقدار اضافه بر اندازه ی داده شده به آرایه نباید نشون داده بشه که میشه...تصورم غلطه؟:13:

حالا اگر اینطور باشه اصلا نمیشه به آرایه اندازه ای داد و آرایه هم سر به راه :31: همون تعداد ورودی رو بگیره و توی خروجی نشون بده؟

p d
27-11-2009, 18:01
يكي اين مساله رو كامل توضيح بده لطفا!

sin2x=2sinxcosx
27-11-2009, 18:20
یعنی چیییییییییییییییییییییییی ؟
یه آدرس از حافظه که اسم آرایه هم به منزله ی اسم متغیر هست خب یه متغیره دیگه!نیست؟
؟

فرض کنین این آرایه رو تعریف کردین :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این چهار عدد توی حافظه قراره قرار بگیرن دیگه . درسته ؟ اسم متغیر فقط یه شناسه اس برای دسترسی به مقدار . مقدار توی حافظه Ram قرار می گیره و هر قسمت هم یه آدرس براش وجود داره . برای هر یک از چهار عنصر آرایه یه آدرس تو حافظه براش وجود داره :
مثلا اگه آدرس اولی 001DF7AC باشه آدرس عنصر دومی از آرایه هم همین آدرس به اضافه 4 خواهد بود . چون اولی که از نوع int هست چهار بایت جا می گیره و عنصر بعدی هم تو چهار بایت بعدی قرار می گیره . یعنی آدرس 001DF7B0 . آدرس عنصر سومی میشه 001DF7B4 و عنصر چهارمی هم میشه 001DF7B8 . خب حالا شما می دونین که اگه یه اندیس دیگه ای هم بود آدرسش می شد 001DF7BC . حالا وقتی می خوایم این آدرسو cout کنیم کامپایلر این آدرسو به اصطلاح dereference می کنه و مقدارشو چاپ می کنه . براش مهم نیست با کدوم اندیس آرایه سروکار داره .

hoax3r
27-11-2009, 18:57
ok قبول string1 به string2 کاری نداره تصور من اینه که مقدار اضافه بر اندازه ی داده شده به آرایه نباید نشون داده بشه که میشه...تصورم غلطه؟
همونطور که گفتی اندازه آرایه چک نمیشه، اندازه آرایه ی رشته وقتی معیین میشه که به کاراکتر نول انتهاش برسه،
ولی اگه نرسته اونوقت ...


حالا اگر اینطور باشه اصلا نمیشه به آرایه اندازه ای داد و آرایه هم سر به راه همون تعداد ورودی رو بگیره و توی خروجی نشون بده؟

چرا راه هایی داریم، میتونی اینجوری استفاده کنی

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

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


يكي اين مساله رو كامل توضيح بده لطفا!
چی رو

jaho
27-11-2009, 19:42
همونطور که گفتی اندازه آرایه چک نمیشه، اندازه آرایه ی رشته وقتی معیین میشه که به کاراکتر نول انتهاش برسه،
ولی اگه نرسته اونوقت ...



چرا راه هایی داریم، میتونی اینجوری استفاده کنی

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

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

متشکرم خیلی لطف کردید!