PDA

نسخه کامل مشاهده نسخه کامل : ایراد این کد



Petros
04-06-2012, 16:42
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

Petros
05-06-2012, 18:46
نمیدونه کسی آیا؟

god of war 2
05-06-2012, 19:08
اشکال در خط :

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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در آرایه ها همیشه متغییر بدون اندیس به اولین عضو آرایه اشاره میکنه.اما در مورد اول, اشارگر به اشارگر آرایه نسبت داده میشه یعنی دو مرحله اشاره صورت میگیره که در نهایت در تابع سعی بر تغییر اشارگر میکنید که با کرش مواجه میشید.

Petros
05-06-2012, 20:52
شما این دستور رو تماشا(!) کنید:

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

وقتی به فراخوانی تابع میرسه، میشه انتساب اشاره گرها. که آدرس موجود در p به درون a ریخته میشود و هر دو به یک نقطه (که همون C است) اشاره میکنند.

اما تو اون رشته ها:

مگه متغیر C دارنده ی آدرس اولین خونه رشته نیست؟ مگه موقع ارسال، انتساب اشاره گر ها صورت نمیگیره و Str تبدیل به یک نام دیگه برای اون محل حافظه نمیشه؟

god of war 2
05-06-2012, 21:49
وقتی به فراخوانی تابع میرسه، میشه انتساب اشاره گرها. که آدرس موجود در p به درون a ریخته میشود و هر دو به یک نقطه (که همون C است) اشاره میکنند.
کاملا درسته و علتش هم اینه که خود c یک اشارگر نیست!

در کد قبلی آدرس اشارگر در اشارگر دیگر قرار میگرفت.
شما در تابع توسط عملگر دسترسی به مقدار (*) به آدرس اشارگر که در واقع به عنوان مقدار (Value) در اشاگر دیگر ریخته شده دسترسی پیدا میکنید نه به حرف t یا اولین خانه از آرایه.
طبق تصویر:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

p d
05-06-2012, 22:06
اشکال کد اولتون استفاده غلط از اشاره گر هاست. در واقع از لحاظ ساختاری و ظاهری مشکل نداره . مشکل تویه پاس دادن متغییر ها نیست. مشکل تویه رم و ران تایم اتفاق میوفته.
برای اثبات این و تست کنید:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
جالب بود ! نه ؟
فرق int با رشته اینه که وقتی به int اشاره میکنید میشه کل 2بایت(اگه int رو 2بایتی در نظر بگیریم) ولی وقتی ب رشته اشاره میکنید میشه 1 char اولش. و حتما این و میدونید که محل اشاره گر و محلی که بهش اشاره میکنه جداست. تویه مثال قیلی اشاره گرها مورد نظر هستن نه رشته ای که اشاره میکنید. رشته میتونه 100 char باشه مثلا ولی اشاره گر فقط به خونه اول اشاره میکنه.
اول این کد و تست کنید تا بعد اگه لازم بود توضیح بدم.

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

Petros
06-06-2012, 09:52
تشکر از هر دو دوست.

من چندین بار پستتون رو از اول تا آخر خوندم، ولی خب، مشکل IQ تو این زمونه شایع هستش.

توی تصویر زیر متغیر a دارای آدرس 16CC و اشاره گر هم دارای آدرس 12FC میباشد. ما با استفاده از عملگر * میگیم محتویات آدرسی که در تو هست رو نشون بده. مثلا cout << *p
51221

خب تصویر زیر هم توی c یه آدرسه. میخواهیم اون رو دیرفرنس کنیم و توش مقدار بریزیم.


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

51222

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

ممنون

p d
06-06-2012, 10:02
خب تویه این کد دقیقا این اتفاق میوفته دیگه .
جای 1 ؛ 8 میذاره.


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

مشکل کجاست الان ؟

Petros
06-06-2012, 10:56
مشکل اینجاست که آرایه مشکل نداره، ولی اشاره گر رشته ای مشکل داره. من میخوام به یه درکی برسم که چرا اشاره گر رشته ای و دیفرنس کردن و مقدار دادن متفاوته با آرایه ها.

همونطور که میدونید آرایه هم فرزند اشاره گرهاست (ولی خب استاتیک)

در ضمن یکی بگی این دو تا چیه هستن. تفسیر کنه، آیا اولیت عملگرها تو این دو تا رعایت میشه؟


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

Petros
06-06-2012, 11:15
راستی شما بچه شمسی پور هستی؟

p d
06-06-2012, 11:35
اشاره گر ها مشکلشون تویه گرفتن حافظه هست. وقتی تعریف میکنید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
1 اشاره گر دارید که به 1 جایی داره اشاره میکنه. حالا به کجا؟ نمیدونید. مشکل همین جاست. p شامل ادرس محلی است ؛ ک میتونه این ادرس در ناحیه داده یا کد برنامه باشه/نباشه. میتونه مثلا به 1 قسمت غیر مجاز اشاره کنه که با مقدار دهی بهش کل سیستم عامل کرش کنه(البته ویندوز اجازه دسترسی به قسمت های مخصوص و نمیده ولی با داس میشه این کارو کرد)
خب حالا راه حلش جیه.

باید به اشاره کرتون درست حافطه اختصاص بدید.

مثلا:


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

یا مثلا


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

تویه این مثال ها p به 1 مکان درست اشاره میکنه که مجاز هست .

به خاطر این مسایل+یه سری چیزا ؛ کلا استفاده از اشاره گر توصیه نمیسه. به خاطر همین ارور پذیری بالا که میبینید. کلا مبحث سنگین هست چون ویزگی شبیه به زبان های سطح پایین هست. به قولی: رمز استفاده درست از اشاره گر ها این ه که بدونید هر لحظه به کجا اشاره میکنه.
اونم با وجود این کامپایلرهای پیش پیش رفته امروزی دلیلی ببرای استفاده از اشاره گر نیست. اگر هم اصرار به استفاده دارید باید به طور مثال به اشکال بالا ازش استفاده کنید.
_______________

راستی شما بچه شمسی پور هستی؟
بله.
__________-

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
__________
برای سوال اخرت هم این و ببین:

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

Petros
06-06-2012, 13:07
دوست عزیز، لینک هایی که دادید رو دارم با دقت میخوونم.

همین الان یه سوال پیش اومد. اگه کامپیوتر یک شخص 12 گیگ حافظه داشته باشه، با توجه به واحد حافظه (بایت) آیا اشاره گر میتونه از حافظه های موجود در بالای حافظه (که بیشتر از 4 بایت برای ذخیره شدن نیاز دارند) استفاده کنه؟

p d
06-06-2012, 17:43
دقیقا نمیدونم چینش و وضعیت استفاده از حافظه توسط سیستم عامل چطوری هست. ولی در حالت کلی سیستم عامل تصمیم میگیره به شما حافظه ای رو اختصاص بده یا نه.
ولی فک کنم میشه امتحان کرد(تا بحال بهش فک نکرده بودم/ شایدم نشه:31:). حالا امتحان کنید به این شکل که ادرس که مورد نطرتون هست و حساب کنید بعد به اشاره کر اختصاص بدید بعد باهاش کار کنید که ببنید جواب میده یا نه.

فقط 1 نکته ای هست. اونم اینه که سیستم عامل شما تا چقدر حافظه پشتیبانی میکنه. مثلا سیتم عامل 32 بیتی به نطرم تا 4gb رم ساپورت میکنه.

Petros
07-06-2012, 20:26
پس از ساعت های فراوان فعلا به یه نتیجه رسیدم که اشاره گر رشته ای Read-Only هست. و قابل تغییر دادن نیست. و این ربط به Stack و ... داره که من فعلا نمیدونم چی هست.

بیشتر فهمیدم تاپیک به روز میشه. هر کی بره بفهمه بیاد به زبون فارسی لری، توضیح بده، ثوابی به این هوا خواهد برد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Petros
08-06-2012, 10:41
آقایون من هر چی جلوتر میرم بیشتر غرق میشم.

همه جا بحث اینه که مرجع یک شی جدید نیست و حافظه اضافه از سیستم نمیگیره. یه نام دیگس براش. یه Alias برای اون متغیر هست.

اما چه طوری؟

این یه توضیح تو تاپیک زیر. کسی میتونه با شکل بفهمونه (براش پودر میشم.)


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

توی این تاپیک ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])