تالار گفتمان مانشت
سوال از خطاها - نسخه‌ی قابل چاپ

صفحه‌ها: ۱ ۲
RE: سوال از خطاها - Riemann - 17 بهمن ۱۳۹۲ ۱۰:۰۲ ق.ظ

(۱۷ بهمن ۱۳۹۲ ۰۸:۲۰ ق.ظ)e.shrm نوشته شده توسط:  برلندم
برلند؟ واقعن که !

RE: سوال از خطاها - unicornux - 17 بهمن ۱۳۹۲ ۱۰:۰۷ ق.ظ

(۱۷ بهمن ۱۳۹۲ ۰۸:۲۰ ق.ظ)e.shrm نوشته شده توسط:  در کمال شگفتی الان با یه کتاب چک کردم! گفته عبارت مثلا ;i+j طبق تعریف نحو زبان C یک عبارت درست است. و اساسا این خطای منطقی میشه.
یادم نمیاد تا حالا همچین کدی نوشته باشم ، برلندم باز نشد کدشو بزنم. ولی میگه درسته دیگه!


از این کمک بگیرید Idea

مهمان عزیز شما قادر به مشاهده پیوندهای انجمن مانشت نمی‌باشید. جهت مشاهده پیوندها ثبت نام کنید.


RE: سوال از خطاها - fulgent - 17 بهمن ۱۳۹۲ ۱۲:۰۴ ب.ظ

یه سوال دیگه!
خطای منطقی چطور معلوم میشه؟ یعنی وقتی شما یه برنامه رو می نویسید و حالا اجراش می کنید اگر خطای منطقی وجود داشته باشه به صورت ارور نمایش داده میشه؟
-اگر جواب بله است که من کد سوال پارسال (یعنی به جای == در شرطIf = گذاشتم) و هیچ اروری نداد.(پس یعنی کلا خطایی وجود نداره؟!)
-اگر جواب منفی است پس کاربر باید از کجا این خطای منطقی رو متوجه بشه؟ مگه نمی گیم خطای زمان اجراست؟ پس باید با Run کردن برنامه هرچی خطای زمان کامپایل و اجرا هست معلوم بشه! (که الآن معلوم نمیشه!)

RE: سوال از خطاها - fulgent - 17 بهمن ۱۳۹۲ ۰۱:۱۲ ب.ظ

با تشکر از تمام دوستانی که وقت گذاشتن.
جواب ابهامات:
خطای منطقی به صورت ارور مشخص نمیشه بلکه وقتی نتیجه برنامه با آنچه کاربر انتظار داشته متفاوت میشه، ما متوجه می شویم که خطای منطقی رخ داده است.
در مورد سوال If از آنجایی که دستور انتساب در زبان C با = انجام می گیرد پس اگر ما در شرط If نیز از = استفاده کنیم انگار عملیات انتساب رخ داده که این اتفاق نه از لحاظ نحوی مشکل دارد و نه از لحاظ معنایی، فقط در نهایت کاربر می بیند که جواب انچه که انتظار داشته نشده و متوجه می شود احتمالا خطای منطقی رخ داده است.
در مورد سوال بالا کامپایلر زبان C این عملیات جمع را انجام می دهد ولی چون دستور انتسابی در این خط از برنامه وجود ندارد نتیجه عملیات را درون متغیر خاصی نمی ریزد و در نهایت هم اروری نمی دهد. چون نه خطای منطقی اتفاق افتاده و نه معنایی. اما باز هم کاربر با دیدن نتیجه باید به وجود خطای منطقی پی ببرد.

RE: سوال از خطاها - equilibrium - 17 بهمن ۱۳۹۲ ۰۱:۴۷ ب.ظ

کاری که + انجام میده اینه که حاصل دو تا عملوندشو در یه حافظه موقت حساب میکنه و مقدارشو برمیگردونه (به عملگر بعدی)؛ به عبارت دیگه + باعث تغییر متغیرهای حافظه نمیشه مگر اینکه با دستور = اون مقدار محاسبه شده در متغیر موقت به یه متغیر برنامه تخصیص داده بشه؛ به همین جهت در درخت تجزیه + (یا * / -) نمیتونه ریشه قرار بگیره که در سوال پرسیده شده این اتفاق میفته (- میشه ریشه درخت)؛ بنابراین یه درخت تجزیه داریم که تشکیل میشه (نحوی مشکل نداره) اما درخت بامعنایی نیست؛

پ.ن. خطای منطقی قابل تشخیص نیست و خود برنامه نویس باید متوجه اشتباهش بشه؛
پ.ن. اون سوال دیگه ای که مربوط به = و == هست هم دلیلی مشابه به بالا رو داره ولی خطاش منطقیه (عملگر = در زبان C علاوه بر اینکه مقدار سمت راست رو به سمت چپ نسبت میده، اون مقدار رو ریترن میکنه؛ بهمین دلیل در زبان C میشه نوشت a=b=c درحالیکه در زبان پاسکال خطای سینتکس داره؛ حالا اگه این مقداری که بعد از انتساب توسط = ریترن میشه ۰ باشه حاصل if میشه false و اگه غیر ۰ باشه حاصل if میشه true که گاهی پاسخ مورد نظر ما رو میده و گاهی نمیده که این اشکالو برنامه نویس باید بفهمه)؛

RE: سوال از خطاها - firouziam - 17 بهمن ۱۳۹۲ ۰۱:۴۹ ب.ظ

به نظر منم ۴ میشه، خطای منطقی! چون اصولا این عمل خطایی ایجاد نمیکنه فقط عبارت یه مقداری برمیگردونه که هیچ مقصدی برای نوشتنش تعیین نشده پس از این مقدار استفاده نمیشه ولی خطایی هم نمیده، یه مثال میارم: دستور printf رو تصور کنید، این دستور یه مقدار چاپ می کنه و تعداد کاراکتر چاپ شده رو بر میگردونه، حالا اگه متغیری سمت چپش بنویسیم( ;('x=printf('something ) این مقدار میره توی x، اما اگه هیچی ننویسیم و فقط printf خالی رو صدا بزنیم ( ;('printf('something ) دستور بدرستی اجرا میشه و از مقدار برگشتی صرفنظر میشه، اگه قرار بود با عبارت بالا خطایی پیش بیاد واسه این دستور چاپ هم باید پیش بیاد ولی همه میدونیم که پیش نمیاد.

البته این نظر منه، امیدوارم آخرش به یه نتیجه قطعی برسیم، چون اگه زبونم لال فردا نه پس فردا تو کنکور بیاد همه میمونیم چی بزنیم(اما خدایی رشته هم داریما!!! پره از این ابهامات!)

RE: سوال از خطاها - hosshah - 17 بهمن ۱۳۹۲ ۰۲:۱۸ ب.ظ

(۱۷ بهمن ۱۳۹۲ ۰۱:۴۹ ب.ظ)firouziam نوشته شده توسط:  به نظر منم ۴ میشه، خطای منطقی! چون اصولا این عمل خطایی ایجاد نمیکنه فقط عبارت یه مقداری برمیگردونه که هیچ مقصدی برای نوشتنش تعیین نشده پس از این مقدار استفاده نمیشه ولی خطایی هم نمیده، یه مثال میارم: دستور printf رو تصور کنید، این دستور یه مقدار چاپ می کنه و تعداد کاراکتر چاپ شده رو بر میگردونه، حالا اگه متغیری سمت چپش بنویسیم( ;('x=printf('something ) این مقدار میره توی x، اما اگه هیچی ننویسیم و فقط printf خالی رو صدا بزنیم ( ;('printf('something ) دستور بدرستی اجرا میشه و از مقدار برگشتی صرفنظر میشه، اگه قرار بود با عبارت بالا خطایی پیش بیاد واسه این دستور چاپ هم باید پیش بیاد ولی همه میدونیم که پیش نمیاد.

البته این نظر منه، امیدوارم آخرش به یه نتیجه قطعی برسیم، چون اگه زبونم لال فردا نه پس فردا تو کنکور بیاد همه میمونیم چی بزنیم(اما خدایی رشته هم داریما!!! پره از این ابهامات!)

بله حرفتون درسته
کدش هم تست شد خطای کامپایل نداد

RE: سوال از خطاها - fulgent - 17 بهمن ۱۳۹۲ ۰۶:۰۴ ب.ظ

(۱۷ بهمن ۱۳۹۲ ۰۱:۴۷ ب.ظ)Ghiasoddin نوشته شده توسط:  کاری که + انجام میده اینه که حاصل دو تا عملوندشو در یه حافظه موقت حساب میکنه و مقدارشو برمیگردونه (به عملگر بعدی)؛ به عبارت دیگه + باعث تغییر متغیرهای حافظه نمیشه مگر اینکه با دستور = اون مقدار محاسبه شده در متغیر موقت به یه متغیر برنامه تخصیص داده بشه؛ به همین جهت در درخت تجزیه + (یا * / -) نمیتونه ریشه قرار بگیره که در سوال پرسیده شده این اتفاق میفته (- میشه ریشه درخت)؛ بنابراین یه درخت تجزیه داریم که تشکیل میشه (نحوی مشکل نداره) اما درخت بامعنایی نیست؛

پ.ن. خطای منطقی قابل تشخیص نیست و خود برنامه نویس باید متوجه اشتباهش بشه؛
پ.ن. اون سوال دیگه ای که مربوط به = و == هست هم دلیلی مشابه به بالا رو داره ولی خطاش منطقیه (عملگر = در زبان C علاوه بر اینکه مقدار سمت راست رو به سمت چپ نسبت میده، اون مقدار رو ریترن میکنه؛ بهمین دلیل در زبان C میشه نوشت a=b=c درحالیکه در زبان پاسکال خطای سینتکس داره؛ حالا اگه این مقداری که بعد از انتساب توسط = ریترن میشه ۰ باشه حاصل if میشه false و اگه غیر ۰ باشه حاصل if میشه true که گاهی پاسخ مورد نظر ما رو میده و گاهی نمیده که این اشکالو برنامه نویس باید بفهمه)؛

خیلی متشکرم و ممنون Smile

RE: سوال از خطاها - e.shrm - 17 بهمن ۱۳۹۲ ۱۰:۳۱ ب.ظ

(۱۷ بهمن ۱۳۹۲ ۱۰:۰۲ ق.ظ)Riemann نوشته شده توسط:  
(17 بهمن ۱۳۹۲ ۰۸:۲۰ ق.ظ)e.shrm نوشته شده توسط:  برلندم
برلند؟ واقعن که !
من ۴ ساله C کد نزدم خب. این برلندم از اعماق فایل هام پیدا کردم که lib هاش پاک شده بود کار نمیکرد!

RE: سوال از خطاها - sonia11 - 18 بهمن ۱۳۹۲ ۰۷:۲۲ ب.ظ

به نظر من گزینه ۳ درسته چون همون جوری که می دونیم خطاهای معنایی به دو دسته تقسیم میشن :
۱خطای معنایی در زمان کامپایل
۲- خطای معنایی در زمان اجرا
از اون جایی که متغیر تعریف نشده ولی استفاده شده خطای معنایی در زمان کامپایل میده یعنی اصلا کد برنامه برای اجرا تولید نمیشود. و اون عبارت محاسباتی هم مشکلی ندارد.
البته اون عبارتی که شما نوشتید خطای منطقی داره.