-
فرشید پوشنده
1405/05/22
-
22 مرداد 1405
بازگشت به: آموزش برنامه نویسی c++ سی پلاس پلاس
۰.۸ — چند مشکل رایج در C++
در این بخش، به برخی از مشکلات رایجی میپردازیم که به نظر میرسد برنامهنویسان تازهکار با احتمال نسبتاً بالایی با آنها مواجه میشوند. این بخش به معنای فهرست جامعی از مشکلات کامپایل یا اجرا نیست، بلکه فهرستی کاربردی از راهحلها برای مسائل بسیار ابتدایی است. اگر پیشنهادی برای مسائل دیگری که ممکن است به این فهرست اضافه شوند، دارید، آنها را در بخش نظرات زیر پست کنید.
مشکلات عمومی زمان اجرا (Run-time)
سوال: هنگام اجرای برنامه، پنجره کنسول چشمک میزند و بلافاصله بسته میشود.
پاسخ:
ابتدا، خطوط زیر را به بالای برنامه خود اضافه کنید یا مطمئن شوید که وجود دارند (کاربران Visual Studio، مطمئن شوید که این خطوط بعد از #include "pch.h" یا #include "stdafx.h" قرار میگیرند، اگر آن فایلها وجود دارند
1 #include <iostream>
2 #include <limits>
دوم، کد زیر را در انتهای تابع main() خود (درست قبل از دستور return) اضافه کنید:
1 std::cin.clear(); // reset any error flags
2 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore any characters in the input buffer until we find an enter character
3 std::cin.get(); // get one more char from the user
این کار باعث میشود برنامه شما منتظر بماند تا کاربر یک کلید را فشار دهد، که به شما زمان میدهد تا خروجی برنامه خود را قبل از اینکه سیستمعامل پنجره کنسول را ببندد، بررسی کنید.
راهحلهای دیگر، مانند راهحل رایج system("pause")، ممکن است فقط روی سیستمعاملهای خاصی کار کنند و باید از آنها اجتناب شود.
نسخههای قدیمیتر Visual Studio ممکن است وقتی برنامه در حالت Start With Debugging (F5) اجرا میشود، مکث نکنند. سعی کنید برنامه را در حالت Start Without Debugging (Ctrl-F5) اجرا کنید.
سوال: برنامه خود را اجرا کردم اما پنجرهای باز میشود و هیچ خروجی مشاهده نمیشود.
ممکن است آنتیویروس یا آنتیمالور شما اجرای برنامه را مسدود کرده باشد. سعی کنید آن را بهطور موقت غیرفعال کنید و ببینید آیا مشکل همین است.
سوال: برنامه من کامپایل میشود اما به درستی کار نمیکند. چه کار کنم؟
اشکالزدایی (Debug) کنید! نکاتی درباره نحوه تشخیص و اشکالزدایی برنامههای خود را بعداً در فصل ۳ خواهید دید.
مشکلات عمومی زمان کامپایل (Compile-time)
سوال: وقتی برنامه خود را کامپایل میکنم، با خطای unresolved external symbol _main یا _WinMain@16 مواجه میشوم.
این یعنی کامپایلر شما نمیتواند تابع main() شما را پیدا کند. همه برنامهها باید شامل یک تابع main() باشند.
چند نکته برای بررسی وجود دارد:
الف) آیا کد شما شامل تابعی به نام
mainاست؟ب) آیا
mainبه درستی املاء شده است؟ج) وقتی برنامه خود را کامپایل میکنید، آیا میبینید که فایل حاوی تابع
main()کامپایل میشود؟ اگر نه، یا تابعmain()را به فایلی که کامپایل میشود منتقل کنید، یا فایل را به پروژه خود اضافه کنید (برای اطلاعات بیشتر درباره نحوه انجام این کار، به درس ۲.۸ — برنامههای با چندین فایل کد مراجعه کنید).د) آیا یک پروژه کنسولی ایجاد کردهاید؟ سعی کنید یک پروژه کنسولی جدید ایجاد کنید.
سوال: وقتی برنامه خود را کامپایل میکنم، با خطایی مواجه میشوم که میگوید main قبلاً تعریف شده است، یا تعاریف چندگانه برای main وجود دارد.
یک برنامه C++ فقط مجاز به داشتن یک تابع به نام main است. برنامه C++ شما بیش از یک تابع main دارد. فایلهای موجود در پروژه خود را بررسی کرده و تمام توابع main به جز یکی را حذف کنید.
سوال: سعی میکنم از قابلیتهای C++11/14/17/XX استفاده کنم اما کار نمیکند.
اگر کامپایلر شما قدیمی است، ممکن است از این افزودههای جدید به زبان پشتیبانی نکند. در آن صورت، کامپایلر خود را ارتقا دهید.
برای IDEها/کامپایلرهای مدرن، ممکن است کامپایلر شما بهطور پیشفرض روی یک استاندارد زبان قدیمیتر تنظیم شده باشد. نحوه تغییر استاندارد زبان خود را در درس ۰.۱۲ — پیکربندی کامپایلر: انتخاب استاندارد زبان پوشش میدهیم.
سوال: وقتی برنامه خود را کامپایل میکنم، با خطایی مواجه میشوم که نمیتواند فایل .exe را برای نوشتن باز کند.
این یعنی لینکر سعی دارد فایل اجرایی شما را ایجاد کند، اما نمیتواند. این میتواند به دلایل متعددی رخ دهد:
شایعترین دلیل: فایل
.exeدر حال اجرا است. یک فایل اجرایی در حال اجرا را نمیتوان در حین اجرا جایگزین کرد. فایل.exeدر حال اجرا را ببندید و دوباره کامپایل کنید.آنتیویروس یا محافظت از بدافزار شما از ایجاد یا جایگزینی فایل اجرایی جلوگیری میکند.
فایل
.exeاز قبل وجود دارد و به دلایل دیگری قفل شده است. سعی کنید سیستم را مجدداً راهاندازی کنید (تا هر گونه قفلی آزاد شود) و سپس دوباره کامپایل کنید.
در Visual Studio، این خطا با شناسه LNK1168 شناخته میشود.
سوال: وقتی سعی میکنم از cin، cout یا endl استفاده کنم، کامپایلر میگوید cin، cout یا endl یک ‘شناسهنشده اعلامشده’ (undeclared identifier) هستند.
ابتدا، مطمئن شوید که خط زیر را در بالای فایل خود قرار دادهاید:
1 #include <iostream>
دوم، مطمئن شوید که هر بار از cin، cout و endl استفاده میکنید، قبل از آنها “std::” قرار داده شود. برای مثال:
1 std::cout << "Broccoli" << std::endl;
اگر این مشکل شما را برطرف نکرد، ممکن است کامپایلر شما قدیمی باشد یا نصب آن خراب شده باشد. سعی کنید کامپایلر خود را مجدداً نصب کرده و/یا به آخرین نسخه ارتقا دهید.
سوال: وقتی سعی میکنم از endl برای پایان دادن به یک خط چاپشده استفاده کنم، کامپایلر میگوید end1 یک ‘شناسهنشده اعلامشده’ (undeclared identifier) است.
مطمئن شوید که حرف l (L کوچک) در endl را با عدد ۱ اشتباه نمیگیرید. endl تماماً حرف است. مطمئن شوید که ویرایشگر شما از فونتی استفاده میکند که تفاوتهای بین حرف کوچک l، حرف بزرگ I و عدد ۱ را به وضوح نشان دهد. همچنین حرف بزرگ O و عدد صفر نیز به راحتی در بسیاری از فونتهای غیربرنامهنویسی قابل اشتباه هستند.
مشکلات Visual Studio
سوال: هنگام کامپایل با Microsoft Visual C++، با خطای fatal C1010 مواجه میشوید، با پیام خطایی مانند “c:\vcprojects\test.cpp(263) :fatal error C1010: unexpected end of file while looking for precompiled header directive”
این خطا زمانی رخ میدهد که کامپایلر Microsoft Visual C++ روی استفاده از هدرهای از پیش کامپایلشده تنظیم شده باشد، اما یک (یا چند) فایل کد C++ شما شامل #include "stdafx.h" یا #include "pch.h" به عنوان اولین خط فایل کد نمیشود.
راهحل پیشنهادی ما این است که هدرهای از پیش کامپایلشده را غیرفعال کنید، که نحوه انجام آن را در درس ۰.۷ — کامپایل کردن اولین برنامه خود نشان دادهایم.
اگر میخواهید هدرهای از پیش کامپایلشده را فعال نگه دارید، برای رفع این مشکل، به سادگی فایلهایی که خطا را تولید میکنند (در خطای بالا، test.cpp مقصر است) را پیدا کنید و خط زیر را در بالای فایل(ها) اضافه کنید:
1 #include "pch.h"
یا
1 #include "stdafx.h"
نسخههای قدیمیتر Visual Studio به جای “pch.h” از “stdafx.h” استفاده میکنند، بنابراین اگر “pch.h” مشکل را حل نکرد، “stdafx.h” را امتحان کنید.
توجه داشته باشید که در برنامههای با چندین فایل، هر فایل کد C++ باید با این خط شروع شود.
سوال: Visual Studio خطایی مانند زیر میدهد: “1MSVCRTD.lib(exe_winmain.obj) : error LNK2022: unresolved external symbol _WinMain@16 referenced in function “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ)”
به احتمال زیاد شما یک برنامه گرافیکی ویندوز (Windows graphical application) ایجاد کردهاید نه یک برنامه کنسولی. پروژه خود را دوباره ایجاد کنید و مطمئن شوید که آن را به عنوان یک پروژه کنسولی ویندوز (Windows یا Win32 Console) ایجاد میکنید.
سوال: وقتی برنامه خود را کامپایل میکنم، یک هشدار درباره “Cannot find or open the PDB file” دریافت میکنم.
این یک هشدار است، نه یک خطا، بنابراین نباید روی برنامه شما تأثیر بگذارد. با این حال، آزاردهنده است. برای رفع آن، به منوی Debug > Options and Settings > Symbols بروید و گزینه “Microsoft Symbol Server” را علامت بزنید.
موارد دیگر
سوال: مشکل دیگری دارم که نمیتوانم آن را تشخیص دهم. چگونه میتوانم سریعاً پاسخ بگیرم؟
همانطور که در مطالب پیش میروید، بدون شک سوالاتی خواهید داشت یا با مشکلات غیرمنتظرهای مواجه خواهید شد. کاری که باید انجام دهید به مشکل شما بستگی دارد. اما به طور کلی، چند کار وجود دارد که میتوانید امتحان کنید.
اول: از یک موتور جستجو بپرسید. روش خوبی برای بیان سوال خود پیدا کنید و جستجو کنید. اگر در حال جستجوی یک پیام خطا هستید، پیام خطای دقیق را با استفاده از نقل قول (گیومه) قرار دهید (هر گونه نام فایل یا شماره خط را حذف کنید). به احتمال زیاد شخصی قبلاً همین سوال را پرسیده است و پاسخ در انتظار شماست.
دوم: از یک هوش مصنوعی مانند ChatGPT از طریق Bing بپرسید. سوال خود را با عبارت “In C++,” شروع کنید تا پاسخ مخصوص C++ دریافت کنید. چند ایده برای چیزهایی که میتوانید بپرسید:
توضیح یک مفهوم (مثلاً “In C++, what is a local variable؟”)
تفاوت بین دو چیز (مثلاً “In C++, what is the difference between a pointer and a reference؟”)
نمایش یک مفهوم (مثلاً “In C++, write a short program that adds two numbers”)
توجه داشته باشید که هوش مصنوعی ممکن است اطلاعات نادرست یا قدیمی بازگرداند و برنامههایی که مینویسند احتمالاً از بهترین روشهای مدرن پیروی نمیکنند.
اگر موارد بالا شکست خورد، در یک تالار پرسش و پاسخ (Q&A) بپرسید. وبسایتهایی برای پرسش و پاسخ برنامهنویسی طراحی شدهاند، مانند Stack Overflow. سعی کنید سوال خود را در آنجا مطرح کنید. به یاد داشته باشید که در مورد مشکل خود کامل باشید و تمام اطلاعات مرتبط مانند سیستمعاملی که استفاده میکنید و IDEای که استفاده میکنید را شامل کنید.