-
تعداد ارسال ها
505 -
تاریخ عضویت
-
روز های برد
266
پست ها ارسال شده توسط کامبیز اسدزاده
-
-
در 14 دقیقه قبل، veria.kurdish گفته است :درود
یکی از قابلیت ها در طراحی متریال توسط qml همین موضوع Material.elevation هست که یک سایه (بستگی به مقدار وارد شده ) به Pane میده و باعث ایجاد عمق میشه. با توجه به مستندات کیوت ، این قابلیت رو نتونستم برای یک Pane اعمال کنم!
منظورم یه چیزی در حد سایه این مثال است. لینک
ممنون میشم دوستان راهنمایی کنند.
با توجه به کدوم یکی از مستندات کیوت؟ طبق مستندات کیوت، آیا DropShadow رو تحت QtGraphicalEffects امتحان کردین؟
-
در 1 ساعت قبل، veria.kurdish گفته است :درود
آیا روشی هست که بشه تمامی مباحث انیمشین رو در qml مطالعه کرد؟ (به جز مستندات کیوت)
اساس مشکل من در کار با انمیشین Qml اینه که دقیقا نمیدونم از هر انیمشینی کجا میشه استفاده کرد.
به عنوان مثال: چند نوع انیمیشین داریم، کجا میشه از هر نوع استفاده کرد و قابلیتهایی که هر انیمشین میتونه اجرا کنه چی هست
خب قبل از هر چیز اشاره کنم به این که سوالتون رو در بخش مخصوص خودش بپرسید، من انتقالش دادم اینجا (مناسبتر هست) شما برای اینکه بتونی همه امکانات مرتبط با انیمیشن رو در QML مطالعه کنید باید قبلش نیاز استفاده به اون رو مشخص کنید. برای مثال انواع زیر رو در انیمیشن در اختیار داریم:
- NumberAnimation
- ParallelAnimation
- ParentAnimation
- PathAnimation
- RotationAnimation
- SequentialAnimation
- SmoothedAnimation
- SpringAnimation
هر کدوم از این انواع در جای خودش کاربرد خودش رو داره. مثلاً وقتی لازم هست چند انیمیشن به صورت موازی و همزمان اجرا بشن بهتره از SequentialAnimation و ParallelAnimation استفاده بشه و یا وقتی نیاز هست یک انیمیشن به یک تصویر یا شیء اعمال کنی که بر اساس یک مسیر رفتار کنه از نوع PathAnimation استفاده میشه.
راجع به اینها تنها روشش همون مستندات کیوت هست و همچنین در کتاب برنامه نویسی پیشرفته
C++ همراه با کیوت هم به تک به تک این موارد به صورت جداگانه و ترکیبی اشاره شده.نقل قولبه طور کلی چون موضوع تاپیکتون (درخواستی) هست، سعی میکنیم راجع به این موارد آموزشهایی رو قرار بدیم.
موفق باشید.
- 1
- 1
-
در 10 دقیقه قبل، سید معین حسینی گفته است :برد های رزبری پای چطور هستن؟ چیزایی که اطرافم میشنوم اینطور جلوه میده که بیشتر رزبری پای کار میکنن
من خودم ازشون استفاده کردم از نسخه ۳، خوب هستش اما زیاد قوی نیست و نمیشه انتظار زیادی ازش داشت. همین در حد رد و بدل کردن دیتا بد نیست.
- 1
-
در 2 ساعت قبل، سید معین حسینی گفته است :سلام خدمت اساتید محترم
من مدتی هست که در زمینه اینترنت اشیاء کنجکاو شدم و تصمیم دارم کمی در این مورد اطلاعات جمعآوری کنم. اطلاعاتی از قبیل پیشنیازهای مورد نیاز برای شروع فعالیت در این زمینه، زبانهای برنامهنویسی که بیشتر مورد استفاده قرار میگیرند و هر چیزی نیاز هست در مورد اینترنت اشیاء بدونم. ممنون میشم اطلاعات خودتون رو با من به اشتراک بگذارید. با تشکر
سلام،
یک مقالهای راجع به منابع مرتبط با اینترنت اشیاء در بخش بلاگ ارسال شده که عنوانش هست (منابع یادگیری مبحث اینترنت اشیاء (IoT) برای توسعهدهندهگان)
با توجه به منابعی که موجود هست و با توجه به تجربیاتی که من در این زمینه دارم، زبانهای برنامه نویسی مرتبط با این حوزه
C++ و Python، جاوا، پی اچ پی و جاوا اسکریپت بیشترین استقبال رو دارند. البته زبانهای دیگهای هم در این زمینه کاربرد دارن اما به خاطر ارتباط بین سختافزار و نرمافزارC/C++ بسیار مناسب هستند.در مورد ابزارها و محیطهای توسعه Qt Creator بسیار کارآمد هست. همچنین استفاده از GraphQL رو هم پیشنهاد میکنم (فناوری بسیار خوبی در حوزه کار با وب سرویسها هستش). در مورد بوردها Rpi خوبه اما جدیداً بورد Tinker ساخت Asus سرو صدای زیادی کرده که بسیار قدرتمند هست که میشه گفت Rpi پیش این یک اسباببازی هست، اما از ایرادهای Tinker Board میشه به مشکلات پشتیبانی نرمافزاری و تیم پشتیبانی ضعیفش اشاره کرد.
- 1
-
معمولاً برای استفاده از آیکونها در برنامه از تصاویر با فرمتهای
png, svg, gif
استقبال میشود، اما بعضاً نیاز است نسبت به دستگاهها و صفحههای نمایشی با کیفیت بسیار بالا تصاویر با تعداد پیکسل متناسب با صفحه مورد استفاده قرار گیرند. اما روشی وجود دارد که میتوان با حجم کمتر و کیفیت بسیار بالاتری از تصاویر برداری مانند SVG و یا فونتهای آیکونیک استفاده کرد. این فناوری در وب، موبایل و دسکتاپ مورد استقبال قرار میگیرد و ما در این بخش قرار است راجع به نحوهٔ استفاده از فونتهای آیکونی در پروژههای تحت فناوری کیوت کوئیک و QML صحبت کنیم.قبل از هر چیز لازم است فونت آیکونیک مورد نظر خود را دریافت و بر روی پروژه خود اعمال کنید. برای این منظور ما FontAwesome را پیشنهاد میکنیم. جهت دریافت نسخه به روز آن را از این بخش دریافت کنید.
وارد محیط Qt Creator شوید و پروژهٔ خود را از نوع Qt Quick ایجاد کنید، در بخش qrc فونتهای دسکتاپ را به پروژه اضافه کنید. سپس وارد فایل
main.qml
شده و نوع تعریف فونت را اعلان کنید. به صورت زیر:FontLoader { id:fontAwesomeStandard source: "qrc:/font/Font Awesome 5 Free-Regular-400.otf" } FontLoader { id:fontAwesomeBrand source: "qrc:/font/Font Awesome 5 Brands-Regular-400.otf" } FontLoader { id:fontAwesomeSolid source: "qrc:/font/Font Awesome 5 Free-Solid-900.otf" }
توجه داشته باشید که کُدهای یونیک را با کاراکتر u ترکیب کنید. برای مثال کد
f007
شناسه آیکون کاربری میباشد که در اینجا باید به صورتu\f007
نوشته شود.Text { text: "\uf007" font.family: fontAwesomeSolid.name verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pixelSize: 128 anchors.centerIn: parent }
کُدهای مختص آیکونها نسبت به نوع فایل فونت متفاوت هستند، کد مرتبط با آیکون کاربر در داخل فایل Free-Solid میباشد که باید به آنها توجه کنید. برای به دست آوردن کدهای آیکونیک از طریق این آدرس اقدام کنید. برای مثال فایل Brand دارای آیکونهای برندیگ است که کد آن به صورت زیر خواهد بود.
Text { text: "\uf369" font.family: fontAwesomeBrand.name verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pixelSize: 128 anchors.centerIn: parent }
در ادامه میتوانید فایل ضمیمه شده پروژه را دریافت نمایید.
- 1
- 3
-
جزئیات در ++C ویرایش ۱۷: کد نویسی ساده
با توجه به مشخصاتی که در استاندارد ISO/IEC 14882:2017 که ارائه شده است، ویژگیهای جدید برای این معرفی میشوند تا کد شما تمیز تر و بهتر و در کل رَساتر اعمال شوند. این مقاله را برای مطلع شدن از جزئیات بیشتر بخوانید. سیپلاسپلاس ۱۷ چندین ویژگی بزرگ زبان را ارائه میدهد که باعث میشود کد ما زیباتر و بهتر شود. بنابراین بیایید باهم یک نگاهی به این ویژگیها داشته باشیم.
ممکن است شما بگویید که بیشترین ویژگیهای جدید زبان (به جز پیشرفت های کتابخانه استاندارد - STL) برای نوشتن کد ساده تر و پاکتر میباشند. با توجه به مجموعه جزئیات سیپلاسپلاس ۱۷ که بسیاری از چیزهای بزرگ را مورد بررسی قرار داده است، ما امروز تنها برای بعضی از ویژگی ها که از داخل این مجموعه عظیم بیرون کشیدهایم اشاره خواهیم داشت که باعث میشود کد شما فشردهتر و بهینه تر شود.
- پیوندهای ساخت یافته / اعلانهای تجزیه
-
عبارت
Init-statement
برایif/switch
-
متغیرهای درون خطی (
inline
) -
شرط
constexpr if
- و چند موارد دیگر
پیوندهای ساخت یافته، آیا اغلب با tuple ها کار کردهاید؟
اگر نه، پس احتمالاً باید به آن نگاهی کنید.
tuple
ها تنها برای بازگشت مقادیر چند گانه از یک تابع پیشنهاد نمیشوند، آنها پشتیبانی ویژگیای از زبان را داشتند. به طوری که باعث میشود کد ساده تر و پاکتر شود.برای مثال (
std::tie
که از مرجع اصلی سیپلاسپلاس به دست آمده است) به صورت زیر است:std::set<S> mySet; S value{42, "Test", 3.14}; std::set<S>::iterator iter; bool inserted; // unpacks the return val of insert into iter and inserted std::tie(iter, inserted) = mySet.insert(value); if (inserted) std::cout << "Value was inserted\n";
توجه داشته باشید که باید
iter
وinserted
را ابتدا وارد کرده باشید. سپس شما میتوانید ازstd::tie
استفاده کنید. با این حال این بخش کوچکی از کد نمونه است:std::set<S> mySet; S value{42, "Test", 3.14}; auto [iter, inserted] = mySet.insert(value);
اینجا توجه داشته باشید که یک خط به جای سه خط جایگزین شده است! این کد سادهتر و خواناتر و درعین حال ایمن تر است، اینطور نیست؟ همچنین، شما هم اکنون میتوانید از
const
استفاده کنید و آن را به صورتconst auto [iter inserted]
بنویسید که صحیح است.پیوند ساختاری تنها به
tuple
ها ختم نمیشود، چرا که ما سه مورد دیگر را داریم:- اگر مقدار دهی اولیه یک آرایه باشد:
// works with arrays: double myArray[3] = { 1.0, 2.0, 3.0 }; auto [a, b, c] = myArray;
-
اگر مقدار دهی اولیه
std::tuple_size<>
را پشتیبانی کند و تابعget
را فراهم کند که شایع ترین مورد است.
auto [a, b] = myPair; // binds myPair.first/second
به عبارت دیگر، شما میتوانید کلاسهای خود را پشتیبانی کنید، با فرض این که شما تابع
get
را در پیاده سازی رابط کلاس خود اضافه کرده باشید.- اگر مقدار دهی اولیه فقط شامل اعضای عمومی شود در این صورت:
struct S { int x1 : 2; volatile double y1; }; S f(); const auto [ x, y ] = f();
در حال حاضر این روش برای دریافت یک مرجع از یک عضو
tuple
آسان است.auto& [ refA, refB, refC, refD ] = myTuple;
و یکی از جالبترین استفادهها (پشتیبانی از حلقهها است):
std::map myMap; for (const auto & [k,v] : myMap) { // k - key // v - value }
پیوند ساختاری یا تقسیم بندی اعلانها
برای این ویژگی، ممکن است شما نام های دیگری را دیده باشید، "اعلان تجزیه". همانطور که میبینیم، این دو نام در نظر گرفته شده است، اما فعلاً استاندارد سازی در حالت پیشنویسه است و با نام "پیوندهای ساختاری" میباشند.جزئیات بیشتر در رابطه با این مورد در اسناد P0217R3، P0144R0 و P0615R0 موجود هستند. همچنین این مورد با کامپایلرهای
GCC 7.0
،MSVC2017
وClang 4.0
سازگار است.عبارت Init-statement برای if/switch
نسخه جدید عبارت شرطیif
وswitch
در سیپلاسپلاس جدید به صورت زیر است:if (init; condition) , switch (init; condition)
قبلاً باید به صورت زیر مینوشتیم:
{ auto val = GetValue(); if (condition(val)) // on success else // on false... }
در اینجا
val
یک دامنه جدا کننده بدون دارد که باعث "نشت - فقدان" در خاتمه دهنده دامنه خواهد شد. در حالی که شما در نسخه جدید میتوانید به صورت زیر بنویسید:if (auto val = GetValue(); condition(val)) // on success else // on false...
متغیر
val
تنها در داخل عباراتif
وelse
قابل رویت است، بنابراین آن یک "نَشت" نخواهد داشت.condition
ممکن است چندین عبارت باشد نه تنهاif
بنابراین متغیرval
یکی از دو مقدارtrue/false
را خواهد داشت.چرا این ویژگی کاربرد دارد؟
اجازه دهید تا به شما بگوییم زمانی که میخواهید چندین چیز را در یک رشته را جستجو کنید به صورت زیر خواهید داشت:const std::string myString = "My Hello World Wow"; const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" const auto it2 = myString.find("World"); if (it2 != std::string::npos) std::cout << it2 << " World\n"
ما باید از نامهای مختلفی برای
it
استفاده کنیم و یا اینکه آن را با دامنه خاتمه دهنده جدا سازیم.{ const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" } { const auto it = myString.find("World"); if (it != std::string::npos) std::cout << it << " World\n" }
عبارت جدید شرطی
if
در نسخه جدید یک دامنه اضافه را در یک خط ایجاد میکند.if (const auto it = myString.find("Hello"); it != std::string::npos) std::cout << it << " Hello\n"; if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n";
همانطور که قبلاً اشاره شده است، متغیر تعریف شده در عبارت شرطی
if
در بلوک دیگری قابل مشاهده است. بنابراین شما میتواین به صورت زیر بنویسید:if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; else std::cout << it << " not found!!\n";
به علاوه، شما میتوانید آن را با پیوند ساختاری بر اساس کد نمونه از جانب (Herb Sutter) استفاده کنید:
// better together: structured bindings + if initializer if (auto [iter, succeeded] = mymap.insert(value); succeeded) { use(iter); // ok // ... } // iter and succeeded are destroyed here
جزئیات بیشتر در اسناد زیر آمده است:
-
سند
P0305R1
- ویدیو موجود در یوتیوب با عنوان (C++ Weekly - Ep 21 C++17’s if and switch Init Statements)
-
این مورد با کامپایلرهای
GCC 7.0
،MSVC-2017.3
وClang 3.9
سازگار است.
متغیرهای درون خطی (inline)
با شروع مقدار دهی دادههای غیر استاتیک، اکنون میتوانیم یک متغیر عضو را دی یک مکان اعلام کنیم. با این حال، با متغیرهای استاتیک یاconst static
، معمولاً باید آن را در برخی از فایلهایcpp
تعریف کنید. در سیپلاسپلاس ۱۱ و کلید واژهconstexpr
که مارا قادر میسازد تا در یک مکان اعلان و تعریف متغیرهای استاتیک را انجام دهیم، اما این امکان تنها بهconstexpr
محدود میشود.قبلاً فقط روشها/توابع میتوانستند به عنوان
inline
تعریف شوند، حالا شما میتوانید این کار را با متغیر ها در داخل فایل هدر انجام دهید. یک متغیر اعلام شده درون خطی معنای مشاهبی دارد بنابراین همانند یک تابعinline
تعریف میشود. آن را میتوان به واحدهای ترجمه چند گانه نیز تعریف کرد. مثالهای زیر را ببینید:struct MyClass { static const int sValue; }; inline int const MyClass::sValue = 777;
و حتی
struct MyClass { inline static const int sValue = 777; };
همچنین توجه داشته باشید که متغیرهای
constexpr
به طور ضمنیinline
هستند، بنابراین نیازی به استفاده به صورتconstepr inline myVar = 10;
نمیباشد.این ویژگی چرا کد را ساده تر میکند؟
برای مثال، تعداد زیادی از هدرها در کتابخانه تنها تعدادی از روش های (هک) را محدود میکنند (مانند استفاده توابع درون خطی
inline
و یا قالب ها) و در نهایت مزیتconstexpr
این است که مقدار دهی اولیه شما نبایدconstexpr
باشد.جزئیات بیشتر در رابطه با این ویژگی در سند زیر موجود است:
- سند P0386R2
این مورد با کامپایلرهای
GCC 7.0
وClang 3.9
سازگار است اما فعلاً باMSVC
سازگاری ندارد.ویژگی مربوط به constexpr if
ممکن است در بعضی جاها به قابلیتstd::enable_if
در سیپلاسپلاس ۱۴ نگاه کنید که آن به راحتی باconstexpr if
جایگزین میشود.بنابراین، در اکثر موارد، ما اکنون میتوانیم تنها با نوشتن عبارت یک
constexpr if
این کار را بهتر و تمیز تر انجام دهیم. این ویژگی برای برنامه نویسیmetaprogramming/template
بسیار مهم است که احتمالاً طبیعت آن بسیار پیچیده خواهد بود.یک مثال ساده با تابع Fibonacci:
template<int N> constexpr int fibonacci() { return fibonacci<N-1>() + fibonacci<N-2>(); } template<> constexpr int fibonacci<1>() { return 1; } template<> constexpr int fibonacci<0>() { return 0; }
حال میتوان آن را تقریباً در یک حالت نرمال (نسخه بدون کامپایل) نوشت:
template<int N> constexpr int fibonacci() { if constexpr (N>=2) return fibonacci<N-1>() + fibonacci<N-2>(); else return N; }
در رویداد ۱۸ هم جلسات هفتگی سیپلاسپلاس در جیسون ترنر نمونهای را میتوان یافت که در آن عبارت
constexpr if
هیچ منطق اتصال کوتاهی را در زمان کامپایل انجام نمیدهد، بنابراین این کد باید کامپایل شود:if constexpr (std::is_integral<T>::value && std::numeric_limits<T>::min() < 10) { }
در کد فوق برای
T
شما درstd::string
خطایی کامپایل را دریافت خواهید کرد زیراnumeric_limits
برای رشته ها تعریف نشده اند.در جلسات
C++NOW 2017
آقای Bryce Leblbach با عنوان جلسه خود C++17 Features در ۱۶ دقیقه مثال بسیار زیبایی را در رابطه باconstexpr if
زد که میتواند برای تابعget
استفاده شود که آن برای پیوند ساختاری مورد استفاده قرار میگیرد.struct S { int n; std::string s; float d; }; template <std::size_t I> auto& get(S& s) { if constexpr (I == 0) return s.n; else if constexpr (I == 1) return s.s; else if constexpr (I == 2) return s.d; }
قبلاً ما باید به صورت زیر مینوشتیم:
template <> auto& get<0>(S &s) { return s.n; } template <> auto& get<1>(S &s) { return s.s; } template <> auto& get<2>(S &s) { return s.d; }
همانطور که میبینید، مشکل سوال برانگیز اینجاست که کد در این جا ساده تر است. اگر چه در این مورد فقط از یک ساختار ساده استفاده شده است، با برخی از نمونه های واقعی دنیا، کد نهایی باید بسیار پیچیده تر از این باشد بنابراین باید
constexpr if
کد تمیز تری نسبت به این مورد باشد.این مورد با کامپایلرهای
GCC 7.0
،MSVC-2017.3
وClang 3.9
سازگار است.ویژگیهای دیگر
ما میتوانیم در رابطه با بسیاری از ویژگی های جدید سیپلاسپلاس صحبت کنیم اما در این پست ما بیشتر در رابطه با قطعات بزرگتر تمرکز کردهایم. با این حال، فقط برای یادآوری، ممکن است بخواهید ویژگیهای زیر را در نظر بگیرید که آنها نیز کد ها را ساده تر میکنند:- الگو یا قالبها (templates)
- عبارت Fold
- الگو برای کلاس ها
بنابراین برای ذکر ویژگیهای بیشتر در رابطه با نسخه جدید در پستهای آن ها را پوشش خواهیم داد. شک نکنید که، سیپلاسپلاس ۱۷ پیشرفت واقعی را در برابر کد های جمع و جور و آسان فراهم گرده است. یکی از بهترین چیزها
constexpr
است که آن به ما اجازه میدهد کدtemplate/metaprogramming
را به روش کد استاندارد شده بنویسیم. این یک مزیت بسیار بزرگی است.ویژگی دوم: پیوند ساخت یافته (که حتی برای حلقه ها کار میکند) مانند حسی را القا میکند که در زبانهای پویایی مثل Python وجود دارد.
همانطور که میبینید، تمام ویژگیهای ذکر شده در حال حاضر در Clang، MSVC و GCC قابل اجرا هستند. اگر شما با نسخههای اخیر این کامپایلر ها کار میکنید میتواین بلافاصله با سی++ ۱۷ کار کرده و آن را تجربه کنید.
- 4
- 1
- 6
-
اگر شما توسعه دهندهٔ ++C هستید، توصیه میکنم این سری از مقالات را دنبال کنید زیرا در این تاپیک قصد دارم به چکیدهای از آخرین تغییرات مرتبط با سیپلاسپلاس پیشرفته اشاره کنم. بنابراین در بخش اول، مهمترین موارد منسوخ شده، اشکلات رفع شده و ویژگیهای جدید در استانداردهای اخیر را پوشش خواهیم داد که به صورت جزئی خواهد بود و سپس نسبت به هر کدام در مقالات جداگانه به کاربردهای پیشرفتهتر و جزئیات بیشتری اشاره خواهیم کرد.
نقل قولاین مقاله شامل توضیحات مربوط به هستهٔ زبان است، درواقع به ویژگیهای خودِ زبان اشاره میشود نه به اضافات و امکانات جدید از کتابخانهٔ STL. بنابراین در یک مقالهٔ جداگانه به ویژگیهای جدید کتابخانهٔ استاندارد اشاره خواهد شد که به زودی در این مکان لینک میشود.
قبل از شروع، اگر میخواهید به لیستی از تغییرات و ویژگیهای کامل در استانداردها دسترسی داشته باشید به مقالهٔ زیر مراجعه کنید. در مقالهٔ فوق به لیست ویژگیهای جدید در استاندارد ۱۱، ۱۴، ۱۷ و ۲۰ اشاره شده است.
در نظر داشته باشید که بزرگترین بهروز رسانی سی++ در ده سالِ اخیر مربوط به استاندارد ۲۰ است. این نسخه از زبان تقریباً 2.5 برابر بزرگتر از سی++ ۱۰ سال پیش است! این در حالی است که استاندارد ۱۷ تقریباً ۸۰٪ بزرگتر از استاندارد ۰۳ است.
به عنوان مثال، طبق مستندات رسمی پیشنویسهها تغییرات استاندارد از ۸۷۹ صفحه به ۱۸۳۴ صفحه در این استاندارد رسیده است! چیزی حدود ۱۰۰۰ صفحه بیشتر از نسخههای قبلی
تمامی این بهبودها خبر از بهتر شدن و در عین حال پیچیده شدن زبان اما همراه با سادهتر و سریعتر شدن آن میدهد. اما مشکلی که میتواند رخ دهد در این است که یادگیری آن و بهروزرسانی کدها نیز میتواند دردسر ساز باشد.
بنابراین، برای پوشش دادن جزئیات و بهروزرسانیهای بیشتر در این مقاله سعی خواهم کرد که مهمترین موارد را معرفی کنم.
جزئیات ++C نسخه ۱۷ (بهبودها و تغییرات)
بیایید به آرامی شروع کنیم، امروز ما به عناصر حذف شده و یا به موارد بهبود یافتهٔ کتابخانه استاندارد بپردازیم.
معرفی به صورت سلسله مراتبی
- عناصر حذف شده و توسعه یافته (در این بحث)
- شفاف سازی در زبان
- قالبها
- ویژگیها
- تغییرات اول کتابخانه
- تغییرات دوم کتابخانه
مستندات و لینکها
- قبل از هر چیز، اگر شما خودتان میخواهید استاندارد جدید را کاوش کنید آخرین پیش نویسه را در این بخش مطالعه کنید.
- در صورتی که میخواهید بدانید کدام کامپایلر از ویژگیهای جدید پشتیبانی میکند، در این بخش آن را پیگیری کنید.
- علاوه بر این، لیستی از توصیفهای مختصر از تمامی ویژگیهای زبان سیپلاسپلاس ۱۷ تهیه شده است که در این بخش میتوانید آن را ببینید که در قالب PDF از طرف مرجع رسمی میباشد.
مواردی که ترجیح داده شده است که حذف شوند
حذف تریگراف
تریگرافها کاراکترهای ویژه ترتیبی هستند که در موقع عدم پشتیبانی سیستم از نوع ۷ بیتی اَسکی (ASCII) همانند ایزو646
استفاه شوند. برای مثال=??
کاراکتر ویژهای مانند#
تولید شده را در قالب-??
تولید میکند. تمامی مجموعه کاراکترهای اصلی سیپلاسپلاس در قالب7
بیتی اسکی قرار دارند. موضوع فوق به ندرت مورد استفاده قرار میگیرد، بنابراین حذف آن ممکن است به ترجمه ساده کد کمک کند.اگر شما میخواهید اطلاعات بیشتری در رابطه با کارآیی تیرگرافها در سی++ کسب کنید به این لینک مراجعه کنید.
---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
شما جزئیات بیشتر را میتوانید در سند N4086 بیابید.
اگر شما واقعاً به هر نحوی به گرافها در ویژوال استودیو نیاز دارید، نگاهی به مشخصه
/Zc:trigraphs
در بخش پیکربندی داشته باشید. همچنین، کامپایلرهای دیگر ممکن است مواردی را پشتیبانی نکنند. وضعیت انجام شده کنونی در کامپایلر های GCC:5.1 و Clang:3.5 میباشد.حذف کلمه کلیدی register
کلمه کلیدیregister
در استاندارد 2011 سیپلاسپلاس منسوخ شده است و دیگر استفاده از آن معنایی ندارد. این کلمه کلیدی در حال حاضر حذف شده است. این کلمه کلیدی محفوظ است و ممکن است در نسخه های بعدی باز نویسی شود (مثلاautokeyword
به عنوان یک چیز قدرتمند مجددا مورد استفاده قرار گرفته است).جزئیات بیشتر در رابطه با این مورد در
P0001R1
قابل مشاهده است. البته فعلا درMSVC
انجام نشده است اما در کامپایلرهای GCC 7.0 و Clang 3.8 انجام شده است.حذف Operator++ bool
این اپراتور برای زمان بسیار زیادی است که منسوخ شده است! در سی پلاس پلاس ۹۸ تصمیم بر آن گرفته بودند که از آن استفاده کنند اما در نسخه ۱۷ سیپلاسپلاس کمیته موافقت خود را جهت حذف آن از زبان اعلام کرده است.جزئیات بیشتر در رابطه با این مورد در
P0002R1
قابل مشاهده است. البته فعلا در MSVC انجام نشده است اما در کامپایلرهای GCC 7.0 و Clang 3.8 انجام شده است.حذف مشخصات استثنایی از استاندارد ۱۷
در سی پلاس پلاس ۱۷، مشخصات استثنایی بخشی از نوع سیستمی خواهند بود (بهP0012R1
نگاه کنید). با این حال، استاندارد شامل مشخصات استثنایی قدیمی و منسوخ شده اند که به نظر غیرعلمی و غیرقابل استفاده است.void fooThrowsInt(int a) throw(int) { printf_s("can throw ints\n"); if (a == 0) throw 1; }
کد بالا در سیپلاسپلاس ۱۱ رد (منسوخ شده است). تنها اعلامیه استثنایی علمی
throw()
است، به این معنی است که این کد چیزی را در قالبthrow
انجام نخواهد داد. اما از سیپلاسپلاس ۱۱ به اینور، برنامه نویسان توصیه کرده اند که کسی از آن استفاده نکند.برای مثال در کامپایلر Clang 4.0 شما باید خطای زیر را دریافت کنید:
error: ISO C++1z does not allow dynamic exception specifications [-Wdynamic-exception-spec] note: use 'noexcept(false)' instead
جزئیات بیشتر در رابطه با این مورد در
P0003R5
قابل مشاهده است. البته فعلا در MSVC انجام نشده است اما در کامپایلرهای GCC 7.0 و Clang 3.8 انجام شده است.حذف auto_ptr
این یکی از به روز رسانیهای خوبی است که در سیپلاسپلاس ۱۱، ما اشاره گرهای هوشمند را دریافت کردیم :unique_ptr,shared_ptr
وweak_ptr
. با تشکر از این حرکتی که کمیته انجام داده بود، معنای واقعی این به روز رسانی در این بود که زبان میتواند پشتیبانی مناسبی از انتقال منابع منحصربفرد را داشته باشد. در این میانauto_ptr
یک چیز قدیمی و نادرست در زبان بود به نا به دلایلیauto_ptr
در این جا منسوخ شده است و باید به صورت خودکار بهunique_ptr
تبدیل شود.توجه داشته باشیم که
auto_ptr
مدت کوتاهی است که از سیپلاسپلاس ۱۱ به اینور منسوخ شده است و بسیاری از کامپایلر ها منسوخ شدن آن را گزارش میدهند که به صورت زیر خواهد بود:warning: 'template<class> class std::auto_ptr' is deprecated
در حال حاضر آن به وضعیت نامناسب تبدیل شده است، و اساساً کد شما کامپایل نخواهد شد. در اینجا خطا از طرف MSVC 2017 زمانی که از گزینه
/std::c++latest
استفاده کنید اعلام خواهد شد.error C2039: 'auto_ptr': is not a member of 'std'
اگر شما نیاز به کمک از تبدیل از
auto_ptr
بهunique_ptr
دارید، میتوانید Clang Tidy را بررسی کنید، زیرا آن عمل تبدیل خودکار را انجام خواهد داد. اطلاعات بیشتر در سند N4190 موجود است.همچنین موارد مرتبط دیگری با سند N4190 وجود دارند که در کتابخانه خذف شده اند مانند:
- unary_function/binary_function
- ptr_fun()
- mem_fun()/mem_fun_ref()
- bind1st()/bind2nd()
- random_shuffle
قوانین جدید خودکار برای Direct-List-Initialization از سی پلاس پلاس ۱۱ به اینور که ما یک مشکل بزرگی در این رابطه داشتیم:
auto x { 1 };
از
initializer_list
اینطور نتیجهگیری شده است. با استاندارد جدید، ما میتوانیم این مشکل را حل کنیم. بنابراین آن میتواند به عنوان نوعint
که اکثر مردم تصور میکنند شناسایی شود. برای اینکه این اتفاق بیافتد، ما نیاز داریم که دو روش تخصیص مقدار اولیه را درک کنیم: کپی و مستقیم.- auto x = foo(); // copy-initialization
- auto x{foo}; // direct-initialization, initializes an
- // initializer_list (until C++17)
- int x = foo(); // copy-initialization
- int x{foo}; // direct-initialization
برای مقدار دهی اولیه، سیپلاسپلاس ۱۷ قوانین جدیدی را معرفی میکند:
- For a braced-init-list with only a single element, auto
- deduction will deduce from that entry;
- For a braced-init-list with more than one element, auto
- deduction will be ill-formed.
برای مثال:
auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int> auto x2 = { 1, 2.0 }; // error: cannot deduce element type auto x3{ 1, 2 }; // error: not a single element auto x4 = { 3 }; // decltype(x4) is std::initializer_list<int> auto x5{ 3 }; // decltype(x5) is int
جزئیات بیشتر را در سند
N3922
میتوانید مشاهده کنید. همچنین جزئیات در رابطه با فهرست خودکار موجود هستند که توسط جناب آقای Ville Voutilainen اشاره شده است. این اضافات در سیپلاسپلاس از زمانMSVC 14.0
،GCC 5.0
وClang 3.8
کار میکنند.گزینه static_assert بدون هیچ نوع پیغامی
این واضح است که، این به شما این امکان را می دهد که فقط بدون داشتن گذراندن پیام، نسخه دارای پیغام در دسترس خواهد بود. این سازگاری با سایر موارد مانندBOOST_STATIC_ASSERT
وجود دارد.static_assert(std::is_arithmetic_v<T>, "T must be arithmetic"); static_assert(std::is_arithmetic_v<T>); // no message needed since C++17
جزئیات بیشتر در سند
N3928
در دسترس است. پشتیبانی شده درMSVC 2017
٬GCC 6.0
وClang 2.5
.انواع مختلف شروع و پایان در محدوده حلقه
از سیپلاسپلاس ۱۱ به بعد، محدوده مبتنی بر حلقه ها به صورت داخلی تعریف شده است:{ auto && __range = for-range-initializer; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
همانطور که میبینید،
__begin
و__end
دارای نوع مشابه هستند. این ممکن است باعث مشکلاتی شود. برای مثال زمانی که شما چیزی شبیه یک نگهبان (محافظ) که از نوع داده دیگری است را داشته باشید مشکل ساز خواهد بود.در سیپلاسپلاس ۱۷ آن به صورت زیر تغییر کرده است:
{ auto && __range = for-range-initializer; auto __begin = begin-expr; auto __end = end-expr; for ( ; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
انواع
__begin
و__end
ممکن است متفاوت باشد چرا که فقط اپراتور مقایسه مورد نیاز است. این تغییر کلی باعث میشود که این ویژگی تجربه بیشتری را در این زمینه برای کاربران ارائه دهند. جزئیات بیشتر درP0184R0
، پشتیبانی شده درMSVC 2017
،GCC 6.0
وClang 3.6
.- 2
- 1
- 2
-
خلاصه تعریفی از زبان برنامه نویسی سیپلاسپلاس (++C)
با توجه به پیشرفت و توسعهٔ زبانهای برنامهنویسی، به ویژه ظهور زبانهای جدید که جهت حل مشکلات زبانهای موجود و یا با هدف ایجاد انقلاب و یا سهولت برنامهنویسی، یکی از سوألاتی که مدام به ذهن میآید این است که چه زبانی را باید انتخاب کرد که از لحاظ بُعد علمی، اقتصادی و فنی بهترین انتخاب باشد تا با یک خیال راحت به یادگیری آن بپردازیم.
در این مقاله به مزایای این زبان نسبت به دیگر زبانها و همچنین چشماندازی از آیندهٔ زبان اشاره شده است؛ سیپلاسپلاس به عنوان قدرتمندترین زبان برنامهنویسی تا به کنون است که به جرأت میتوان گفت به عنوان یک زبان برنامهنویسیِ غالب بر دیگر زبانهای برنامهنویسی لقب «هیولای زبانهای برنامهنویسی» را به خود اختصاص میدهد. با توجه به ساختار و نقشهٔ راه توسعهٔ خود، هنوز هم به عنوان یکی از پر طرفدارترین و پر کاربردترین زبانهای برنامهنویسی ساخت دست بشر به شمار میرود.
آیا تا به حال فکر کردهاید که یک جهان پیشرفتهٔ متکی به فناوری امروز، وابستهٔ چه چیزهایی است و موتور نامرئی آن چیست؟
اخیراً دانشمند بزرگ، همچنین سازندهٔ زبان سی++ «بیارنه استراس تروپ» در یک سخنرانی ۱ دقیقهای به معرفی موتور نامرئی جهان پرداخته است که در این لینک میتوانید از زبان او بشنوید.
سیپلاسپلاس با قابلیتهای انواع داده ایستا، نوشتار آزاد، چندمدلی، معمولاً زبان ترجمه شده با پشتیبانی از برنامهنویسی ساختیافته، برنامهنویسی شیءگرا، برنامهنویسی جنریک است. C++ به همراه جد خود C از پرطرفدارترین زبانهای برنامهنویسی تجاری هستند بنا بر این در زیر فلسفهای از این زبان را بیان می کنیم:
- زبان ++C طراحی شدهاست تا یک زبان عمومی با کنترل نوع ایستا و همانند C قابل حمل و پربازده باشد.
- زبان ++C طراحی شدهاست تا مستقیماً و بصورت جامع از چندین شیوه برنامهنویسی (برنامهنویسی ساختیافته، برنامهنویسی شیگرا، انتزاع داده، و برنامهنویسی جنریک)
- زبان ++C طراحی شده است تا به برنامهنویس امکان انتخاب دهد حتی اگر این انتخاب اشتباه باشد.
- زبان ++C طراحی شده است تا حداکثر تطابق با C وجود داشته باشد و یک انتقال راحت از C را ممکن سازد.
- زبان ++C از بکاربردن ویژگیهای خاص که مانع از عمومی شدن است خودداری مینماید.
- زبان ++C از ویژگیهایی که بکار برده نمیشوند استفاده نمیکند.
- زبان ++C طراحی شدهاست تا بدون یک محیط پیچیده عمل نماید.
زبان ++C مورد انتخاب برای ساخت نرمافزارهایی با کارآیی بالا است که به طور «مستقیم» به منابع یا تجهیزات و ابزارهای سیستمعامل دسترسی دارند. بنابراین علاوه بر ویژگی سطحِ بالای این زبان شما را قادر میسازد تا به سطوح پایینتر از یک سیستمعامل دسترسی داشته باشید و این امر موجب میشود از قدرت بسیار بالایی در برنامهنویسی بهره ببرید ، لذا در مقایسه با سایر زبانهای برنامهنویسی شما باید از جزئیات بیشتری اطلاع داشته باشید تا بتوانید برنامهٔ فوق حرفهای خود را تولید کنید.
کتابخانهها چه چیزی هستند و در این زبان چگونه است؟
به مجموعههای یکپارچهای از کلاسهای پیاده سازی شده (به صورت فایلهای سرآیند با پیاده سازیهای کد یا اشیای زبان ماشین) که برای برنامهنویسی به کار میروند، یک کتابخانه
C++ گفته میشود و یکی از ویژگیهای بارز آن تولید و دسترسی به کتابخانههای بیشمار است. لیستی از این کتابخانههای همراه با توضیحات در لینک زیر آمده است : A list of open source C++ libraries - cppreference.com
لیست کامل انواع کامپایلرها : List of compilers - Wikipedia
ویژگیهای جدید در ویرایش ۱۱، ۱۴، ۱۷ و ۲۰ چیست؟
زبان C++11 (معروف به C++0x) یک نسخه استاندارد از زبان ++C
است که در ۱۲ آگوست ۲۰۱۱ منتشر و توسط ISO جایگزین C++03 شد این نسخه دارای نشان ISO/IEC 14882:2011 می باشد و در تاریخ ۱۸ آگوست ۲۰۱۴ نسخه جدید آن یعنی C++14 منتشر و جایگزین C++11 شد. امکانات اضافه شده به هسته C++
: یکی از وظایف کمیته استاندارد سازی توسعه هسته زبان است.در توسعه فعلی چندین بخش از زبان بهبود یافته که شامل چندنخی (multithreading) ، پشتیبانی از برنامهنویسی عمومی، مقدار دهی اولیه یکنواخت و پیشرفت عملکرد میباشد. ویژگیهای هسته زبان و تغییرات آن به چهار بخش کلی دسته بندی شداند:
1. پیشرفت در عملکرد زمان اجرا (Run-Time)
2. پیشرفت در عملکرد زمان ساخت (Build-Time)
3. پیشرفت در ویژگی ها (قابلیت استفاده)
4. و قابلیت های جدیدویرایش C++ 14 بر روی اشکالزدائی و بهبودهای جزیی استاندارد قبلی یعنی C++11 تمرکز کرده است؛ این زبان در تاریخ ۱۵ می ۲۰۱۳ منتشر و در ۱۵ آگوست ۲۰۱۴ بعد از رای گیری و انجام تغییراتی جزئی استاندارد این زبان منتشر شد. بدلیل این که عموماً تاریخ انتشار این زبان بطور قابل ملاحظهای دیر هنگام بوده است به C++14 گاهی C++1y نیز گفته میشود. همانند استاندارد C++11 که به آن C++0x گفته میشده و قرار بر این بوده که قبل از ۲۰۱۰ منتشر شود (البته تا سال ۲۰۱۱ انتشار به تعویق افتاد).
گرچه تمامی کامپایلرها درحال کاربروی C++14 هستند اما هنوز تمامی آن ها از C++14 پشتیبانی نمیکنند.
در C++11 و C++14 توابع جدیدی به هسته اصلی زبان و کتابخانه استاندارد آن اضافه شده است که شامل بسیاری از کتابخانههای C++TR1 به استثنای کتابخانهٔ توابع ریاضی ویژه میباشد.ویژگیهای اضافه شده کتابخانه در ویرایش ۱۱
- std::move
- std::forward
- std::to_string
- type traits
- smart pointers
- std::chrono
- tuples
- std::tie
- std::array
- unordered containers
- std::make_shared
- memory model
ویژگیهای اضافه شده به زبان در ویرایش ۱۱
- move semantics
- variadic templates
- rvalue references
- initializer lists
- static assertions
- auto
- lambda expressions
- decltype
- template aliases
- nullptr
- strongly-typed enums
- attributes
- constexpr
- delegating constructors
- user-defined literals
- explicit virtual overrides
- final specifier
- default functions
- deleted functions
- range-based for loops
- special member functions for move semantics
- converting constructors
- explicit conversion functions
- inline-namespaces
- non-static data member initializers
- right angle brackets
ویژگیهای اضافه شده به کتابخانه در ویرایش ۱۴
- user-defined literals for standard library types
- compile-time integer sequences
- std::make_unique
ویژگیهای اضافه شده به زبان در ویرایش ۱۴
- binary literals
- generic lambda expressions
- lambda capture initializers
- return type deduction
- decltype(auto)
- relaxing constraints on constexpr functions
- variable templates
ویژکیهای اضافه شده به کتابخانه در ویرایش ۱۷
- std::variant
- std::optional
- std::any
- std::string_view
- std::invoke
- std::apply
- splicing for maps and sets
ویژگیهای اضافه شده به زبان در ویرایش ۱۷
- template argument deduction for class templates
- declaring non-type template parameters with auto
- folding expressions
- new rules for auto deduction from braced-init-list
- constexpr lambda
- lambda capture this by value
- inline variables
- nested namespaces
- structured bindings
- selection statements with initializer
- constexpr if
- utf-8 character literals
- direct-list-initialization of enums
ویژگیهای اضافه شده به زبان در ویرایش ۲۰
- concepts
- designated initializers (based on the C99 feature)
- [=, this] as a lambda capture
- template parameter lists on lambdas
- three-way comparison using the "spaceship operator", operator <=>
- initialization of an additional variable within a range-based for statement
- lambdas in unevaluated contexts
- default constructible and assignable stateless lambdas
- allow pack expansions in lambda init-capture
- string literals as template parameters
- atomic smart pointers (such as std::atomic<shared_ptr<T>> and std::atomic<weak_ptr<T>>)
- removing the need for typename in certain circumstances
- new standard attributes [[no_unique_address]] [[likely]] and [[unlikely]]
- calendar and time-zone additions to <chrono>
- std::span, providing a view to a contiguous array (analogous to std::string_view but span can mutate the referenced sequence)
- <version> header
- feature test macros
- bit-casting of object representations, with less verbosity than memcpy() and more ability to exploit compiler internals
- conditional explicit, allowing the explicit modifier to be contingent on a boolean expression
- constexpr virtual functions
- ranges (The One Ranges Proposal)
- concept terse syntax
- constexpr union, try and catch dynamic_cast and typeid, std::pointer_traits
- various constexpr library bits
- immediate functions using the new consteval keyword
- signed integers are now defined to be represented using two's complement (signed integer overflow remains undefined behavior)
- a revised memory model
- coroutines – already experimentally supported in Clang 5
- modules – experimentally supported in Clang 5 and Visual Studio 2015 Update 1 as well as GCC
- various improvements to structured bindings (interaction with lambda captures, static and thread_local storage duration)
- contracts have been removed (see list of features deferred to a later standard)
- use of comma operator in subscript expressions has been deprecated
- constexpr additions (trivial default initialization, unevaluated inline-assembly)
- using scoped enums
- various changes to the spaceship-operator
- DR: minor changes to modules
- constinit keyword
- changes to concepts (removal of -> Type return-type-requirements)
- (most of) volatile has been deprecated
- DR: [[nodiscard]] effects on constructors
- The new standard library concepts will not use PascalCase (rather standard_case, as rest of standard library)
- text formatting (chrono integration, corner case fixes)
- bit operations
- constexpr INVOKE
- math constants
- consistency additions to atomics (std::atomic_ref<T>, std::atomic<std::shared_ptr<T>>)
- add the spaceship (<=>) operator to the standard library
- header units for the standard library
- synchronization facilities (merged from: Efficient atomic waiting and semaphores, latches and barriers, Improving atomic_flag, Don't Make C++ Unimplementable On Small CPUs)
- std::source_location
- constexpr containers (std::string, std::vector)
- std::stop_token and joining thread (std::jthread)
- Many new keywords added (and the new "spaceship operator", operator <=>), such as concept, constinit, consteval, co_await, co_return, co_yield, requires (plus changed meaning for export), and char8_t. And explicit can take an expression since C++20. (Most of) the use for the volatile keyword has been deprecated.
- C++ has added a number of attributes over the years, including new in C++20, [[likely]] and [[unlikely]]; and [[no_unique_address]].
- etc...
کتابخانههای استاندارد چیست و در نسخههای جدید چگونه در دسترس هستند؟
در زبان برنامهنویسی ++C کتابخانهٔ استاندارد سی++ مجموعهای از کلاسها و رویهها است که در هسته زبان نوشته شدهاند و قسمتی از استاندارد ISO سی++ میباشند.
در سال ۱۹۹۸ استاندارد ++C شامل دو بخش هسته زبان و کتابخانه استاندارد++C است. این کتابخانه شامل بیشتر بخشهای STL و کتابخانه استاندارد C است. بیشتر کتابخانههای ++C در استاندارد وجود ندارند و یا استفاده از تعریف قابلیت پیوند کتابخانهها را میتوان در زبانهایی مانند فرترن، C، پاسکال، بیسیک نوشته شوند. البته با توجه به ویژگیهای کامپایلر مشخص خواهد شد که کدام زبان را میتوان استفاده نمود.
کتابخانهٔ استاندارد ++C شامل کتابخانه استاندارد C با یک سری تغییرات برای بهبود عملکرد است. بخش بزرگ بعدی این کتابخانه STL است. STL شامل ابزار بسیار قدرتمندی مانند نگهدارندهها (مانند vector و list)، تکرارکنندهها (اشارهگرهای عمومی شده) برای شبیهسازی دسترسی مانند آرایه الگوریتمهایی برای جستجو و مرتبسازی در آنها وجود دارند. نقشهها (نقشههای چندگانه) (آرایه شرکتپذیر) و مجموعهها (مجموعههای چندگانه) واسطهای عمومی فراهم میسازند. در نتیجه با استفاده از قالب تابع، الگوریتمهای جنریک با هر نگهدارنده و دارای تکرارکننده عمل نماید. همانند C ویژگیهای کتابخانه را میتوان با استفاده از شبه دستور include# شامل یک سرآیند استاندارد اضافه نمود. C دارای ۶۹ کتابخانه استاندارد است که ۱۹ تا از آنها نامناسب تشخیص داده شدهاند.
استفاده از کتابخانهٔ استاندارد - مانندstd::vector
یاstd::string
به جای آرایههای C موجب ایجاد برنامههای مطمئن تر شده است.
STL در آغاز محصولی جداگانه از HP و سپس SGL پیش از ادغام در کتابخانه استاندارد ++C بودهاست. استاندارد عبارت STL را بکار نمیبرد بلکه آن را بخشی از کتابخانه میداند اما مردم هنوز هم آن را برای جداسازی بخشهای مختلف کتابخانه با این نام بکار میبرند. (جریانهای ورودی/خروجی، جهانیسازی، تشخیص، زیرمجموعه کتابخانه C)
بیشتر کامپایلرها کتابخانه استاندارد و STL را پیادهسازی مینماید. پیادهسازیهای مستقلی نیز همانند STLport نیر وجود دارند. پروژههای دیگر نیز پیادهسازیهای خود را از STL با توجه به اهداف خود بوجود میآورند.
روش جدیدی جناب بیجارن در نظر گرفته که کتابخانه های استاندارد ++C علاوه بر اینکه توسط خود کامپایلرها در دسترس و قابل استفاده هستش بلکه توسط کتابخانه STL و Boost نیز می توان دسترسی به مجموع عظیمی از کتابخانه ها استاندارد ISO داشت.
ساختار فایلها در این زبان چگونه است؟در رابطه با ساختار برنامه های نوشته شده توسط ++C بدانید که منظور از ساختار در اینجا انواع فایل های موجود در زبان
سیپلاسپلاس است، در این رابطه باید اینگونه اشاره کنیم که در این زبان ما می توانیم از فایل های زیر برای برنامه نویسی استفاده کنیم.-
فایل با پسوند
.c
این فایل منبعی برای کد هایی از نوع زبان C هستند. -
فایل با پسوند
.c++
منبعی برای کد هایی از نوع زبان C و ++C هستند ضعف این نوع فایل در قابل حمل نبودن و عدم شناسایی توسط فایل سیستم ها می باشد. -
فایل با پسوند
.cxx
منبعی برای کد هایی از نوع زبان C و ++C هستند با تفاوت اینکه نسبت به فایل .c++ قابل حمل تر است. -
فایل با پسوند
.cpp
منبعی برای کد هایی از نوع زبان C و ++C هستند یعنی در هر دو نیز قابل استفاده می باشند. این پسوند با تمامی سیستم ها سازگاری دارد و بسیار رایج است. -
فایل با پسوند
.hxx
معمولا فایل با عنوان (هدر/سرصفحه) یاد می شوند و معمولا فقط حاوی اعلان ها میباشند. -
فایل با پسوند
.hpp
معمولا فایل با عنوان (هدر/سرصفحه) یاد می شوند و معمولا فقط حاوی اعلان ها میباشند. این فرمت توسط مارس دیجیتال استفاده می شود. همچنین بورلند و دیگر کامپایلر های سی++ از آن پشتیبانی میکنند. ممکن است در این فایل متغیر ها، ثوابت و توایعی که در فایل منبع اصلی به آن ها اشاره شده است اعلام شود. -
فایل با پسوند
.h
معمولا فایل با عنوان (هدر/سر صفحه) یاد میشوند و معمولا فقط حاوی اعلان ها میباشند این نوع بسیار رایج است و تقریبا با تمامی سیستم ها سازگاری دارد. -
فایل با پسوند
.hh
در این زبان: فایل با عنوان (هدر/سر صفحه) یاد می شوند و معمولا فقط حاوی اعلان ها میباشند. -
فایل با پسوند
.h++
در این زبان: این نوع فایل ها معمولا فایل با عنوان (هدر/سرصفحه) یاد میشوند و معمولاً فقط حاوی اعلان ها میباشند. ضعف این نوع فایل در قابل حمل نبودن و عدم شناسایی توسط فایل سیستم ها میباشد. -
فایل با پسوند
.ixx
در استانداردهای جدید جهت تعریف سند ماژول (اختصاصاً برای کامپایلرهای MSVC) معرفی شده است. - همچنین فایل با پسوندهای cppm، ccm، mxx، cxxm و c++m به عنوان پسوندهای جدیدی در رابطه با خاصیت ماژول از استانداردهای جدید برای کامپایلرهای مدرن هستند.
یک فایل سرآیند با پسوند (.h, .hpp و ...) میتواند شامل محتوای زیر باشد:
- تعریف کلاس
- تعریف توابع درون خطی (Inline)
- اعلام تابع
- اعلام شیء
مثال:
#ifndef CPPFILES_H #define CPPFILES_H extern int status; class CPPFiles { public: CPPFiles(); void myFunction(); inline int safe(int i); }; #endif // CPPFILES_H
یک فایل منبع - سورس با پسوند (.c, .hpp، .cxx و ...) میتواند شامل محتوای زیر باشد:
- تعریف کلاس
- تعریف توابع
- اعلام شیء
مثال :
#include "cppfiles.h" int status = 1; CPPFiles::CPPFiles() { } void CPPFiles::myFunction() { //Do somthing... } int CPPFiles::safe(/*@Param*/) { return /*Somthing...*/; }
انواع فایل هایی که به آنها اشاره شد بسیار است ولی متناسب با محبویت و پشتیبانی کامپایلر ها از این فایل ها در این زبان برای انتخاب آنها مهم است بنا بر این در طی آموزش و تمامی مراحل ما فقط از فایل های .h برای هدر و فایل های .cpp برای منابع استفاده خواهیم کرد.
چرا و چه زمانی باید از فایل های hpp. و چه زمانی از فایل های cpp. استفاده کنیم؟توجه داشته باشید که سیپلاسپلاس از تمامی پسوند فایلهای مذکور پشتیبانی میکند، معمولاً استفاده از فایلهای hpp و h جهت اعلان و تعریفهای اولیهٔ کدها مناسب است و در زمان تعریف کامل عملکرد کد مورد نظر فایل با پسوند cpp پیشنهاد میشود. هرچند استفادهٔ غیر استاندارد نیز پشتیبانی میشود اما باید توجه داشت جهت حفظ ساختار استاندارد روشهای اصولی منطقی و صحیح هستند.
کاربرد این زبان در کجاست؟معمولاً تمامی برنامهها و نرمافزارهایی که به صورت روزمره در زندگی مدرن امروزی مشاهده میکنیم بدون شک توسط زبان های اساسی نوشته شدهاند. به عنوان مثال انواع صنایع موجود در کشورها از قبیل صنعت خودروسازی، صنعت فضایی، سیستمهای معماری و بانکی ، تجهیزات مدرن و سختافزارهای رباتیک، سیستمهای کامپیوتری و یا کنسول هایبازی ، سیستمهای خانگی و یا هوش مصنوعی، تجهیزات مجهز به انواع حسگرها، پزشکی، فضایی، زبانهای برنامهنویسی، سیستمعاملها و بسیاری از موارد دیگری که میتوان نام برد بدون شک توسط این زبان پیاده سازی شدهاند.
چگونه
C++ میتواند در لایه های زیرین (سطح پایین) و بالا (سطح بالا) مورد استفاده قرار بگیرد؟به نقل از سازندهٔ آن، این زبان هر دو ویژگی سطح بالا و سطح پایین را ارائه میکند. سیپلاسپلاس دارای بخشهای سطح پایین است، مانند اشارهگرها، آرایهها و کستها. این ویژگیها تقریباً مشابه همان ویژگی C هستند که ارائه شده است و برای کار با کارهای سختافزاری ضروری هستند. بنابراین اگر میخواهید به امکانات سطح پایین زبان دسترسی داشته باشید، بله سیپلاسپلاس مجموعهای از این امکانات را در اختیار شما قرار میدهد. با این حال، اگر نمیخواهید از ویژگیهای سطح پایین استفاده کنید، نیازی به استفاده از آنها به صورت مستقیم در این زبان نیست. در عوض میتوانید از امکانات سطح بالا از جمله کتابخانههای آن را مورد استفاده قرار دهید. به عنوان مثال اگر نمیخواهید از اشارهگرها و آرایهها استفاده کنید میتوانید از رشتهها و نگهدارندههای استاندارد استفاده کنید که به مراتب گزینههای بهتری هستند.
آیا سیستم عامل ها و نرم افزار های مطرح دنیا توسط این زبان نوشته شده اند؟ دلیل آن چیست؟همانگونه که مشخص است بسیاری از سیستم عامل ها از ابتدا توسط خانواده اسمبل ، C نوشته شده اند که به صورت زیر به تعدادی از آن ها اشاره میکنیم:
- DragonFlyBSD,FreeBSD,OpenBSD,NetBSD
- HP-UX
- Centos,Debian,Fedora,OpenSUSE,RedHat,Ubuntu
- OSX,iOS,Darwin
- OracleSolaris,OpenIndiana
- Cygwin
- Android
- Windows Phone
- BlackBerry
- WindowsXP,Vista,7,8,10
دلیل آن که از زبان هایی مانند
C و ++C برای نوشتن سیستمعامل استفاده میشود قابلیت های مهم آن است به عنوان مثال: کارآیی بالا ، مستقل از سکو، زبان پاسه و غالب بودن و عدم وابستگی آن به زبان های دیگر، ارتباط با سختافزار و تمامی دیوایسها، مدیریت هوشمندانه و همچنین برنامهنویسی آزادانه ، دسترسی به لیست عظیمی از کتابخانهها که میتوان توسط آن ها هر چیزی را که در رویاهای خود به آن فکر میکنید در واقعیت خلق کنید.انواع سخت افزارهایی که این زبان پشتیبانی میکند:
زبان برنامهنویسی سیپلاسپلاس با استفاده از کامپایلرهای قدرتمندی چون GCC، Clang و غیره، طیف گستردهای از سختافزارها و معماریها را پشتیبانی میکند.
مدل ماشین هایی که پشتیبانی میشود : PowerPC , Oracle,Fujitsu,Sun, IBM,Freescale , AMD,Intel
مدل پردازندهها:
- Athlon,Atom,Core,Core2,Corei3/i5/i7,Opteron,Pentium,Phenom,Sempron,Turion,etc
- Itanium,Itanium2,Itanium29000/9100/9300,etc
- PowerPC,POWER1/2/3/4/5/6/7,G1,G2,G3,G4,G5,etc
- UltraSPARCI/II/III/IV/T1/T2,SPARCT3/T4,etc
کاربرد این زبان در زمینه وب چگونه است؟
در این زمینه معمولاً به دلیل وجود چهارچوبها و زبانهای سادهتری نسبت به سی++ در حوزهٔ وب مانند Php و غیره...، معمولاً فرصت نشده است تا به شناخت کتابخانهها و مزایای این زبان در این حوزه پرداخته شود. با توجه به توسعههای اخیر صنعت وب دانشمندان به این نتیجه رسیدهاند که جهت افزایش کارایی در زمینهٔ وب و از بین بردن محدودیتهای وابسته به مرورگرهای اینترنتی، از فناوریهای بهتری مانند wasm نیز پرده برداری شود که در این فناوری سی++ گزینهٔ پشت پردهای از این فناوری محسوب میشود که اجازه میدهد با اجرای کدها و دسترسی به رابطهای برنامهنویسی پیشرفته یک دنیای جدیدی از فناوری وب را ارائه کند. این فناوری با عنوان Web Assembly شناخته میشود که اجازه میدهد برنامههای نوشته شده توسط سی++ در مرورگر به عنوان یک پلتفرم جدید اجرا شوند.
البته این تنها روش نیست، سی++ به لطف کتابخانههای عظیم خودش قادر است هر چیزی را در اختیار برنامهنویس قرار دهد. به عنوان مثال دسترسی به کتابخانههای عظیم Qt، Wt این امکان را فراهم میکنند که به راحتی یک سیستم ابر پیشرفتهٔ تحت وب را به کمک این زبان پیاده سازی کنید که هیچ نوع سیستم موجود در وب قابل رقابت و مقایسه با ویژگیها و نتایج خارقالعادهٔ آن نخواهد داشت.
در مثال زیر یک سیستم مدیریت محتوا به صورت آزمایشی پیاده سازی شده است که میتوانید نتایج خارقالعادهٔ آن را مشاهده کنید.
همچنین توجه کنید که این تنها کاربرد سی++ در وب نیست، حقیقت آن است که وبسایتهای بزرگی همچون فیسبوک، گوگل و غیره هستهٔ وبسایتهای خود را توسط این زبان توسعه دادهاند که دلایل آنها مصرف بهینهٔ تجهیزان سختافزاری و دسترسی به ویژگیهای سیستمی بسیار زیاد و امنیت بسیار بالا است. احتمالاً در رابطه با موتور قدرتمند v8 Engine شنیدهاید، این یک موتور اساسی برای محصولات گوگل است که کاملاً تحت سی++ توسعه یافته است. برخی از محیطهای برنامهنویسی مانند Node.JS تحت آن قدرت گرفتهاند.برخی از محصولات اساسی و معروف که بخش عمده و یا به صورت کامل توسط سیپلاسپلاس نوشته شدهاند (این لیست تنها شامل برجستهترین محصولات است) :
-
سیستمعاملها
- ویندوز
- مکینتاش
- لینوکس
- آیاواس
- اندروید
-
مرورگرها
- اُپرا
- فایرفاکس
- گوگل کروم
- مایکروسافت اِدج
- اپل سافاری
-
نرمافزارهای کاربردی و مهندسی
- تمامی محصولات قدرتمند Adobe مانند فوتوشاپ، افترافکت و غیره...
- تمامی محصولات Autodesk مانند Maya، 3dsMax و Autocad
- مجازیسازها مانند Virtual Box و VMware
- محصولات مایکروسافت مانند Visual Studio و Office
- محصولات اپل مانند iTunes، Xcode و غیره...
-
بازیها و صنایع مرتبط
- توسعهٔ کنسولهای بازی Playstation و Xbox
- اکثر بازیهای خارقالعاده در سطح AAA
-
پیامرسانها
- تلگرام
- اسکایپ
- موتورهای دیتابیس مانند MySQL و غیره...
- کتابخانهها و ابزارهای پیشرفتهٔ توسعه
- ابزارهای مرتبط با فناوریهای روز مانند Blockchain و غیره...
- زبانهای برنامهنویسی مانند Swift و غیره...
- راهاندازها و ابزارهای قدرتمند AMD، Intel و NVIDIA Geforce و پلتفرمهایی مانند Cuda.
- و هزاران و میلیونها ابزار و برنامههایی که در زندگی روزمره با آنها سرو کار داریم.
اشاره ای بر انواع موتور های دیتابیس که توسط ++C پشتیبانی میشوند :
- SQL
- NoSQL
- SQLite
- MySQL
- Sybase Adaptive Server
- SQL Server
- Oracle
- PostgreSQL
- IBASE : Borland
- IBM DB2
متأسفانه به دلیل عدم اطلاع و شناخت کافی از حقایق این زبان، توصیه برای یادگیری زبانهایی مانند Java و #C و مشابه آنها ممکن است بر اساس علاقههای فردی و تعصب باشد. بنابراین توصیه میشود حتماً در مورد تفاوتهای ساختاری و مزایای زبانها حتماً تحقیق شود.
چگونه باید طراحی رابط کاربری را انجام دهیم؟
برای طراحی رابط گرافیکی ابتدا باید ذهن خود را از محیط VS و همچنین کنسول کنار بکشید لذا برای این کار کتابخانه های مخصوصی در نظر گرفته شده است به صورت زیر:
- FLTK
- nana
- WxWidgets
- OWLNext
- GTK+
- glibmm
- gtkmm
- goocanvasmm
- libglademm
- libgnomecanvasmm
- webkitgtk
- flowcanvas
- evince
- Qt
- libdbusmenu-qt
توسط این کتابخانه های میتوان محیطهای کاربری را فراهم ساخت. در این میان دو کتابخانهٔ wxWidgets و Qt بسیار قدرتمند عمل کردهاند که بین این دو نیز Qt با قدرت بسیار زیادی از رقیب خود یعنی wxWidgets پیشی گرفته است و معمولاً پروژههایی که در آن رابطکاربری خلاقانه (Creative) و مدرن مطرح است حرف از Qt به گوش میرسد (کیوت یک چهارچوب جامع جهت طراحی رابطهای کاربری قدرتمند است).
پیشنهادات ما استفاده از مقالات خارجی و منابع رسمی میباشد:
- http://en.cppreference.com/w
- Learn C++
- https://www.learn-cpp.org
- Learn C++ (Introduction and Tutorials to C++ Programming)
- http://www.cplusplus.com
نگاهی به کاربرد این زبان در بین فناوریهای جدید!
سیپلاسپلاس همچنین به عنوان یکی از قدرتمندترین و محبوبترین زبانهای برنامهنویسی در دنیای فناوری شناخته میشود و در صنعت بلاکچین نیز یک قدرت غالب است. زبان شیءگرایی برای توسعه بلاکچین مناسب است، زیرا از همان اصول کپسولهسازی، انتزاع، چندریختی و مخفی کردن دادهها استفاده میکند. به عنوان مثال بلاکچین از ویرایشهای ناخواسته از دادهها جولوگیری میکند که به عنوان یکی از چهار زبان برنامهنویسی آینده دار میتوان به آن اشاره کرد.
همچنین توجه داشته باشید که فناوریهای دیگری مانند مباحث Cross-Platform و رشد بسیار شدید فناوری IoT این زبان به عنوان یک زبان پیشتاز در این حوزه است که در کنار بسیاری از کاربردهای اساسی خود میتوان به عنوان یک ابزار اساسی و کاربردی به آن در آیندهای که از همین حالا شروع شده است اشاره داشت.
آیا با
++C میتوان برنامههای موبایلی مانند Android , iOS و غیره را تولید کرد؟پاسخ، بله!
متأسفانه این مورد هم مانند حوزهٔ وب به خاطر عدم شناخت و تبلیغات کافی از ذهن بسیاری از افراد به یک گزینهٔ بی اهمیت تبدیل شده است، اما با توجه به رشد روز افزون و ایجاد ابزارهای ضعیف، نیاز به شناخت این زبان و ابزارهای واقعی و قدرتمند آن الزامی شده است. برای مثال در حوزهٔ موبایل ابزارهایی مانند Xamarin و یا Flutter این روزها سرو صدای بسیاری کردهاند، اما واقعیت این است، آنها هیچگاه نتیجهٔ واقعی و مشابه به زبانهای پیشفرض پلتفرمهای توسعه را ندارند و نخواهند داشت. فناوری چند-سکویی به معنای واقعی تنها در ابزارهایی مانند Qt Framework و سی++ خلاصه میشود که به شما اجازهٔ تولید و توسعهٔ کدهای خود را به صورت بومی در پلتفرم هدف فراهم میکند.
پیشنهاد ما در رابطه نحوه شروع برای یادگیری و آشنایی با زبان و انواع کتابخانه ها به صورت زیر است:
- قبل از هر چیز هدف خود را در رابطه با منابع مشخص نمایید، اگر زبان انگلیسی شما خوب است میتوانید در همین قدم اول از منابع رسمی و استاندارد که بی نقص هستند استفاده کنید.
- سعی کنید اگر قرار است این زبان را یاد بگیرید عملا با آن درگیر شوید.
- از مقدمات برنامه نویسی شروع کنید و حتما در رابطه با تاریخچه زبان و اهداف آن تحقیق کنید.
- شرکت و سازمان های بزرگ و موفق را الگو قرار دهید.
- اگر هدف شما سریع رسیدن به پول بدون در نظر داشتن کیفیت و اهداف بزرگ از پروژه هستش به هیچ عنوان سراغ این زبان نروید زیرا C++ برنامه نویس مشتاق به حرفهای شدن را میطلبد نه برنامهنویس راحت طلب.
- حتماً سیپلاسپلاس مدرن را بیآموزید. استانداردهای مدرن شامل نسخههای ۱۱، ۱۴، ۱۷ و ۲۰ هستند.
- برای استفاده و کار با کتابخانههای این زبان بهتر است کتابخانههای پیشفرض STL را به خوبی یاد بگیرید.
- برای توسعه هرچه بیشتر پروژه و استفاده از انواع قابلیتها توسط این زبان میبایست از کتابخانههای دیگر استفاده کنیم که در این میان در رابطه با بخش طراحی و رابط کاربریQt، GTK, MFC, SDL , wxWidgetsمناسب است که پیشنهاد ما در میان این لیست (Qt) خواهد بود که تحت آن میتوان مدرنترین طراحی ها را خلق نمود.
- برای کار با شبکه کتابخانههای Curl, Poco, Qt, RakNet, ReplicaNet, SDL موجود هستند و در بین اینها Curl بهترین گزینه میتواند باشد.
- برای کار با 3D بعدی کتابخانه مخصوص OpenGL یا باز همان Qt را که بر پایه موتور OpenGL است پیشنهاد میکنیم و یا میتوانید از کتابخانه های مخصوص DirectX و OpenGL و حتی نسخههای توسعهٔافته به نام Vulkan را به صورت تخصصی استفاده یاد بگیرید.
- در رابطه با 2D نیز از OpenGL، Direct2D, GDI و GDI+ میتوان استفاده کرد.
- در مورد Sound از کتابخانه های مطرح OpenAL, Fmod و Bass استفاده کنید.
- در مورد بحث فیزیک کتابخانه های Nvidia Physix, Nvidia Apex, Bullet, Box2D, ODE, Open Dynamics
- در رابطه با هوش مصنوعی کتابخانه های OpenAI, FEAR, OpenSteer, PathLib مطرح هستند.
- برای کار با پردازش تصویری OpenCV, OpenNI پیشنهاد میشود.
- برای کار با پردازش موازی OpenCL, OpenML, CUDA مناسب است.
- برای اسکریپت نویسی Lua, LuaPlus, Phyton
- برای کار با ورودی ها از OpenInput, Qt, SDL, SFML میتوان استفاده کرد.
- برای بازی سازی کتابخانه های Unreal Engine, OGRE, Irrlicht, KGE مناسب هستند که در بین اینها Unreal Engine بسیار قدرتمند عمل میکند.
- برای طراحی و اجرای وب سایت کتابخانه های WebKit, ClearSilver, Teng مناسب هستند.
- برای توسعهٔ ابزارهای مرتبط با فناوری بلاکچین، میتوان به کتابخانههای قدرتمند و خارقالعادهای به نام EOS اشاره کرد.
لازم بذکر است اینها نمونهای از کتابخانههای بیشمار سی++ هستند و میتوان به کتابخانههای بسیاری اشاره کرد که خارج از گنجایش این مقاله است.
منابع فارسی برای یادگیری سیپلاسپلاس مدرن چیست؟
متأسفانه منابع فارسی برای این زبان معمولاً متعلق به مباحث دانشگاهی و مفاهیم مرتبط به سیپلاسپلاس سنتی است (مربوط به ۳۰ سال پیش)! یادگیری این مباحث هیچ مزیتی برای شما نخواهد داشت و به شدت پیشنهاد میشود جهت یادگیری این زبان حتماً به سراغ آموزشهای مدرن بروید.
تنها بسترهای آموزشی مربوط به سیپلاسپلاس جدید در ایران (به زبان فارسی) مرجع آیاواستریم است.
نقل قولامکان بهروزرسانی این پست وجود دارد...
- 3
- 3
- 4
-
مقدمه
در دنیای برنامهنویسی، نوع جوابی که برای سوالات فنی خود میگیرید، هر چقدر که به سختی جواب دادن سوال بستگی دارد، همانقدر هم به روش پرسیدن شما بستگی دارد. با مطالعهٔ این راهنما قادر خواهید بود طوری سوال کنید که به احتمال بیشتری جواب رضایت بخشی دریافت کنید. هدف ما از این سند در مرجع برنامه نویسی ایران، این است که فرهنگ مکاتبه و رسیدگی به مشکلات همدیگر را در زمینههای مرتبط افزایش و بهینه سازی کنیم.
بنابراین، امروزه که برنامهنویسی بیش از پیش گسترده شده، میتوانید از وجود افراد باتجربه استفاده کنید و جوابهای خوبی دریافت کنید. با این حال حتی اگر افراد باتجربه هم برای پرسیدن سوال روشهای توصیه شده در این راهنما را به کار گیرند جوابهای مفیدتری دریافت میکنند.
اولین چیزی که باید درک کنیم این است که افراد باتجربه سوال های سخت و طولانی را دوست دارند که به خوبی ذهن را درگیر میکند. اگر به ما یک سوال جالب توجه بدهید که به آن فکر کنیم از شما سپاسگزار خواهیم شد. سوالات خوب محرک ذهن بوده و یک هدیه هستند. سوالات خوب به ما کمک میکنند تا فهم خود را توسعه دهیم و عموماً باعث آشکار شدن مشکلاتی میشود که ممکن است ما ندانیم یا به آنها توجهی نکرده باشیم. در میان افراد باتجربه یک سوال خوب یک چالش مهیج است.
با این وجود بسیاری از تازهکار ها گمان میکنند که افراد باتجربه در مقابل سوالات ساده با دشمنی و تکبر برخورد میکنند و به نظر میرسد که واکنش گستاخانهای با افراد تازهکار و ناآگاه دارند. اما به هیچ وجه اینطور نیست! چیزی که بدون شرمندگی باید بگوییم، خصومت با افرادی است که ظاهراً تمایلی به تفکر در موضوع ندارند و جواب دادن به سوالشان را به نوعی وظیفهٔ افراد با تجربه میدانند. از دید افراد باتجربه چنین افرادی باعث هدر رفتن وقت میشوند پس وقت خود را صَرف جواب دادن به سوالات بهتر میکنند.
همچین افراد باتجربه بسیار داوطلب هستند و در زمانهایی که مشغول نباشند به پاسخ دادن به سوالات میپردازند. در آن مواقع غرق سوالات هستند. پس بدون ترس سوالات را فیلتر میکنند و ترجیح میدهند که به سوالاتِ بهتر جواب دهند. نوع رفتار شما شایستگی شما را برای دریافت جواب نشان میدهد. افراد شایسته زیرک، اندیشمند، هشیار و علاقمند به شرکت فعالانه در توسعهٔ یک راهحل هستند. بهترین راه برای گرفتن یک جواب سریع و خوب اینست که آن را مانند یک شخص زرنگ و مطمئن بپرسید، شخصی که واقعاً نیاز به کمک در یک مشکل خاص دارد.
قبل از این که سوال کنید
قبل از پرسیدن یک سوال فنی از طریق ایمیل، شبکه اجتماعی یا انجمن یک وبسایت، این کارها را انجام دهید:- سعی کنید جواب خود را با جستجو در ویکیپدیا و یا در قسمتهای ویکی سایت مربوطه پیدا کنید.
- سعی کنید جواب خود را با جستجو در آرشیو انجمنی که میخواهید بفرسیتد، پیدا کنید.
- سعی کنید جواب خود را با جستجو در وب پیدا کنید.
- سعی کنید جواب خود را با خواندن manual (راهنما) پیدا کنید.
- سعی کنید جواب خود را با خواندن FAQ (سوالات متداول) پیدا کنید.
- سعی کنید جواب خود را از طریق بازبینی یا آزمایش پیدا کنید.
- سعی کنید جواب خود را با پرسیدن از یک دوست باتجربه پیدا کنید.
- اگر یک برنامهنویس هستید، سعی کنید جواب خود را با خواندن کدمنبع پیدا کنید.
از فنونی استفاده کنید. برای مثال متن پیغام ارور را در گوگل جستجو کنید. حتی اگر به نتیجه ای نرسید، گفتن اینکه «من عبارت زیر را گوگل کردم، اما چیز امیدوار کنندهای پیدا نکردم» چیز خوبی برای یک گروه پستی یا خبری است، حداقل به این دلیل که مشخص میشود جستجو کمکی نمیکند.
وقت بگذارید. انتظار نداشته باشد که بتوانید مشکل پیچیدهٔ خود را با چند ثانیه گوگل کردن حل کنید. FAQ ها را بخوانید و بفهمید، آرام و باتمرکز بنشنید و کمی در مورد مشکل خود فکر و گمانهزنی کنید. به یکباره تمام سوالات خود را ارسال نکنید فقط به خاطر اینکه اولین جستجوی شما به هیچ جوابی نرسید (یا به جوابهای زیادی رسید). سوال خود را آماده کنید. به آن فکر کنید. سوالات شتابزده به جوابهای شتابزده منجر خواهد شد، یا اصلاً به هیچ جوابی نمیرسد. هر چه بیشتر این را نشان دهید که برای حل مسئلهٔ خود قبل از درخواست کمک، فکر و تلاش کردهاید، همانقدر احتمال بیشتری خواهد رفت که واقعاً به شما کمک کنند.
از پرسیدن سوال اشتباه، اجتناب کنید. اگر سوالی بپرسید که بر اساس فرضهای ناقص و اشتباه است، یک فرد با تجربه ممکن است با این تصور که «یک سوال احمقانه است...» بخواهد به شما یک جواب لفظی و بیفایده بدهد، و به امید اینکه شما درس بگیرید از تجربهٔ گرفتن آنچه پرسیدید، نه آنچه مورد نیاز شما بود. ما وقتی میتوانید به جواب برسید که یک سوال قابل توجه و برانگیزندهٔ ذهن بپرسید، سوالی که بطور ضمنی باعث کمک به تجربهٔ جامعه میشود، نه آنکه فقط بصورت انفعالی خواستار دانش از دیگران باشید.
از طرف دیگر، روشن ساختن اینکه شما توانایی و تمایل کمک در پروسهٔ حل مسئله را دارید، شروع بسیار خوبی است. «آیا کسی میخواهد منبعی معرفی کند؟»، «مثال من چه چیز کم دارد؟»، و «چه وبسایتی را بهتر است بررسی کنم» به احتمال بیشتری جواب خواهند گرفت نسبت به این سوال که «لطفاً روش دقیق کاری که باید انجام دهم را بنویسید.». چون [در حالت اول] شما این را روشن میسازید که واقعاً راغب به تکمیل پروسه [ی حل مشکل] هستید اگر شخصی فقط مسیر صحیح را به شما نشان دهد.وقتی سوال میکنید:
انجمن خود را به دقت انتخاب کنید به این حساس باشید که کجا سوال خود را مطرح میکنید. شما احتمالاً نادیده گرفته خواهید شد اگر:
- سوال شما دارای عنوان مناسب نباشد.
- یک سوال بسیار ابتدایی را در انجمنی پست کنید که انتظار سوالات فنی پیشرفته را دارند. یا بالعکس.
- یک سوال مشترک را در چند گروه خبری پست کنید.
- یک ایمیل شخصی به کسی بفرستید که نه سابقه آشنایی با شما دارد، و نه شخصاً مسئول حل مشکل شماست.
افراد با تجربه سوالاتی که بیجا در مکان خاصی پست شود را پاک میکنند تا کانالهای ارتباطیشان را از غرق شدن در بیربطی حفظ کند. شما نمیخواهید این اتفاق برایتان بیفتد؛ بنابراین اولین قدم این است که انجمن درست را انتخاب کنید. باز هم، گوگل و سایر روشهای جستجوی وب، دوست شما هستند. از آنها استفاده کنید.
رها کردن یک ایمیل به سوی شخص یا انجمنی که با آن آشنا نیستید، در بهترین حالت یک ریسک است. در مورد اینکه آیا سوال شما مورد استقبال واقع میشود یا نه، حدسهای خوشبینانه نزنید. اگر مطمئن نیستید آن را جای دیگری بفرستید یا اینکه از فرستادن آن خودداری کنید.
به یکباره سوال خود را به همهٔ کانال های کمکرسانی ارسال نکنید، این کار مانند فریاد زدن است و افراد را عصبانی میکند. به آرامی از میان آنها گام بردارید.
عموماً سوالاتی که در یک انجمن عمومی و درست (بجا) پرسیده شوند، احتمال اینکه جواب مفید بگیرند بیشتر است تا آنهایی که در جای خصوصی پرسیده میشوند. چندین دلیل برای این وجود دارد. یک دلیل ساده، مقدار منابع پاسخگو است. یکی دیگر تعداد بازدیدکنندگان است؛ افراد باتجربه ترجیح میدهند به سوالاتی جواب دهند که افراد بیشتری را آموزش دهد، تا سوالاتی که فقط به درد افراد کمی بخورد. به وضوح، برنامهنویسان چیرهدست و سازندگان نرمافزارهای محبوب، همواره بسیار بیشتر از توان پاسخگوییشان، پیغامهای انبوه و بیهدف دریافت میکنند. شما با اضافه شدن به این سیل، یکی از آن موارد بسیار زیاد هستید.از عناوین پرمعنا و دارای موضوع مشخص، استفاده کنید
در لیستهای پستی، گروههای خبری یا انجمنهای وب، عنوانِ موضوع، فرصت طلایی شماست تا با حدود ۵۰ کاراکتر یا کمتر، توجه متخصصانِ قابل را جلب کنید. با عناوینی مثل «لطفاً به من کمک کنید»، آن را هدر ندهید (پیغامهایی با اینگونه عناوین به راحتی دور انداخته میشوند). سعی نکنید با عمق اضطراب خود، افراد با تجربه را تحت تأثیر قرار دهید؛ در عوض، از آن فضا برای یک توصیف بسیار مختصر از مشکل خود استفاده کنید.
نامطلوب: کمک! کتابخانه X روی لپتاپ من درست کار نمیکند!
هوشمندانه: با استفاده از امکانY از کتابخانه X برنامه من کار نمیکند!
هوشمندانه تر: با استفاده از امکان Y در کتابخانه X نسخه 5.8 برنامه من کرش (Crash) میکند.
تصور کنید که به یک لیست از سوالات یک آرشیو نگاه میکنید، که فقط خطوط عنوانها نمایش داده میشوند. عنوان پست خود را طوری انتخاب کنید که بخوبی سوال شما را منعکس کنید، تا شخص بعدی که آرشیو را جستجو میکند، بتواند دنبال آن ریسمان (thread) را بگیرد و به یک جواب برسد، بجای اینکه دوباره آن سوال را پست کند.
رسیدن یک سوال در یک پاسخ، به خودی خود مورد شک است، چون آن فقط توسط افرادی دیده خواهد شد که این ریسمان را دنبال میکنند. پس یک ریسمان (تاپیک) جدید را آغاز کنید، مگر اینکه مطمئنید میخواهید فقط از افرادی بپرسید که در حال حاضر در این ریسمان فعال هستند.
پاسخ دادن را آسان کنید پایان دادن سوال با این عبارت که «لطفاً پاسخ خو را به ... بفرستید»، جواب گرفتن شما را کاملاً بعید میسازد.
بصورت واضح، از لحاظ دستوری صحیح، و با املای صحیح بنویسید
مهم است که سوال خود را واضح و خوب بیان کنید. قبل از ارسال سوال خود یکبار متن سوالتان را بررسی و سعی خود را بکنید تا زبان (بیان) خود را بهبود دهید (صیقل دهید). لازم نیست که رسمی و سنگین باشد. در واقع افراد با تجربه به آن طرز بیانی بها میدهند که غیر رسمی، عامیانه، شوخطبعانه و همراه با دقت و ظرافت باشد. اما باید دقیق باشد؛ باید نشانههایی از اینکه که شما اندیشه و توجه میکنید را داشته باشد. این نکته بسیار مهم است که به زبان رسمی آن کانال ارتباطی سوال خود را ارسال کنید. برای مثال اگر در انجمنی که زبان رسمی آن فارسی است سوال خود را به زبان انگلیسی (یا فینگلیش) بنویسید سوال شما معمولا یا پاک خواهد شد و یا نادیده گرفته میشود.
اگر دارید سوال خود را در انجمنی میپرسید که از زبان بومی شما استفاده نمیکند، شما یک میزان محدودی از خطاهای املایی و دستوری خواهید داشت، اما از روی تنبلی دچار خطاهای بیش از حد نشوید (بله، افراد معمولاً میتوانند آن تفاوت را تشخیص دهند). همینطور اگر نمیدانید که شخص پاسخگو چه زبانی دارد، به انگلیسی بنویسید. افراد باتجربه مشغول، سوالات با زبانی که نمیفهمند را نادیده میگیرند، و انگلیسی زبان کاری اینترنت است. با نوشتن به زبان انگلیسی، این احتمال را که سوالتان بدون خوانده شدن پاک شود، به حداقل میرسانید.
سوال خود را در قالبهای استاندارد و در دسترس مطرح کنید
نامه خود را به صورت پاراگرافهایی که از خطوط به هم پیچیده شده تشکیل شدهاند، نفرستید. این کار، پاسخ گویی به قسمتهای مختلف نوشته شما را دشوار میکند. هرگز تصور نکنید که مخاطبین شما قادر به خواند فایلهای اختصاصی مانند Microsoft word یا Excel هستند. افراد مختلف از سیستم عاملهای مختلف و برنامههای متفاوتی برای ویرایش متن استفاده میکنند پس بهترین گزینه این است که فایل خود را به صورت متنی ارسال کنید. در صفحات گفتگو، از اشکال خندان (Smile) و امکانات HTML استفاده نکنید. یکی دو تا از این اشکال ایرادی ندارد. اما در صورت استفاده بیش از حد. بهای سوال شما را کاهش میدهد و احتمال نادیده گرفته شدن سوال شما افزایش پیدا میکند.اگر شما از یک پردازشگر ایمیل با صورت گرافیکی کاربری مانند MS، Outlook، Netscape، Messenger و یا از اینگونهها استفاده میکنید، آگاه باشید که در صورتی که از تنظیمات پیشفرض آن استفاده میکنید، ممکن است این قوانین نقض شوند. بیشتر این پردازشگرها دارای یک دستور در فهرست خود به نام view source هستند از این گزینه در پوشه نامههای فرستاده خود استفاده کنید و فرستادن نوشته ساده (plain tent) بدون ضمایم غیر ضروری را بررسی کنید.
درباره مشکل خود دقیق و آگاه باشید
- نشانههای مشکل ایجاد شده یا bug ها را به دقت و روشنی شرح دهید.
- محیطی که در آن این مشکل ایجاد میشود را شرح دهید. (سیستم عامل، کاربرد و ...) شرکت فروشنده و مدل آنرا هم معرفی کنید مثلاً (Fedora Coret یا Slackware 91 و ...).
- مطالعاتی که بر روی این مشکل انجام دادهاید را شرح دهید.
- مراحل تشخیص مشکل و رفع آنرا که انجام دادهاید، قبل از طرح سوال، شرح دهید.
- هرگونه تغییر در سختافزار یا نرمافزار که اخیراً انجام شده است را شرح دهید.
- تلاش کنید تا به سوالاتی که پیشبینی میکنید از شما پرسیده شوند، پیشتر پاسخ دهید.
حجم مطالب دلیلی بر دقیق بودن آن نیست
باید دقیق و آموزنده بنویسید. این هدف با نوشتن حجم زیادی از دادهها و کدها در نامه تقاضای کمک محقق نمیشود. اگر یک مشکل بزرگ و پیچیده دارید، سعی کنید تا آنرا تا حد ممکن خلاصه و مرتب ارائه کنید. این امر حداقل سه فایده دارد. اول اینکه معلوم شود که شما برای خلاصه کردن سؤال خود تلاش کردهاید یا تمایل بیشتری برای پاسخ به شما وجود خواهد داشت. دوم اینکه با خلاصهسازی پاسخ مفیدتری هم خواهید گرفت؛ و سوم اینکه در حین خلاصه کردن و پیرایش گزارش خود ممکن است بتوانید مشکل را حل کنید یا راه حل کوتاهتری برای آن پیدا کنید.
بدون اطمینان ادعای یافتن یک bug را نکنید!
هنگامی که با یک نرمافزار به مشکل برخوردید، بدون اطمینان کامل ادعای یافتن یک bug جدید را مطرح نکنید. راهنمایی: تا هنگامی که با یک ضمیمه به کد منبع نتوانید مشکل را برطرف کنید یا با آزمایش رگرسیون با ورژن قبلی که نشان دهنده یک رفتار نادرست باشد، شما نباید مطمئن شوید. این امر در مورد وب سایتها و مدارک هم صدق میکند سندی را به عنوان bug یافتید، باید متنی را جایگزین آن کنید یادآوری میشود که کاربران بسیاری هستند که مشکل شما را تجربه نکردهاند. همچنین شما با خواندن مطالب و وب سایتهای مرتبط، در مورد آن نرمافزار آموزش دیدهاید در غیر این صورت شما کاری را اشتباه انجام میدهید و نه نرمافزار.
افرادی که یک نرمافزار را تهیه میکنند، تلاش میکنند تا آن نرمافزار حداکثر کارایی مطلوب را داشته باشد. اگر شما ادعا کنید که یک bug در آن یافتهاید، در واقع کامل بودن کار آنها را زیر سؤال بردهاید و این باعث رنجاندن آنهان میشود، حتی اگر حق با شما باشد. به خصوص ذکر کلمه bug در عنوان نامه، کار سیاست مدارانهای نیست.
وقتی که سوال خود را مطرح میکنید، بهتر است فرض کنید که شما کار اشتباهی را انجام میدهید، حتی اگر مطمئن باشید که یک bug واقعی را یافتهاید. اگر واقعاً این طور باشد، در مورد آن در پاسخها خواهید شنید. با این کار نگهدارندههای نرمافزار از شما عذرخواهی خواهند کرد، همچنین اگر شما اشتباه کرده باشید، باید از آنها عذرخواهی کنید.
به جای حدسهای خود نشانههای مشکل را شرح دهید
نوشتن در مورد اینکه خودتان علت مشکل پیش آمده را چه میدانید، مفید نیست (اگر فرضیات شما بهکلی اشتباه باشد آیا با دیگران مشورت میکنید؟). لذا سعی کنید که به دوستداران کامپیوتر از علائم و نشانههای اولیه مشکل موجود بگویید و نه از فرضیات و تئوریهای خود. بگذارید آنها خود تفسیر کنند و مشکل را تشخیص دهند اگر احساس میکنید که ذکر کردن حدس خودتان میتواند مهم باشد، آنرا روشن و تحت عنوان حدس خودتان بیان کنید و همچنین ذکر کنیدن که چرا این پاسخ نمیتواند جوابگوی مسئله باشد.
هدف را مشخص کنید، نه مرحله
اگر به دنبال این هستید که بدانید چطور باید کاری را انجام دهید (مثل گزارش کردن یک اشکال یا bug )، با شرح دادن هدف خود شروع کنید. بعد از آن فقط برخی از مراحل خاص که برای رسیدن به آن طی کردید و موفق نشدید را شرح دهید.
اغلب، افرادی که به کمک تکنیکی نیاز دارند، هدف بلند مرتبهای را در ذهن میپرورانند و در راهی که فکر میکنند تنها راه رسیدن به هدف است گمراه میشوند. آنها برای کمک گرفتن مرحله به مرحله میآیند اما نمیدانند که مسیر اشتباه است تلاش قابل توجهی برای گذر از این مرحله مورد نیاز است.
سوال نامطلوب: چگونه میتوان در برنامه FooDraw مقادیر RGB رنگ را بر مبنای شانزدهتایی انتخاب کرد؟
سوال هوشمندانه: من تلاش میکنم که جدول رنگها را روی یک تصویر با مقادیر انتخابی خودم قرار دهم. در حال حاضر تنها راهی که به نظرم میرسد اینست که هر ردیف از جدول را اصلاح کنم اما نمیتوانم در برنامه FooDraw رنگها را بر مبنای مقادیر RGB شانزدهتایی انتخاب کنم.
سوال دوم هوشمندانه بود. جواب این سوال ابزار بهتری برای آن کار را پیشنهاد میدهد.
سوال را صریح مطرح کنید
برای سوالهایی که انتهای مشخصی ندارد، بازه زمانی محدودی برای پاسخگویی به آنها در نظر گرفته نمیشود. کسانی که میخواهند پاسخهای مفیدی به شما بدهند، مشغولترین افراد هستند. (چون در اغلب کارها به تنهایی کار میکنند). این گونه افراد نسبت به سوالهایی با بازه زمانی نامحدود حساسیت دارند و تمایل چندانی به پاسخگویی به آنها ندارند.
شما هنگامی که یک پاسخ مفید دریافت میکنید که از پاسخگویی خود در مورد چیزی که میخواهید بهطور صریح پرسیده باشید (از اشارهگر استفاده کند، که بفرستید، پیوست را بررسی کنید یا هر چیز دیگر). این کار تلاش پاسخگو را بر روی هدف شما متمرکز میکند و به طور ضمنی حدی از نظر زمانی برای پاسخگویی و صرف انرژی برای کمک به شما ایجاد میکند. این کار خوبی است.
برای درک دنیایی که متخصصین در آن زندگی میکنند، به مهارت به عنوان یک منبع و زمان فراوان برای پاسخگویی به یک مورد کمیاب فکر کنید. هر چه زمان کمتری را برای پاسخگویی به سوال خود به طور ضمنی در نظر بگیرید، احتمال اینکه جواب واقعاً مناسب از جانب یک فرد خبره و پرمشغله دریافت کنید، بیشتر میشود بنابراین بهتر است که برای سوال خود قالبی در نظر بگیرید که زمان مورد نیاز به پاسخگویی به آن را از جانب یک فرد خبره به حداقل برساند. اما این کار اغلب مشابه سادهسازی یک سوال نیست. به عنوان مثال، ممکن است برای شرح مناسبی از X یک راهنمایی بکنید؟ معمولاً سوال هوشمندانهتری است نسبت به اینکه ممکن است لطفاً X را توضیح دهید!
اگر شما یک کد نادرست دارید، بهتر است در مورد اینکه چه اشکالی دارد بپرسید تا اینکه درخواست کنید کسی آنرا اصلاح کند.
سوالهای بیمعنی را حذف کنید
از به پایان رساندن درخواست سوال خود با جملات بیمفهومی مانند کسی میتواند به من کمک کند؟ یا آیا جوابی وجود دارد؟ پرهیز کنید. اولاً، اگر شرح خود را تا نیمه نوشته بودید، این گونه سوالها زائد هستند. دوماً، به دلیل زائد بودن آنها کاربران آنها را آزاردهنده تلقی میکنند و احتمال دارد که جوابهایی بی عیب و نقص ولی بی اعتنا مانند بله، به شما میتوان کمک کرد. یا خیر، هیچ کمکی نمیتوان کرد به شما بدهند.
به طور کلی، از سوالهای آری یا خیر باید اجتناب شود مگر اینکه تنها جواب بله یا خیر برای شما کافی باشد.
سوال خود را با کلمه «فوری» نشانهدار نکنید، حتی اگر برای شما اینگونه باشد: این مشکل شماست، نه دیگران. اظهار ضرورت کردن نتیجه معکوس میدهد. بیشتر کاربران به راحتی اینگونه سوالها را که با خودخواهی و گستاخی درخواست توجه فوری و ویژه میکنند را حذف میکنند.
تنها یک شبه استثناء وجود دارد. اگر شما در یک محل با مرتبه بالا و با یک نرمافزار کار میکنید و از نظر زمانی تحت فشار هستید، گفتن مودبانه محدودیت زمانی خود میتواند مؤثر باشد تا دیگران را به پاسخ دادن به شما ترغیب کند.
البته این کار ریسک بالایی دارد، چون معیار جالب بودن مسائل از نظر کاربران دیگر با شما متفاوت است. به عنوان مثال فرستادن نامه از یک ایستگاه فضایی بینالمللی قانع کننده است اما از جانب یک انسان با احساس خوب و مهربان یا یک سیاستمدار خیر. در واقع، نوشتن کلمه «فوری» باعث میشود که از سوال شما اجتناب و دوری شود حتی اگر از نظر آنها مهم باشد. اگر فکر میکنید که این امری مبهم است، دوباره این مطالب را بخوانید تا کاملاً آنرا درک کنید، قبل از آنکه نوشتهای را به جایی بفرستید.
ادب و احترام را رعایت کنید
مؤدب باشید. از جملاتی مانند «لطفاً» و «با تشکر از توجه شما» یا «ممنون از ملاحظه شما» استفاده کنید. به طور واضح بیان کنید که شما اینکه دیگران وقت خود را برای کمک به شما رایگان صرف میکنند، تحسین کنید.
صادق بودن، به اندازه واضح، دقیق، با دستور زبان صحیح و مشروح بودن و پرهیز از قالبهای مالکانه، مهم نیست و حتی جایگزین آنها هم نمیتواند باشد. کاربران بطور کلی علاقه دارند که گزارشهای دقیق تکنیکی از bug ها و ایرادها را هر چند بی ادبانه دریافت کنند تا نوشتههای مؤدب ولی ابهامآمیز. (اگر این امر برای شما مبهم است، به یاد داشته باشید که سوالها را با چیزی که توسط آن میتوان یاد گرفت ارزشگذاری میکنند).
به هر حال اگر مشکلات تکنیکی خود را ردیف کنید، مؤدب بودن شانس شما را برای دریافت پاسخ مفید افزایش میدهد. باید ذکر شود که تنها مخالفتی که از سوی کاربران قدیمی نسبت به این نوشته دریافت کردهایم، در رابطه با توصیههای قبلی ما برای تشکر پیشاپیش است. برخی از کاربران احساس میکنند که این دلالتی به منظوری دارد و نه تشکر. توصیه ما اینست که هم پیشاپیش تشکر کنید و هم بعد از پاسخگویی و یا ادب و احترام را به روشهای دیگری بیان کنید قبلاً با جملاتی مثل: «با تشکر از توجه شما» یا «ممنون از ملاحظه شما».
روش حل را با یادداشت مختصری پاسخ دهید
بعد از اینکه مسئله حل شد، یادداشتی به همه کسانی که به شما کمک کردهاند بفرستید، آنها را از نحوهٔ حل مطلع کنید؛ و باز هم از یاری آنها تشکر کنید.
پاسخ شما نباید طولانی و شامل جملاتی ساده مثل: «ایراد از کابل شبکه بود، با تشکر از همه» باشد. حتی اگر پاسخ ندهید، بهتر از این جملات است. پاسخ کوتاه و خلاصهای شیرین بهتر است از یک مقاله طولانی مگر اینکه عمق تکنیکی مسئله زیاد باشد. ذکر کنید که چه عملی مشکل را حل کرد اما لزومی ندارد که تمام مراحل حل مشکل را گزارش کنید.
برای برخی از مسائل مناسب است که خلاصهای از مراحل رفع مشکل را گزارش کنید. وضعیت نهایی مسئله خود را شرح دهید. توضیح دهید که چه روشی شما را به حل رساند و بعد از آن به دادههایی که جواب نمیرسد اشاره کنید. روشهای اشتباه را باید بعد از جواب صحیح و دیگر مطالب خلاصه بیاورید تا اینکه خلاصه شما تبدیل به یک داستان کارآگاهی نشود. از افرادی که به شما کمک کردند نام ببرید، با این کار با آنها دوست هم میشوید.
در نهایت، این گونه خلاصه نویسی به تمام کسانی که کمک کردهاند، احساس رضایتمندی و نزدیکی به مسئله میدهد و این کم ارزش نیست. اگر شما یک تکنسین یا فرد باتجربه نیستید، مطمئن باشید که این احساس برای راهنماها و متخصصینی که از آنها کمک گرفتهاید، بسیار مهم است.
اگر نفهمیدید...
اگر جواب را نفهمیدید، فوراً تقاضای روشن کردن پاسخ نکنید. از همان اندازههایی که برای پاسخ اولیه خودتان (دستورالعملها ( FAQS)، وب و دوستان ماهر) برای فهمیدن جواب استفاده کنید. سپس اگر باز هم نیاز به شفاف سازی نشان دهید که چه چیزی یادگرفتهاید.
برای مثال تصور کنید که من به شما میگویم: "بهنظر میرسد که شما Zentry گرفته شدهای دارید، باید آنرا تمیز کنید." در این صورت یک جواب نامناسب این خواهد بود: « Zentry چیست؟» و یک جواب خوب این خواهد بود "بسیار خوب، من صفحه اصلی را خواندم و به Zentry ها تحت عنوان سوئیچهای –Z و –P اشاره شده است اما هیچ یک از تمیز کردن Zentry چیزی نگفتهاند. آیا اینها درست است یا من نکتهای را متوجه نشدهام؟"
اخلاق حرفه ای داشته باشید
با توجه به راههای مفصلی که در اینجا گفته شد یا راههای مشابه بعید است که در راههای ارتباطی با افراد باتجربه اشتباه کنید. بهطور دقیقی با جملات متفاوت به شما گفتیم که چگونه میتوان اشتباه کرد. اگر چنین اتفاقی افتاد بدترین کار اینست که از این تجربه خود ناله کنید، ادعا کنید که شفاهاً مورد توهین قرار گرفتهاید، تقاضای عذرخواهی کنید، نقستان را حبس کنید، به شکایت کردن تهدید کنید، از افراد شکایت کنید و غیره. در عوض پیش بروید. این امری طبیعی است. درواقع مناسب و سالم است.
گاهی اوقات افراد بدون هیچ دلیل روشنی شخصاً شما را مورد حمله قرار میدهند حتی اگر شما اشتباهی نکرده باشید (یا فقط در ذهن آنها دچار اشتباه شدهاید) در این موارد، شکایت کردن روشی واقعاً اشتباه است. این افرادِ متجاوز، نادان هم هستند که بدون هیچ دلیلی، خود را با تجربه میدانند یا با آزمایشهای روانشناسی میخواهند بدانند که اشتباه کردهاید یا خیر. خوانندگان دیگر هم آنها را نادیده میگیرند و یا با روش خودشان با آنها برخورد میکنند رفتار اینگونه افراد خود آنها را دچار مشکل میکند که به شما ربطی ندارد.
اجازه ندهید که داخل اینگونه بحثها به دام بیفتید. بعد از اینکه بررسی کردید که آیا آنها واقعاً توهین هستند و نه اشارهای به اشتباه شما و نه اشارهای به اشتباه شما و نه اشارهای زیرکانه به جواب واقعی سوال شما اغلب توهینها نادیده گرفته میشوند.
به اطلاعات موجود در فایل های ارسالی و ضمیمه توجه کنید
در بسیاری از مواقع ممکن است سوال شما همراه با فایل (یا فایل های) ضمیمهای باشد که مشکل را دقیقتر به پاسخ دهندگان شرح میدهد. حتما قبل از ارسال فایل ضمیمه به موارد زیر توجه کنید:- فایل ارسالی حاوی اطلاعات شخصی افراد نباشد. این موارد حریم شخصی افراد را نقض میکند و ممنوع میباشد.
-
در صورتی که سوال شما مربوط به نحوهٔ نمایش آن اطلاعات است میتوانید با ابزار ویرایش تصویر یا فایل، اطلاعات شخصی را حذف کنید.
- 2
-
مقدمه
نقد و بررسی و ارسال نظرات کارشناسی سایت مرجع آی او استریم با هدف شناساندن هرچه بیشتر و بهتر زبانها و فناوریهای برنامه نویسی به مخاطب و همچنین کمک به تصمیمگیری در رابطه با نحوهٔ شروع برنامه نویسی و کسب تجربه میباشد که در کنار آن علاوه بر این هدف ما شناساندن متخصصین به جامعه استارتاپی کشور است.توضیحات کلی
در نقد و بررسیها آی او استریم، پیش از خواندن متن سوالات و پاسخها میتوانید به طور کاملا خلاصه با نکات مثبت و منفی موضوعات مطرح شده و همچنین نظر کلی سایت در مورد زبانهای برنامه نویسی، استارتاپها و ... آشنا شوید.سیستم اعتبار این قابلیت را فراهم می سازد تا کاربران از طریق واکنش هایی که دیگران به مطالب آن ها می دهند، امتیاز کسب نمایند. امتیاز کل کاربر که از سرتاسر سایت کسب کرده است در نمایه وی نمایش داده میشود که موجب نمایش اعتبار واقعی آن در مرجع میشود.امتیازها
امتیازهای مرجع از کمترین امتیاز ممکن (۲۰-) آغاز شده و به بهترین امتیاز ممکن (۲۰+) ختم میشود.- 1
-
با سلام و احترام،
دوستان از اینکه بستری برای دوره هم بودن جامعه برنامه نویسان استارتاپی ایران ایجاد شده بسیار خوشحالیم!
امیدواریم که وقتی این متن رو میخونین در نبرد همیشگی روزانهتون با باگها پیروز میدان بوده باشین. لطفا قبل از شروع، یه فنجان دمنوش، چایی یا قهوه بردارین و بعد ادامهٔ متن رو بخونین. بله جدی گفتیم… همین الان برین اینکار رو بکنین… ما همین جا منتظرتون هستیم [چند دقیقه بعد] سلام دوباره. نوشیدنی خوبی به نظر میاد، بوش حتی از پشت اسکرین هم اینجا میرسه
اگه تازه به عنوان مهمان وارد مرجع شدین میتونید در صورت تمایل ثبت نام کنید. دقت کنید که ثبت نام برای همگان رایگان هست اما بر اساس قوانین ذکر شده دسترسیها به صورت کامل برای گروههای پیش فرض ثبت نام شده آزاد نیست. توجه داشته باشید که، برای دسترسی به گروههای برتر باید فعالیتهای شما طبق شرایط ذکر شده تایید شود. در مرجع معرفی نام و نام خانوادگی بسیار مهم است! چرا که در معتبر سازی شما به عنوان یک متخصص قابل اعتماد بسیار مهم است. بنابراین بد نیست خودتون رو در بخش درباره من معرفی و نام نمایشی کاربری خودتون رو به صورت واقعی وارد کنید.
نقل قولهر سایت یا گروه برای اینکه برای اعضای اون مفید باشه باید قوانینی داشته باشه و ادامهٔ متن در مورد قوانینی هست که هر کس با عضویت، خودش رو ملزم به رعایتشون میکنه.
- 1
مشکل نمایش آیکن با فرمت SVG در برنامه های ساخته شده Qt Qml
در فناوری Qt Quick و QML
ارسال شده در
دلیلش عدم شناسایی فرمت تصاویر تحت پلاگین هستش. شما باید پلاگین
libqsvg
موجود در پوشهٔ plugins و imageformats در کنار برنامتون کپی کنید. در هر سیستم عاملی که باشید این کار باید صورت بگیره.