int main (int argc، char ** argv) {QgsApplication ..." /> int main (int argc، char ** argv) {QgsApplication ..." />
أكثر

مثال QGIS C ++ Hello World تحطم

مثال QGIS C ++ Hello World تحطم


لقد قمت بكتابة تطبيق C ++ / Qt بسيط للغاية باستخدام QGIS يتألف من ملف "main.cpp" على النحو التالي:

#يشمل  int main (int argc، char ** argv) {QgsApplication app (argc، argv، true) ؛ العودة 0 ؛ }

ويتم تعريف ملف مشروع Qt Creator الخاص بي على النحو التالي:

QT + = واجهة المستخدم الأساسية أكبر من (QT_MAJOR_VERSION، 4): QT + = الأدوات TARGET = qgis_test TEMPLATE = app CONFIG + = c ++ 11 SOURCES + = main.cpp HEADERS + = LIBS + = -L / usr / local / lib - lqgis_core QGIS_DIR = /home/rouhullah/Programs/qgis-2.8.1 INCLUDEPATH + = $$ QGIS_DIR INCLUDEPATH + = $$ QGIS_DIR / src / core DEFINES + = CORE_EXPORT = GUI_EXPORT =

تم تجميع البرنامج وربطه ، ولكن يتم الخروج منه بشكل غير متوقع عند تشغيله مع ظهور رسالة الخطأ التالية:

realloc (): مؤشر غير صالح: 0x00007fc3d802e0e0

حتى تشغيل البرنامج في وضع التصحيح ، يتوقف مصحح الأخطاء قبل الوصول إلى نقطة الإيقاف في السطر الأول من ملفالأساسيةوظيفة.

لاحظ أنني قمت بتثبيت مكتبات QGIS من خلال تجميع أكواد المصدر التي تم الحصول عليها من GitHub.


بعد ساعات من تجربة كل ما يمكن أن أفكر فيه ، اكتشفت أخيرًا أن QGIS غير متوافق مع Qt 5.4. ومن ثم ، تمكنت من تشغيل نموذج برنامج تم تجميعه وربطه مقابل Qt 4.8.6.


إلى عن على الكل الأسئلة والملاحظات المتعلقة بـ Cygwin ، يرجى التحقق من الموارد المتاحة في هذا الموقع ، مثل الأسئلة الشائعة ودليل المستخدم وأرشيف القائمة البريدية. إذا كنت قد استنفدت هذه الموارد ، فيرجى إرسال بريد إلكتروني إلى قائمة بريدية مناسبة. يتضمن ذلك ملاحظات حول صفحات الويب ، وأسئلة الإعداد ، وأسئلة حول مكان العثور على الأشياء ، وأسئلة حول سبب تنفيذ الأشياء بطريقة معينة ، وأسئلة حول تفضيلات الألوان لمطوري Cygwin ، وأسئلة حول معنى الرقم 42 ، وما إلى ذلك.

يرجى إرسال إشعار بالمشكلات الفنية (لغة تأشير النص الفائق السيئة ، الروابط المعطلة) المتعلقة بصفحات الويب هذه إلى القائمة البريدية لـ Cygwin.

لو سمحت لا إرسال بريد إلكتروني شخصي مع "أسئلة سريعة" إلى المساهمين الفرديين في Cygwin. القوائم البريدية لـ Cygwin هي أماكن لجميع الأسئلة. حقا. أعني ذلك.

32 بت Cygwin

مساحة العنوان هي عامل مقيد للغاية لـ Cygwin. في هذه الأيام ، لم يعد من الممكن إجراء توزيعة Cygwin كاملة 32 بت ، وستفشل على الأرجح في أماكن عشوائية بسبب مشكلة في استدعاء نظام fork (2).

لذلك نوصي باستخدام 32 بت Cygwin فقط في سيناريوهات محدودة ، مع تثبيت الحد الأدنى فقط من الحزم الضرورية ، وفقط إذا لم تكن هناك طريقة لتشغيل 64 بت Cygwin بدلاً من ذلك.

لقد تم تحذيرك. إذا كنت لا تزال متأكدًا من أنك بحاجة فعلاً إلى برنامج Cygwin 32 بت ، ولا توجد طريقة للتغلب عليه ، فيمكنك تشغيل مثبت setup-x86.exe.

مكتبة الارتباط الديناميكي Cygwin والمرافق هي حقوق نشر ونسخ مؤلفي Cygwin. الحزم الأخرى لها حقوق نشر أخرى.
UNIX & reg هي علامة تجارية مسجلة لمجموعة Open Group في الولايات المتحدة وبلدان أخرى.


لا أعرف الكثير عن المقابس ، لكن فيما يلي بعض التعليقات العامة لبرمجة لغة سي:

  • أنت لا تحرر () ذاكرة الموارد malloc'd أبدًا. وإذا قمت بذلك ، وهو ما يجب عليك فعله ، فإن Resource = "/" سيؤدي إلى تعطل البرنامج عند محاولتك تحرير () تلك الذاكرة.

الأخطاء المحتملة

char ipstr [INET6_ADDRSTRLEN] يعتبر التصريح عن مصفوفة بحجم "طول سلسلة المحارف" أمرًا مريبًا. هل أنت متأكد من أن هذا يخصص مساحة كافية لحرف إنهاء سلسلة فارغة؟

(char *) malloc لا يوجد أبدًا سبب لإلقاء نتيجة malloc في C. بل إنه يحتمل أن يكون ضارًا في C90. يمكنك العثور على موضوعات لا حصر لها حول هذا الموضوع في Stack Overflow.

من الصعب إرضاءه التفاصيل وأسلوب الترميز

من الأفضل دائمًا الإعلان عن كل متغير في سطر بمفرده ، لجعل الكود أكثر قابلية للقراءة ولتجنب الأخطاء مثل int * ptr1 ، ptr2 // ptr2 ليس مؤشرًا على النحو المنشود.


لقد تم التعليق على أنه عند العمل في C ++ ، يجب عليك استخدام std :: string. بافتراض أنك تريد البقاء مع سلاسل النمط C (أو على الأقل فهم كيف يجب أن تعمل معهم ، في حال اضطررت إلى ذلك) ، فلدي الاقتراحات التالية:

يمكن أن تكون tit أكبر مما يسمح به عنوان المخزن المؤقت. [1] في هذه الحالة ، سيتعطل برنامجك أو ما هو أسوأ من ذلك ، استمر في العمل أثناء إتلاف جزء آخر من الذاكرة. لتجنب ذلك ، يجب عليك دائمًا استخدام الوظائف التي تتيح لك تتبع حجم المخزن المؤقت للوجهة واكتشاف الفائض. فمثلا:

هذا له بعض السمات غير المرغوب فيها من حيث أنه سيقطع السلسلة بصمت إذا كان الإدخال أكبر من الوجهة. إذا كنت تعمل على نظام يحتوي على strlcpy غير قياسي ، فإن ذلك يحتوي على بعض شروط الخطأ الأنظف:

بالانتقال على طول النطاق (من الكود الذي يتعطل عند إدخال إدخال كبير ، إلى الكود الذي يقتطع المدخلات ، إلى الرمز الذي يخطئ عندما يكون المخزن المؤقت غير كاف.) ، قد ترغب أيضًا في تخصيص ذاكرة لهذا بشكل ديناميكي.

يؤدي هذا إلى حدوث تعقيدات إذا تم نسخ كائن Book ، لذلك تحتاج إلى التعامل مع ذلك:

ويجب تحريره عند تدمير العنصر الخاص بك:

إذا كان هذا يبدو معقدًا للغاية ، فربما يكون الأمر كذلك بالنسبة لكود C ++ ذي المستوى الأعلى. ستعتني std :: string بكل هذا من أجلك. لاحظ أن تخطيط الذاكرة للكائن الخاص بك سيكون مختلفًا إلى حد كبير مع أساليب الذاكرة الديناميكية هذه. [2]

كقاعدة عامة ، فإن الاضطرار إلى القيام بأشكال مثل هذه غالبًا ما يكون مؤشرًا على أنك تفعل شيئًا خاطئًا. :-) عند كتابة التعليمات البرمجية ومراجعة عمل الآخرين ، أميل إلى محاولة تجنب أكبر عدد ممكن من القوالب غير الضرورية. في كثير من الأحيان ، يمكن أن تؤدي أخطاء القناع هذه ، على سبيل المثال إرسال وظيفة إلى نوع مؤشر وظيفة غير صحيح إلى حدوث أعطال ، أو قد يتعطل التخلص من const عندما يحاول شخص ما تعديل المخزن المؤقت للقراءة فقط. لأسباب مثل هذه ، من الجيد أن تراقب الممثلين غير اللائقين عند قراءة الكود ، وتأكد من عدم تقديمهم بنفسك كودًا كما ينبغي الإساءة مشاعرك. :-) [3]

في حالتك ، تكمن المشكلة في أن السلسلة الحرفية لها النوع const char * ، لذلك يشكو المترجم من أنك تقوم بتمرير هذا إلى شيء لا يحتوي على ثابت. إذن ما عليك القيام به هنا هو:

الحواشي والتعليقات العرضية:
[1] إذا كان هناك أي أشخاص يتحدثون الإنجليزية قد يقرؤون الكود الخاص بك ، أقترح عليك أن تبتكر اسمًا أفضل من اسم المتغير tit.
[2] في المثال السابق ، توجد أحرف العنوان جنبًا إلى جنب مع أي أعضاء آخرين في الفصل. عند استخدام الذاكرة الديناميكية ، يوجد الآن إشارة مرجعية إضافية للمؤشر للوصول إلى الأحرف. في معظم الحالات ، لن يحدث هذا فرقًا ولكن يمكنك التفكير في الحالات النظرية التي يكون فيها الأول مرغوبًا فيه على الأخير.
[3] ملاحظة جانبية: في تجربتي ، هناك طريقة واحدة لإخبار أن شخصًا ما لا يعرف ما يفعله في C / C ++ هي استخدام القوالب. المبرمج القذر سيكتب التعليمات البرمجية التي يرفضها المترجم ، ومن ثم لجعلها "تعمل" بسرعة ، فإنها تقدم قوالب لإسكات تحذيرات المترجم بدلاً من إصلاح المشكلة الفعلية. إذا كنت تعمل ضمن فريق حيث يقوم الأشخاص بذلك ، فأنا أجد أنه في بعض الأحيان يكون مؤشرًا جيدًا للشك في عمل هذا الشخص لأسباب أخرى.


17 إجابات 17

أعتقد أنه يجب أن تبدأ بأنواع البيانات التي قامت اللغة بتضمينها مثل المصفوفات والمؤشرات ، وعندما يفهم طلابك هذه الأنواع ، انتقل إلى الفصول الدراسية و OO ، ثم STL.

السبب هو أنه يمكنك تعليم الأشخاص فهم المصفوفات دون فهم الكثير بخلاف المتغيرات وبنية الكمبيوتر الأساسية ، ولكن لا يمكنك تعليمهم فهم المتجهات دون تعليمهم الفصول أولاً. إذا كنت تستخدم STL من البداية ، فسيتعين على طلابك التعايش مع عدم وجود دليل حول كيفية عمل المتجه بالضبط. وبعد ذلك عندما تصل إلى هذه النقطة ، لن يكون لديهم فهم جيد بما فيه الكفاية للمؤشرات والمصفوفات والأشياء التي تحصل عليها من القيام بأشياء مثل كتابة فئة المتجهات الخاصة بك ، وكتابة فئة القائمة المرتبطة الخاصة بك ، وما إلى ذلك ، والتي ستكون ضرورية لتقدير واستغلال ميزاته. يزعجني الطلاب عندما يقولون "ما هذا؟" ويقول المعلمون "تجاهلها فقط ، وسوف تتعلمها لاحقًا".

و كما ديميان كما ورد في التعليقات ، فإن فك تشفير الرسائل المشفرة نسبيًا التي تحصل عليها من أخطاء القوالب أصعب بكثير من فهم الأخطاء التي قد تحصل عليها من المصفوفات / التركيبات غير القوالب.

لا أشعر بنفس الطريقة تجاه cout و printf. لا يوجد أي مستوى أدنى من الآخر ، باستثناء أن cout يستخدم الحمل الزائد للمشغل.

قد يبدو هذا غبيًا ، لكني كذلك متعصب تماما حول جعل الأشخاص يفهمون اللبنات الأساسية جدًا لـ كل شىء قبل الانتقال إلى الأفكار التجريدية. يجب ألا تستخدم المؤشرات الذكية حتى تصبح بارعًا في استخدام المؤشرات الأولية ، ولا توجد متجهات قبل المصفوفات ، هذا النوع من الأشياء.

غالبًا ما أقول هذا ، لكنني سأقولها مرة أخرى: من الأفضل تعليم الطلاب القسمة المطولة أولاً ثم السماح لهم باستخدام الآلة الحاسبة بدلاً من السماح لهم باستخدام الآلة الحاسبة ثم تعليمهم القسمة المطولة بعد ذلك.

بالنسبة إلى كتب تعليم المبتدئين ، انظر القائمة الرئيسية لكتب C ++ الجيدة.

هذه هي تجربتي الخاصة. خذها مهما كانت قيمتها.

بالنظر إلى الوراء عندما بدأت البرمجة ، كنت أتمنى حقًا أن أتعلم عن الذاكرة أول. لا ، هذا ليس مثيرًا. سوف تجعلك تلمع. لكن تعليمه مفهوم يبعث على السخرية. فقط اعرض جدولًا أحادي الأبعاد واجعلهم يمرون ببعض التمارين الذهنية:

الدرس 1:
هذا هو 10 بايت من الذاكرة. هذا هو الحرف "a" الذي يتم وضعه في رقم الخلية 3. "a" هي القيمة ، و 3 هو العنوان. نعم؟ هذا هو الرقم 3 الذي يتم وضعه في الخلية 5. قيمته 3 وعنوانه هو 5. والآن ماذا يمكن أن يعني الرقم 3؟ حسنًا ، يمكن أن يكون مجرد رقم 3 - أو - يمكن أن يكون مرجعًا له تبوك 3. تمامًا مثل الرقم 1 قد يكون رقمًا أو قد يكون رمزًا لبلد. إنه مجرد رقم ، كل هذا يتوقف على كيفية تعاملنا معه.

الدرس 2:
دعونا نتعلم العد في ثنائي. دعونا نعد حتى 10 باستخدام العد الثنائي للأصابع. مثيرة للاهتمام لا؟ ترى كيف أن هذا يحتاج فقط 4 أصابع؟ لذلك نقول إن هناك حاجة إلى 4 بتات فقط (1/2 خلية). ما هو أعلى مستوى يمكنك الاعتماد عليه من جهة (الإجابة هي 31). ماذا عن عقاربين (الإجابة هي 1023). اشرح كيف أن المزيد من البتات يعني نطاقات أعداد أكبر. ذكرهم أن خلية الذاكرة هي 8 بت. اسأل ماذا يحدث عندما يحتاج الرقم إلى أكثر من 8 بتات. كيف يضعون عددًا متعدد البايت في الذاكرة (بطريقة منطقية)؟ عرّفهم على الأحرف ، والقصيرة القصيرة ، والأعداد الصحيحة ، والأرقام الطويلة.

الدرس 3:
هذا برنامج كتبته بلغة C ++. يستخدم الأعداد الصحيحة 32 بت. وهذا هنا أيضا رقم. لكن هذا رقم يستخدم للإشارة. باستخدام هذا الشيء الصغير ذي النجمة ، فإننا نعد بأن الرقم سيتم استخدامه للإشارة. وهذه هي الطريقة التي نشير بها إلى الرقم الأول. علامة العطف الصغيرة تملأ القيمة بالنسبة لنا. أنيق ، أليس كذلك؟

إلى آخره. بمجرد أن تحصل على الذاكرة الأساسية ، كل شيء آخر هو كعكة. إن الطلاب الفقراء هم الذين يفترضون أن المترجم يقوم بشيء سحري (أو أنه لا يتعين عليهم أبدًا التفكير في إدارة الذاكرة) هم الذين يميلون إلى النضال أكثر من غيرهم. و C ++ يفسد المياه لأن بعض الأشياء يتم تنظيفها تلقائيًا (أي ناقل عادي) بينما لا يتم تنظيف الأشياء الأخرى (على سبيل المثال ، ناقل مخصص باستخدام "جديد"). ولا تجعلني أبدأ باستخدام السلاسل (char * مقابل std :: string - حاول شرح ذلك بدون معرفة المؤشر).

لا أعرف النظام الأساسي الذي ستستهدفه منافسة الروبوت الخاص بك ، ولكن إذا كانت بيئة ذات ذاكرة محدودة ، فإن مهارات إدارة الذاكرة ضرورية.

بمجرد أن تقوم بتعليمهم الأساسيات ، فعندئذ نعم أقول اذهب C ++ على طول الطريق. من الناحية الفنية ، هم مجرد مكتبات مختلفة ، ولكن لا فائدة من الخلط بينها وبين أكثر من نموذج واحد. امنحهم أدوات C ++ (والتي تشمل المؤشرات والمصفوفات).

هل يجب أن أبدأ في استخدام STL من اليوم الأول ، esp. ناقلات أو مجرد التمسك بالمصفوفات القياسية؟ من السهل تقديم المصفوفات ولكن قد يكون من الصعب اكتشاف أخطاء المؤشر.

بالتأكيد انتقل مباشرة إلى استخدام أنواع المكتبات القياسية. إن std :: string أو std :: vector هو ما يجب عليهم استخدامه غالبًا و (الغالبية العظمى من تطبيقات) هذه الأنواع تقدم شكلاً من أشكال اكتشاف الأخطاء ومعالجة الأخطاء ، مع استخلاص العديد من التعقيدات من الطلاب.

يمكنك قضاء جزء كبير من الوقت في تعليم الطلاب كيفية تنظيم الذاكرة وكيفية إدارة الذاكرة (النمط C) ، أو يمكنك مباشرة العمل باستخدام الأنواع الاصطلاحية للغة ثم شرح تفاصيل التنفيذ إذا لزم الأمر (وعندما يكون لديهم فهم أفضل لماهية المصفوفة وأين يتم استخدامها).

بناء جملة std :: vector (إنشاء / قراءة / كتابة) ليس أكثر تعقيدًا من مجموعة C. وبالمقارنة ، فإن إدارة الذاكرة اليدوية وجميع الأخطاء الشائعة التي يرتكبها المتعلمون الجدد باستخدام مصفوفات C هي أكثر صعوبة في التعلم والتعليم والاستخدام.

بالنسبة إلى I / O ، هل يجب أن ألتزم بـ cout ، وما إلى ذلك أم أنك تعتقد أن printf سيكون أسهل في التعلم؟

كوت. شخصيا ، أعتقد أن تعلم cout أسهل. ربما الأهم من ذلك ، يجب عليك اختيار cout لأنه أكثر أمانًا وتنوعًا ويسمح لك بتحديد كيفية طباعة الكائن ، مما يعني أن لديك بالفعل وظائف مضمنة وسلامة الأنواع باستخدام بعض أنواع المكتبات القياسية. أخيرًا ، ستنتهي فقط ببرامج مختلطة عندما تدرك أنها قد تحتاج أيضًا إلى تعلم cout بالإضافة إلى printf.

في الواقع ، أعتقد أنه يجب عليك قراءة Accelerated C ++ بواسطة Koenig و Moo وربما تستخدمها للتعليمات (الإجابة على السؤال 3 بشكل غير مباشر). في الكتاب ، يقدمون std :: cout قبل العودة مباشرة (الصفحة 3) ، ويحفظون المؤشرات والمصفوفات حتى الفصل 10. إذا كان بإمكاني نسخ ولصق مقدمة هذا الكتاب كإجابة على سؤالك ، فسأفعل. (ملاحظة: أوصيك بقراءته من منظور تدريس لغة ++ c).

هل توجد أي موارد عبر الإنترنت لـ C ++ مناسبة للاستخدام لمثل هؤلاء المتعلمين الصغار؟

إذا كنت لا ترغب في استخدام Accelerated C ++ (والتي تفترض بعض الخلفية مع البرمجة بشكل عام) ، فربما ترغب في Eckel's Thinking في C ++. لم أقرأه ، لكنه نص تمهيدي C ++ موزع مجانًا.

شيء واحد يجب مراعاته هو أنه في نماذج بيانات الكود الأول النموذجي من أي شكل (الهياكل ، الفئات ، المصفوفات ، المتجهات ، القوائم) تلعب دورًا صغيرًا جدًا. أنت تتعامل عادةً مع كمية صغيرة جدًا من بيانات المستشعر ، وتستخدمها لتحديد كمية صغيرة جدًا من حركات المشغل.

ولكن ماذا هل تلعب دورًا كبيرًا ، ويمكن أن تكون كذلك جدا يصعب فهم جميع أشكال يتحكم التي تستمر.

لذلك كنت أركز كثيرًا على التحكم. ابدأ بالأساسيات: if ، for ، while. اجعلهم يمارسون هذه كثيرًا. اجعلهم يعرفون هؤلاء جيدًا.

. ولكن بعد ذلك يصبح الأمر أكثر صعوبة. أي شفرة روبوت ذات حجم متوسط ​​تصل في النهاية إلى بعض أنماط التحكم الأكثر تعقيدًا:

حلقة كبيرة "رئيسية" ، هذا يستدعي كل شىء

آلات الدولة (هذه تظهر كثيرًا)

حفظ القيم السابقة / عداد التشغيل (مثل PID)

يصعب على المبتدئين فهمها. التفكير في كيفية انتقال البرنامج عبر كود مثل هذا أمر محير ، قد لا تدركه الآن ، لكنه كذلك. سيعطي طلابك مشاكل أكثر بكثير من اللغة نفسها.

أيضا ، حظا سعيدا! أتمنى أن يمضي الموسم على ما يرام.

  • هل يجب أن أبدأ في استخدام STL من اليوم الأول ، esp. متجه أو مجرد التمسك بالمصفوفات القياسية؟ من السهل تقديم المصفوفات ولكن قد يكون من الصعب اكتشاف أخطاء المؤشر.

تكمن مشكلة المصفوفات في أن أي شيء باستثناء أمثلة الكتب المدرسية البسيطة سيتطلب مصفوفات ذات حجم ديناميكي ، وفي اللحظة التي تحتاج فيها إلى مصفوفات ذات حجم ديناميكي ، يكون std :: vector أسهل بكثير. أيضًا ، الطريقة الوحيدة للتعامل مع المصفوفات ذات الحجم الديناميكي بأمان هي لفها في الفصل الدراسي الخاص بك ، مما قد يكون أمرًا سيئًا من الأمراض المنقولة بالاتصال الجنسي والمتجهات.
على عكس الاعتقاد الشائع بشكل غير مفهوم ، يمكن للطلاب استعمال الميزات التي تتطلب ميكانيكا معقدة ليتم تنفيذها دون معرفة كيفية ذلك ينفذ مثل هذه الوحوش أنفسهم. كما قلت في تعليق: لن تفكر حتى في عدم تدريس السلاسل بلغات أخرى ، فقط لأن تنفيذها معقد ، أليس كذلك؟

لماذا قد تكون مجموعة من اصطلاحات سلاسل التنسيق القديمة التي تجعل برنامجك ينفجر عبر السقف في اللحظة التي تحصل فيها على خطأ (والذي يحدث في اللحظة التي تغير فيها محرفًا في بعض الرؤوس التي تبدو غير مرتبطة) أفضل من النوع الآمن لـ std :: cout ؟

معظم موارد C ++ ، عبر الإنترنت أم لا ، سيئة. وأنا لا أتحدث عن استخدام خطوط أو لغة يصعب قراءتها. أنا أتحدث عن أخطاء واقعية واضحة بشكل صارخ. هناك عدد قليل جدًا من موارد C ++ الجيدة ، معظمها واحد أو عشرين كتابًا. الوحيد الذي أعرفه على الإنترنت هو موقع Bruce Eckel التفكير بلغة C ++.

على مدار عقد من الزمان ، قمت بتدريس لغة ++ C للطلاب ذوي الخلفيات المختلفة جدًا باستخدام Koenig / Moo's تسريع C ++ كقاعدة. لقد تغير مسار عملي كثيرًا في ذلك العقد ، ولم يعد قريبًا من الكتاب ، باستثناء المبدأ الأساسي: استخدم المصطلحات الحديثة والصحيحة والآمنة منذ البداية. لا تعلم طلابك كيفية التعامل مع الذاكرة يدويًا ، فقط لجعلهم يتخلصون من ذلك لاحقًا لصالح مصطلحات أكثر أمانًا. كما ترون في بعض الإجابات المقدمة هنا ، فإن هذا لا يعمل: أولئك الذين قاموا بتعليم الطرق اليدوية أولاً نادرًا ما يفهمون فائدة استخدام المصطلحات الحديثة والآمنة.

إذا كنت ترغب في تعليم C ++ ، فسأبدأ مباشرة ببناء C ++ كمتجه و cout ، بدلاً من مجموعة C الفرعية مثل printf.

هل يجب أن أبدأ في استخدام STL من اليوم الأول.

نعم فعلا. استخدام المصفوفات الأصلية في C ++ عرضة للخطأ وببساطة ممارسة سيئة 99٪ من الوقت.

بالنسبة إلى مؤتمر I / O ، هل يجب أن ألتزم باستخدام cout ، وما إلى ذلك؟

هل توجد أي موارد عبر الإنترنت لـ C ++ مناسبة للاستخدام لمثل هؤلاء المتعلمين الصغار؟

إنهم ليسوا صغارًا جدًا. تعلم البرمجة لا يتطلب الحكمة ، فقط الدافع والعقل المنفتح. لا أستطيع التفكير في أي شيء تم تدريسه في العامين الأخيرين من المدرسة الثانوية من شأنه إعداد الطالب بشكل أفضل لتعلم البرمجة. هل نظرت إلى Bruce Eckel's التفكير بلغة C ++؟ إنه متاح للتنزيل المجاني ومراجعته جيدًا. يرجى تجنب الشعبية ولكن الرهيبة C ++: كيفية البرمجة وجميع سام علم نفسك C ++. الكتب.

لقد تعلمت C ++ في المدرسة الثانوية كلغة برمجة أولى ، على الرغم من ذلك كانت أشبه بـ "C +" ، الآن بعد أن ذكرتها ، استخدمنا cout لكتابة نص إلى وحدة التحكم والملفات ، ولكن أيضًا عدد قليل جدًا من وظائف C (كانت getch () المفضلة لدي).

أعتقد أن الطريقة الأكثر فعالية (وربما الممتعة) لتدريس الأساسيات هي استخدام منهج موجه نحو الهدف: ابدأ بإظهار كيفية إخراج الأشياء ، ثم إدخال لوحة المفاتيح ، ثم إدخال / إخراج ملف بسيط ، إلخ. التقدم إلى نص بسيط- لعبة تعتمد (أو ما يعادلها في الروبوتات). ثم عندما يسألون ، "كيف أفعل س؟" ، يمكنك تقسيم X من حيث الأمثلة التي رأوها بالفعل ، على سبيل المثال "أولاً ستحتاج إلى الحصول على المدخلات من المستخدم كما فعلنا في Z ، بعد ذلك." (من الواضح أنه ليس بهذه السهولة من الناحية العملية حيث من المحتمل أن يكون X شيئًا يحتاجون إلى معرفة إضافية من أجل القيام به ، على سبيل المثال " رسومات ثلاثية الأبعاد "، ولكن لا يزال بإمكانك شرح كيفية القيام بذلك سوف العمل بطريقة رفيعة المستوى).

ستبدأ الأمثلة التي تعرضها لهم كسحر مُلصق بنسخ الصندوق الأسود ، حيث يتم حل ألغازه حيث يتم اكتشاف أجزاء من لغز البرمجة ببطء. على سبيل المثال ، سيتعلم طلابك أساسيات if بسرعة كبيرة ، لكنهم على الأرجح لن يدركوا أن التعبير المنطقي لا يقتصر على الاستخدام ضمن شرط if (مما يؤدي إلى الكلاسيكية إذا (blah) يعود رمز خاطئ).

ستبدو التفاصيل الدقيقة لما إذا كنت ستختار مصفوفة أو متجهًا كحاوية غير ذات صلة بالطلاب في البداية. سيكون المتجه / المصفوفة ببساطة وسيلة للحصول على الكثير من المتغيرات كمتغير واحد ، يمكن الوصول إليها عبر فهرس. التمسك بواحد حيث يمكنك. لن يتم فهم المؤشرات حتى وقت لاحق أيضًا. هذا لا يعني أنه لا يجب عليك شرح الأشياء فقط أنه لا يمكنك شرح كل شيء في وقت واحد ، والأشياء التي تشرحها لن يتم استيعابها بالكامل. يتعلم البشر عضويًا وليس خطيًا. كنت أستخدم cout لزوجين سنوات قبل أن أفهم بشكل صحيح ما هو التحميل الزائد للمشغل!

أوه ، ولا تخافوا من التكرار. "هذا يشبه برنامج Hello World الذي فعلناه - هل تتذكر كيف كتبنا نصًا إلى وحدة التحكم؟" (لا) "دعنا نراجعها مرة أخرى فقط للتأكد." . وطرح الأسئلة! حافظ على تفاعل الطلاب مع الأمثلة الممتعة والكثير من التفاعل.

C ++ هي لغة معقدة ، وبغض النظر عما تفعله ، فإن قدرًا كبيرًا من هذا التعقيد (وتلك الخاصة بالبرمجة بشكل عام) سيضيع على طلابك. كل ما تظهره لهم سيكون جديدًا بالنسبة لهم ، ومعظمه لن يغرق في مستوى عميق من الفهم (على الأقل ، ليس على الفور). كيف تعمل الذاكرة ، وكيف تتفاعل مكونات جهاز الكمبيوتر ، وما هي المكدس والكومة ، والمؤشرات ، والفئات ، وحتى الحلقات وسلاسل if-else لن يتم فهمها بشكل صحيح بالأغلبية. لابأس! ليس من الضروري فهم استخدامها - يمكن كتابة كمية مذهلة من البرامج الرائعة بوظائف 1000 سطر فائقة القبيحة مع تكرار مضاعف خمس مرات إذا كانت s و 43 متغيرًا تسمى أشياء مثل x_2r. الشيء المهم هو أن الطلاب التعلم والتحسين باستمرار. الصناديق السوداء جيدة طالما أنها تصبح شفافة (أو على الأقل رمادية شفافة) على المدى الطويل. بحلول نهاية الدورة ، قد لا يعرفون ما هي أنماط التصميم ، لكن يجب أن يكونوا قادرين على إلقاء نظرة على البرامج التي كتبوها في الأسابيع القليلة الأولى و قرفص في التعليمات البرمجية الخاصة بهم. يجب أن يفهموا بدرجة كبيرة من التفاصيل كيف يعمل البرنامج الأول الذي كتبوه بالفعل (بينما عندما كتبوه لم يكن لديهم أي فكرة). لكنهم لن يعرفوا كل شيء - بعد.


الحصول على بيئة تطوير أكثر تفصيلاً

لنقم & # 8217s بإجراء بعض التغييرات على برنامج Hello.c ولكن دع & # 8217s نجعلها في بيئة تطوير أكثر لائقة & # 8211 نريد ما يسمى IDE (تمثل بيئة تطوير متكاملة) & # 8211 سيقول العديد من المطورين المتشددين الآن أن هذا هراء ولكن مهلا ، أعلم أنه يمكنك طهي شرائح اللحم على النار ولكن عندما تحصل على حفلة شواء لطيفة ، ستستخدم BBQ & # 8230

لغرضنا ، سيقوم IDE المسمى Geany بالخدعة & # 8211 ولكن يجب تثبيته على Raspberry.

وانطلق. سيبدأ التثبيت ولكن سيكون هناك تأكيد مطلوب. سينجح التثبيت ولكن عند محاولة تشغيل البرنامج من سطر الأوامر ، ستتلقى خطأ: تمت كتابة IDE لسطح المكتب XServer الذي يتطلب منا في المقابل التبديل من سطر الأوامر PuTTY إلى اتصال RDP. سوف تجد جيني في القائمة. لقد قمت بالفعل بتحميل مرحبًا ج البرنامج & # 8230

بادئ ذي بدء ، سوف نتأكد من إدخال المؤشر في سطر جديد عند تنفيذ البرنامج هذه المرة & # 8211 يتحقق هذا ببساطة عن طريق إضافة ن إلى الإخراج ، حرف التحكم الذي سيضيف السطر الجديد. نحتاج أيضًا إلى البرنامج لتقديم رمز إرجاع (وإلا فإن المترجم سيشتكي & # 8230) بحيث تتم إضافة سطر آخر: العودة 0

يمكنك الآن الضغط على المفتاح F9 لبدء التجميع & # 8230

يمكننا الآن العودة إلى جلسة PuTTY ومراجعة دليل المصادر باستخدام الأمر ls. مرة أخرى ، سنجد الكود المصدري والملف المترجم & # 8211 الذي يقوم بتنفيذه مرة أخرى سيجعل الآن الإخراج يبدو مختلفًا.


شاهد الفيديو: Hello World - C++ Tutorial For Beginners #3