أهلا ومرحبا بكم مرة أخرى.
في هذه المحاضرة ، أريد أن أتحدث عن بعض الأخطاء الشائعة التي سترتكبها
أثناء البرمجة في c.
قد تكون على دراية ببعض هذه الأخطاء من خلال تحدياتك
السابقة ، وقد واجهت بالفعل هذه الأخطاء بالفعل ، ولكن
هذه هي أكثر أنواع الأخطاء شيوعًا.
الأول هو واضح جدا جدا. إنه يفتقد إلى فاصلة منقوطة.
تذكر أن جميع العبارات في c ستنتهي بفاصلة منقوطة.
إذا لم يكن لديك هناك ، فسوف يشتكي المترجم.
لذا فإن وضع فاصلة منقوطة في غير موضعها أو فقد فاصلة منقوطة
بالكامل هو خطأ شائع حقًا. في هذه الحالة ، نضع فاصلة منقوطة في غير موضعها.
لدينا بيان إذا. نضع فاصلة منقوطة في نهاية تعليمة if.
وهذا في الواقع يتسبب في أن يكون سلوك البرنامج مختلفًا تمامًا.
هذا سوف يجمع في الواقع.
عندما تفقد فاصلة منقوطة ولم يتم تضمينها حتى ، فلن يتم تجميعها.
لكن في هذه الحالة ، سيتم دائمًا تعيين قيمة j على صفر لأنه
تم وضع الفاصلة المنقوطة في عبارة if.
لذا فإن الفاصلة المنقوطة صالحة تمامًا للحصول عليها بعد تعليمة if.
إنه يمثل في الواقع العبارة الفارغة.
وبالتالي ، ليس لديك خطأ من قبل المترجم ،
ولكن هذا سيؤدي إلى مشكلة لأن j لن يتم تعيينه على الصفر أبدًا.
ويمكن أن يكون هذا النوع من الأخطاء شائعًا في الحلقات أيضًا.
عندما يكون لديك حلقة وتضع الفاصلة المنقوطة
في نهاية حلقة for ومن ثم قد يكون لديك قوس ، حيث لا يكون لديك القوس
لأنه سيكون لديك خطأ إذا كان لديك القوس ، فهذا شائع جدًا.
عامل آخر يخلط بين عامل التشغيل ويساوي ويساوي.
ذكر على وجه التحديد أن عامل التشغيل يساوي
يساوي لا يقارن السلاسل. لذا ، إذا كنت تستخدم يساوي يساوي عند
مقارنة سلاسل ، فهذا غير صحيح. ستقوم فقط بمقارنة المراجع.
ولكن إذا كنت تقصد بالفعل تعيين قيمة لمتغير واستخدام
قيم يساوي يساوي ، فستحصل على مترجم.
الآن ، إذا حاولت مقارنة عنصرين ، مثل عددين صحيحين
داخل عبارة if وبدلاً من ذلك استخدمت عامل الإسناد ، فلن يكون
لديك في الواقع خطأ في المترجم ، ولكن هذا التعبير
دائمًا ما يتم تقييمه على أنه صحيح.
لذلك عندما تستخدم يساوي ولا تستخدم يساوي يساوي ، يتم
إجراء ذلك عادةً في عبارة if while do داخل التعبير المنطقي.
وهذا صحيح إلا أن له تأثير التنازل
عن شيء ما مقابل تنفيذ شيء ما.
في هذا المثال
، إذا كان لدينا a يساوي 2 ، فإنه يسند 2 إلى a.
يتم ضبطه دائمًا على صحيح لأن هذا بيان حقيقي لأنك لا تفشل
أبدًا عندما تقوم بالمهمة. ولذا فإن printf ستعمل دائمًا.
ما كنت تقصد فعله هنا هو قول ما إذا كان a يساوي.
لذلك من الشائع جدًا استخدام قيم يساوي بدلاً من يساوي يساوي
ومن ثم عدم وجود خطأ في المترجم.
إذا كنت تستخدم قيم equals في الموقف
الخاطئ ، فقد يكون لديك سلوك
غير متوقع أيضًا ، ولكن سيكون لديك خطأ في
المترجم إذا كنت تستخدمه بشكل غير صحيح للتعيين.
لكن كن حذرًا من هذا مع تساوي بدلاً من يساوي يساوي.
حذف إعلانات النموذج الأولي.
لقد ذكرت أنه من المهم حقًا أن تعلن دائمًا عن وظائفك
في أعلى الملف قبل استخدامها.
ومع ذلك ، هذا لا يحدث دائمًا وهو خطأ شائع جدًا.
وعادة ما يحدث هو أنك ستحصل على خطأ إعلان ضمني في
المترجم.
في هذا المثال ، إذا كان لديك جذر تربيعي محدد لاحقًا
في البرنامج عن المكان الذي تستدعيه فيه أو في ملف
آخر ولم تعلنه صراحة ، فستتلقى
بعض التحذيرات.
سيفترض المترجم أن الدالة ترجع عدد صحيح.
من الأفضل دائمًا تضمين إعلان النموذج الأولي هذا في الجزء
العلوي لجميع الوظائف التي
تستدعيها ، سواء بشكل صريح
أو ضمني عن طريق تضمين ملف الرأس الصحيح في برنامجك.
ولكن عندما لا تقوم بتضمين ذلك ، يمكن أن يكون لديك أخطاء في تعريفات النماذج
الأولية هذه.
عدم تضمين ملف الرأس الذي يتضمن تعريف دالة مكتبة
البرمجة c المستخدمة في البرنامج.
لذلك في هذه الحالة ، تريد إعادة استخدام بعض التعليمات البرمجية. ربما لديك وظيفة printf تريد
عرض بعض المخرجات ، لكنك لا تقوم بتضمين ملف رأس lib القياسي.
هذا خطأ. وعادة ما يخبرك المترجم بذلك.
ستكون هناك مشكلة في الربط
مع هذه الوظيفة.
إذن في هذه الحالة ، لدينا إجابة مزدوجة تساوي قيمة الجذر التربيعي 1.
إذا كان هذا البرنامج لا يتضمن الرياضيات. header ، فسيؤدي ذلك
إلى إنشاء خطأ يفيد بأن الجذر التربيعي غير محدد.
سيحاول ربط ملفات الكائن. لن يكون لها رياضيات. ا.
وسيقول ، مرحبًا ، إنك تستدعي الجذر التربيعي ، لكن لا يوجد تطبيق لذلك.
لذا تأكد من تضمين الرؤوس الصحيحة لجميع
استدعاءات الوظائف ، خاصةً من المكتبة القياسية.
الخلط بين ثابت الحرف في سلسلة الأحرف.
إذا كان لدينا هنا نص يساوي علامتي اقتباس داخليتين
، فهذا حرف واحد مخصص للنص.
إذا كان لدينا متغير اسمه نص وقمنا بتعيينه بين علامتي
اقتباس ، فهذا مؤشر لسلسلة الأحرف.
هذا لا يصلح لحرف واحد.
وهذا في الواقع تحدثنا عن ثوابت السلسلة
وتعيينها لمصفوفات المحارف.
وكيف لا يمكنك فعل ذلك مع المتساويات وعليك فعلها
فعليًا بنسخة النجم.
في هذه الحالة ، عندما نقول أن النص يساوي a ، فإنه يعين مؤشرًا وهذا
في الواقع ليس صالحًا أيضًا ، وانظر
ما عليك فعله هو أن تقوم بعمل النص النجمة الذي يساوي
a أو النسخة النجمية إذا لم تفعل لا أريد تخصيصها مباشرة من
هذا القبيل.
ولكن يمكنك الحصول على جوهر.
استخدام علامة اقتباس مفردة من الداخل مقابل حرف داخل علامات اقتباس
مزدوجة مختلف تمامًا ، بين الحرف مقابل سلسلة.
في الحالة الأولى ، يُعلن عن النص عادةً على أنه متغير char.
وفي الحالة الثانية ، يجب التصريح عنها على أنها مؤشر نوع إلى حرف char.
وإذا كنت تريد تعيين قيمة لهذا المؤشر بخلاف المؤشر
نفسه ، فسيتعين عليك إلغاء الإشارة إليه.
هذا غير صحيح في الواقع لأنه إذا كان مؤشرًا
بدلاً من تعيين عنوان ، فأنت تقوم بتعيين سلسلة له ، لذلك لا
معنى لذلك.
باستخدام الحدود الخاطئة لمصفوفة ، استثناء خارج الحدود المصفوفة.
هنا ، نعلن عن مصفوفة عدد صحيح بحجم 100 ثم متغيرين
أنا ومجموع مع تهيئة بعض المتغيرات فقط.
ونحن نمر في الحلقة ، نقول لأن I يساوي 1 أنا أقل من 100.
هذا غير صحيح لأن حجم المائة يعني أن هناك مائة عنصر
في المصفوفة. لكن المصفوفات تستند إلى الصفر.
لذا فإن العنصر الأول هو صفر. الحد الأقصى للفهرس الذي يمكنك
تعيينه أو الوصول إليه في المصفوفة هو 99.
هذا سيكون أقل من يساوي.
لذلك سيكون لديك خطأ خارج الحدود هنا.
هذا ليس رمزًا منخفضًا صالحًا
لأن هذه الحلقة ستنتقل إلى 100.
من المحتمل أيضًا أن يكون غير صحيح لأنك تبدأ من 1.
إذا كنت تريد حقًا العنصر الأول من هذه المصفوفة ، فستبدأ من 0.
يعد نسيان حجز موقع إضافي في مصفوفة للحرف
الفارغ النهائي لسلسلة مشكلة
شائعة أيضًا.
عند التصريح عن مصفوفات شخصيتك ، يجب أن تكون كبيرة بما يكفي لاحتواء الحرف النهائي وحده.
هذا هو السبب في أنني أقترح عليك عدم
وضع حجم في مصفوفة عند إنشائه إذا كنت تقوم بتهيئته.
لن تضع الحجم هناك إلا إذا لم تقم بتهيئته.
إذا كنت تقوم بإنشاء التهيئة على نفس السطر ، فدع c يقوم بالعمل نيابة
عنك ، وسوف يضع الحجم الصحيح تلقائيًا وسيتضمن ذلك حرف النهاية الفارغ.
على سبيل المثال ، إذا كان لديك سلسلة أحرف تسمى hello
، فهذا أكثر من خمسة مواقع للذاكرة ، وستة بسبب ذلك الفاصل الصفري في النهاية.
لا تنس حجم المصفوفات الخاصة بك.
هذه مشكلة شائعة مع المؤشرات التي لم نناقشها كثيرًا ، لكنني
أردت فقط أن أذكرها لأنها شائعة جدًا.
في المؤشرات ، عندما تريد الوصول أو حتى التعليمات ، عندما
تريد الوصول إلى شيء ما بواسطة
مؤشر ، يجب عليك استخدام الشرطة أكبر من الرمز.
يتم استخدامه عند الوصول إلى عنصر المؤشر.
لذلك إذا كان لديك مؤشر يشير إلى بنية ، فهذه هي الطريقة التي يمكنك الوصول إليها.
إذا كان لديك هيكل ، فهو ليس مؤشرًا
، ثم يمكنك الوصول إليه باستخدام عامل تشغيل نقطي.
في كثير من الأحيان يتم استخدام عامل النقاط هذا والشرطة أكبر مما يتم
استخدامه بشكل غير صحيح.
نقطة لغير المؤشرات ، المؤشرات تندفع أكبر من ، سيصبح هذا واضحًا
في المزيد من الأمثلة لدينا.
حذف علامة العطف قبل المتغيرات التي لا تحتوي على مؤشر في مكالمة scanf.
لذا تذكر أن استدعاء scanf الخاص بنا يتوقع أن يكون المؤشر بمثابة وسيطة ثانية
، وهذا يعني عنوانًا.
عندما نعلن عن نوع بيانات متغير من النوع int ، فهذا
ليس مؤشرًا.
لذا من أجل السماح لـ scanf بتخزين تلك البيانات في متغير int ، علينا تمريرها
علامة العطف لنقول إنه عنوان.
لذلك هذا غير صحيح ، عدم
وجود علامة العطف قبل الرقم والمسح الضوئي f لأن الوسيطة
الثانية غير صالحة. المرة الوحيدة التي لا تمتلك فيها علامة العطف هي استخدام
مؤشر ، مثل مصفوفة الأحرف.
يجب أن تكون جميع الوسائط التي تظهر بعد سلسلة التنسيق والمسح الضوئي عبارة عن مؤشرات.
استخدام متغير المؤشر قبل أن تتم تهيئته.
إذن ، هذا مثال على إنشاء مؤشر ثم محاولة التعيين إليه.
وهذه هي المهمة الصحيحة حيث تقوم بتعيين قيمة تقوم بإلغاء الإشارة إليها.
لكن ما لم نفعله هنا هو أننا قمنا بتهيئة المؤشر ليكون لدينا في الواقع
أي ذاكرة مخصصة له ولا يمكنك
القيام بذلك في c.
يمكنك فقط تطبيق عامل المراوغة ، وهو
علامة النجمة السابقة على نقطة أو
متغير بعد تعيين المتغير الذي يشير إلى مكان ما.
لذلك يجب أن يشير إلى مكان ما ، في الوقت الحالي ، إنه فارغ ، ولا يشير إلى أي مكان
لأنك لم تخصص أي ذاكرة.
لذلك لم يتم ضبط مؤشر char أبدًا للإشارة إلى أي شيء ، لذا فإن المهمة ليست ذات معنى.
هذا من شأنه أن يسبب في الواقع خطأ تجزئة.
خطأ شائع آخر هو حذف تعليمة break في نهاية الحالة في تعليمة switch.
إذا لم يتم تضمين استراحة في نهاية القضية ، فسيتم متابعة التنفيذ إلى الحالة التالية.
لذلك هذا ما ذكرته حيث لديك حالة ، يتم تقييمها.
وإذا لم يكن لديك هذا الفاصل هناك ، فإنه ينتقل مباشرة إلى الحالة
التالية وسيقوم بتنفيذ الكود داخل الحالة التالية.
لذلك تريد دائمًا أن يكون لديك فواصل داخل بيانات حالتك.
هناك أوقات تريد فيها متابعة حالة لحالة أخرى ويفعلون
نفس الشيء بالضبط ، في هذه الحالة لن يكون
لديك أي شيء داخل بيان الحالة.
إدخال فاصلة منقوطة في نهاية تعريف المعالج المسبق.
تذكر تعريفات المعالج المسبق أنها تبدأ
بالرقم ، رمز الجنيه. يتم تشغيل المعالج المسبق قبل المترجم
عادة من أجل التحسين.
يجب ألا تتضمن الصيغة الصحيحة لتعريفات المعالج المسبق فاصلة منقوطة.
ومع ذلك ، في c أنت ، تعتاد دائمًا وضع فاصلة منقوطة بعد كل شيء.
لكن عليك أن تتذكر أنه إذا قمت بتعريف بعض البيانات الثابتة التي لا
تحتاج إلى الفاصلة المنقوطة ، فهذا غير صحيح.
سيؤدي هذا إلى حدوث خطأ في بناء الجملة
إذا تم استخدام تعبير كهذا.
مثل هذا. لذا إذا حاولت بالفعل استخدام ذلك لتجد
أنه سيكون من الجيد أن يكون لديك تلك الفاصلة المنقوطة في النهاية.
ولكن عند تشغيل المعالج المسبق ، سيتم إدخال ما هو محدد بالضبط.
لذلك سوف يعمل في نهاية البيانات 999 القولون.
هذا ما سيراه المترجم وسيتسبب في حدوث خطأ بالفعل ، سيكون
خطأ في بناء الجملة.
يعد حذف قوس إغلاق أو علامات اقتباس للإغلاق في أي عبارة
أمرًا شائعًا جدًا. لذلك يرتبط هذا أيضًا ارتباطًا مباشرًا
بالأقواس أيضًا ، حيث يكون هناك قوس بداية متعرج ثم لا ينهي القوس المتعرج ، نفس
الشيء مع الأقواس. في هذه الحالة ، لدينا
قوسان أيسر ابتدائيان أو ثلاثة ، لكن لدينا قوسان
نهائيان فقط. نحن نفتقد قوس النهاية الأيمن.
سيكون ذلك خطأ نحويًا سيجده المترجم.
لذلك عندما تستخدم التضمين بين قوسين لتمييز كل جزء من المعادلة عن بعضها البعض ، فإن ذلك يجعل سطر التعليمات
البرمجية أكثر قابلية للقراءة.
تريد استخدام الأقواس.
ومع ذلك ، فأنت تريد التأكد من تطابقها جميعًا
مع بدء قوس يجب أن يكون لديك قوس إغلاق نهائي ، وهو نفس الشيء مع الأقواس المتعرجة.
تبدأ دعامة مجعدة ، يجب أن يكون لها قوس نهاية مجعد.
لذلك إما أن يكون لديك الكثير أو لديك القليل
جدًا ولكن المترجم سيشتكي ، وهذا شائع جدًا.
لذا يفتقد السطر الثاني هنا أيضًا علامة اقتباس للإغلاق ، هذه العبارة المطبوعة.
ليس لدينا اقتباس ختامي.
سوف يشكو المترجم من ذلك.
كلاهما سوف يولد خطأ في التحويل البرمجي.
في بعض الأحيان على الرغم من أن المترجم مضلل للغاية لأنه
لا يعرف في الواقع مكان حدوث الخطأ. تعتقد أن الخطأ ربما حدث في سطر لاحق.
لذا فإن السطر الذي يخبرك بالخطأ قد يكون مضللاً.
بناءً على ما إذا كان المترجم يستخدم
قوسًا أو علامة اقتباس في سطر لاحق ، فإنه سيكمل
هذا التعبير بالفعل.
لذلك سوف ينقل الخطأ لأسفل إلى سطر آخر.
وهذا ما سيشتكي ويقول إن هذا هو المكان الذي يوجد فيه الخطأ. لكن الخطأ الفعلي
أعلى من حيث كنت تقصد وضعه.
هذه بعض الأخطاء الشائعة التي أرى أن الكثير من المبرمجين يرتكبونها.
من السهل إصلاحها. وإذا فهمتها ودرستها
، فستعرف ألا
تصنعها. لا بأس في جعلهم مبتدئين ،
ولكن عندما تقوم بالبرمجة أكثر فأكثر والحصول على
مزيد من التدريب ، ستدرك ، مهلا ، لقد نسيت قوسًا ، لقد
نسيت قوسًا ، لم أستخدم يساوي ويساوي يساوي بشكل صحيح ، أنا أستخدم
المؤشرات بشكل غير صحيح ، ولم أخصص أي ذاكرة.
كل هذه الأشياء ستأتي طبيعة ثانية. شكرًا لك.