النتائج 1 إلى 6 من 6
الموضوع:

النماذج و الملفات الرأئسية في c++

الزوار من محركات البحث: 68 المشاهدات : 965 الردود: 5
جميع روابطنا، مشاركاتنا، صورنا متاحة للزوار دون الحاجة إلى التسجيل ، الابلاغ عن انتهاك - Report a violation
  1. #1
    من أهل الدار
    мᾄḋʀἶḋ'ṩ ʛἶʀl
    تاريخ التسجيل: March-2014
    الدولة: Iraq,Thi-Qar
    الجنس: أنثى
    المشاركات: 3,271 المواضيع: 329
    صوتيات: 7 سوالف عراقية: 0
    التقييم: 1197
    مزاجي: :)
    المهنة: programmer
    موبايلي: IPhone 8Plus
    آخر نشاط: 21/February/2020
    مقالات المدونة: 3

    T2025 النماذج و الملفات الرأئسية في c++

    - النماذج Les prototypes :
    لحد الآن طلبت منكم وضع الدالة المتعامل معها قبل الدالة main. لماذا ؟
    لأن الترتيب له أهميته هنا، إذا وضعتم دالتكم قبل الـ:main في الكودسورس، سيقرؤها جهازكم و يتعرف عليها، و عندما تضعون طلبا للدالة داخل الـ:main سيتعرف عليها الجهاز و يتوجه مباشرة للبحث عنها، و لكن ان وضعتم دالتكم بعد الـ:main لن تشتغل لأن الجهاز لم يتعرف بعد على الدالة ، يمكنكم فعمها بالمنطق .
    - لكنه أمر ساذج قليلا أليس كذلك ؟
    أنا متفقة معكم، لكن يمكننا القول أن ما سبقنا من مبرمجين قد تلقوا الضربة لاحقا و نصحوا ما بعدهم من مبرمجين بالتحفظ في هذه النقطة بالظبط، و بفضل ما سأعلمكم إياه الآن، ستتمكنون من الآن و صاعدا وضع الدوال في أي ترتيب كان، و بهذا تتخلصون من المشاكل التي يمكن أن تعترضكم .
    - النموذج لإطلاق دالة:
    سنقوم اليوم بـ:" إطلاق " دوالنا للجهاز، و هذا بكتابة ما نسميه بالنماذج، و لا تنبهروا من هذا الاسم لأنه يحمل في طياته أشياء بسيطة فقط
    تأملوا في السطر الأول من دالتنا aireRectangle
    double aireRectangle(double largeur, double hauteur)
    {
    return largeur * hauteur;
    }

    قوموا بنسخ السطر الأول (double aireRectangle...) المتواجد أعلى الكود سورس مباشرة تحت #include . أضيفوا الرمز ; في نهاية هذا السطر، و هكذا يمكنكم أن تضعوا الدالة الخاصة بكم aireRectangle بعد الدالة main ان أردتم ! و ينبغى أن تروا الكودسورس التالي :

    #include <stdio.h>
    #include <stdlib.h>
    // La ligne suivante est le prototype de la fonction aireRectangle :
    double aireRectangle(double largeur, double hauteur);
    int main(int argc, char *argv[])
    {
    printf("Rectangle de largeur 5 et hauteur 10. Aire = %f\n", aireRectangle(5, 10));
    printf("Rectangle de largeur 2.5 et hauteur 3.5. Aire = %f\n", aireRectangle(2.5, 3.5));
    printf("Rectangle de largeur 4.2 et hauteur 9.7. Aire = %f\n", aireRectangle(4.2, 9.7));

    return 0;
    }
    // Notre fonction aireRectangle peut maintenant être mise n'importe où dans le code source :
    double aireRectangle(double largeur, double hauteur)
    {
    return largeur * hauteur;
    }


    الشيء الذي تغيّر هنا هو إضافة النموذج أعلى الكودسورس، و كما ترون فالنموذج هو عبارة عن " تعليمة " للجهاز، و ما اقصده هو أن هذا يوحي للجهاز بوجود دالة تسمى aireRectangle و التي لها paramètres معينة و تُرجِع نهاية نمط أنت من تختاره . و هذا بالطبع يساعد الجهاز على تنظيم نفسه .
    بفضل ذلك السطر، يمكنكم الآن وضع دوالكم في أي ترتيب كان. أكتبوا دائما النموذج الخاص بدوالكم و بهذا لا يمكن لبرامجكم أن تتأخر في التعقيدات و في كثرة الدوال : من الأحسن التعلم من الآن العادة الجيدة و هي وضع نموذج لكل دالة .
    و كما رأيتم، الدالة main لا تحمل أي نموذج، و كمعلومة مني فهي الوحيدة التي لا تملك واحدا ! لأن الجهاز يتعرف عليها ( فهي المكررة في جميع البرامج نفسها ) .
    لكي يكون كل شيء تمام، يجب معرفة أنه في سطر النموذج إنه اختياري أمر كتابة اسماء المتغيرات لأن الجهاز لا يحتاج إلا نمط المتغيرات أنفسها .
    و لهذا يمكن ببساطة كتابة التالي :
    double aireRectangle(double, double);
    و مع ذلك، فالطريقة التي أريتكم إياها أعلاه ناجحة، الشيء الجيد في طريقتي هو أنه عليكم فقط القيام بنسخ و لصق السطر الأول الخاص بالدالة مع اضافة الرمز ; ( طريقة سهلة و سريعة ) .
    ملاحظة : لا تنسوا أبدا وضع الـ:; بعد النموذج، فهي الاشارة التي تجعل الجهاز يفرق بين بداية حقيقية لدالة و نموذج معين . و طبعا فإن عدم وضعها يجعلكم عرضة للأخضاء في الت:compilation .
    - الرؤوس Les headers :
    لحدّ الآن لا نملك غير ملف سورس واحد في مشروعنا و هو main.c
    - ملفات عديدة لمشروع واحد :
    في التطبيق، برامجكم لم تكتب كلها على الملف سورس main.c . طبعا إنه لمن الممكن القيام بذلك، و هو من غير اللائق أيضا التعامل مع 1000 سطر كودسورس في نفس الملف ( رغم أنني افعل ذلك أحيانا )، و لهذا جرت العادة أن تخلق عدة ملفات لوضع الكودسورس بنفس المشروع .
    - عفوا .. ماهو المشروع ؟!!
    هل تم نسيانه بسرعة ؟؟؟ طبعا سأشرح مجددا كي لا تتواجد تناقضات بيننا في هذا ، المشروع هو مجموع الملفات سورس الخاصة ببرنامجكم، و لحد الآن برنامجنا لم يتكون إلا من ملف واحد . و يمكنكم التحقق من هذا بالنظر في الـ:IDE الخاصة بكم ، غالبا تكون القائمة على اليسار ( للتذكير : الـ:IDE طبعا هو البرنامج code::source )
    كما يمكنكم الرؤية في يسار الصورة، المشروع لم يكن مكونا إلا من الملف main.c
    إسمحوا لي الآن ، سأريكم صورة لمشروع حقيقي ستقومون به في وقت لاحقا من الدروس ( لعبة Sokoban ) :
    كما ترون، هناك ملفات عديدة، و المشروع الحقيقي يشبه هذا، يعني تواجد ملفات عديدة في القائمة على اليسار .
    أنتم تعرفون من القائمة الملف main.c و الذي يحتوي الدالة main . بصورة عامة في برامجي، لا أضع غير الـ:main في الـ:main.c ( لكن هذا ليس أمرا حتميا، كل واحد ينظّم عمله كما يريد ! )
    - لكن لماذا إنشاء ملفات عديدة ؟ و كم من ملف يجب أن أنشئ لبناء مشروعي ؟
    هذا من اختياركم أنتم، بالنسبة لي قمت بتجميع دوال في نفس الملف حسب الثيم thème ففي الملف editeur.c قمت بتجميع كل الدوال الخاصة ببناء المستوى، و في الملف jeu.c قمت بتجميع الدوال الخاصة باللعبة نفسها و هكذا ..
    و بالمناسبة فقد عرفت أستاذا للبرمجة يضع كل دالة في ملف و لكن يجب أن تعلموا بأنها مسألة كمّ و ليس كيف و ما تقومون به راجع لمدى تنظيمكم لعملكم فقط .
    - الملفات c. و h.
    كما يمكنكم ملاحظة وجود نمطين مختلفين من الملفات فقط في الصورة أعلاه.
    ااـ:c. الملفات سورس، تحتوي الدوال نفسها
    الـ:h. تسمى الملفات headers هته الملفات تحتوي النماذج الخاصة بالدوال.
    عموما، انه لمن النادر وضع نماذج في الملفات من نوع c. مثلما فعلنا لتونا مع الـ:main.c ( إلا في حالة كان برنامجكم صغيرا جدا )
    بالنسبة لكل ملف c. هناك المعادل له، و الذي يحتوي نماذجا للدوال ، أعيدوا النظر في الصورة أعلاه
    - هناك الـ:editeur.c ( الكود الخاص بالدوال ) و الـ:editeur.h ( ملف النماذج الخاصة بالدوال )
    - هناك الـ:jeu.c و الـ:jeu.h
    - و هكذا ..
    * لكن ما العمل لجعل الجهاز على علم بباقي النماذج خارج الـ:c. ؟
    يجب إدراج fichier .h باستعمال إحدى توجيهات المعالج ( جزوا أنفسكم ستتعلمون تكتيكات جمّة في آن واحد )
    كيف ندمج ملفا header ؟ أنتم تعرفون كيف لأنكم سبق و قمتم بذلك ! أنظروا مثلا بداية ملفي jeu.c :
    #include <stdlib.h>
    #include <stdio.h>
    #include "jeu.h"
    void jouer(SDL_Surface* ecran)
    {
    // ...
    الادراج يتم عن طريق توجيه المعالج #include الذي تعرفون يفترض أنكم تعرفون حيثياته جيدا من سابق الدروس . انظروا الأسطر الأولى من هذا الكود :
    #include <stdlib.h>
    #include <stdio.h>
    #include "jeu.h" // On inclut jeu.h
    قمنا بادراج 3 ملفات من نوع h. و هي : stdio, stdlib و jeu . لاحظوا الفرق : الملفات التي قمتم بإنشاءها ووضعها في الـ:répertoire الخاصة بمشروعكم وُجب أن تكون مدرجة مع اشارات الاقتباس guillemets أقصد مثلا ("jeu.h") بينما الملفات التي توجد من الأساس في الـ:IDE خاصتكم تكن مدرجة بإشارات الرتبة chevrons أقصد مثلا (<stdio.h>).
    تستعملون إذا :
    - Les chevrons < > : لإدراج ملفات متواجدة في المذكرة "include" الخاصة بالـ:IDE
    - Les guillemets " " : لإدراج ملفات متواجدة في مذكرة مشروعكم ( و غالبا أمام ملفات c. )
    الأمر #include يطلب إدخال محتوى ملف في الـ:c. فهي تعليمة تقول :" أدخل الملف jeu.h هنا " مثلا .
    - و في الملف jeu.h ماذا نجد ؟
    لا نجد إلا نماذج خاصة بدوال الملف jeu.c !
    /*
    jeu.h
    -----
    Par The Eden, pour startimes (www.startimes.com)
    Rôle : prototypes des fonctions du jeu.
    */
    void jouer(SDL_Surface* ecran);
    void deplacerJoueur(int carte[][NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
    void deplacerCaisse(int *premiereCase, int *secondeCase);
    هكذا كيف يعمل المشروع الحقيقي .
    - ما الهدف من وضع نماذج في ملفات من نوع h. ؟
    السبب بسيط للغاية، عندما تضع طلبا لدالة في الكود سورس الخاص بك، ينبغى لجهازك أن يكون متعرفا عليها من قبل، و يعرف كم من المعلومات تحتوي، إن هذا هو المسعى وراء وجود النماذج، انه دليل المستخدم الخاص بالدالة بالنسبة للجهاز . كله مسألة ترتيب، عندما تضعون نماذجكم في ملفات h. يعني headers مُدرجة في اعلى ملفات من نوع .c . يعرف جهازكم دليل استخدام كل الدوال ما إن يبدأ في قراءة الملف .

    بالقيام بهذا، لن يكون عليكم القلق حيال الترتيب الذي ستكون عليه دوالكم في الملفات c. و اذا قمتم الآن ببرنامج صغير يحتوي على 2-3 دوال سيكون من السهل عليكم حساب النماذج و هذا لا يستغرق وقتا طويلا مادام عدد الدوال يعتبر صغيرا، لكن ان تم وضعها في ملفات الـ:h. ستستغرق الـ:compilation وقتا طويلا.
    عندما تطلبون دالة متواجدة في fonctions.c منذ الملف main.c سيكون عليكم إدراج inclure النماذج الخاصة بـ:fonctions.c في الملف main.c أقصد وجب وضع #include "fonctions.h" في أعلى الـ:main.c . ه تتذكرون هذا : " في كلّ مرة تضعون طلبا لدالة X في ملف، يجب إدراج نماذج هذه الدالة في ملفكم الخاص" هذا طبعا ما يسمح للـ:compilateur بمعرفة ما إن كنت قد طلبته بشكل سليم
    - كيف أقوم بإضافة ملفات c. و h. إلى مشروعي ؟
    هذا راجع للـ:IDE الذي تستخدمونه، لكن المبدأ هو نفسه في جميع البرامج :Fichier / Nouveau / Fichier source هذا يسمح بإنشاء ملف جديد، هذا الملف ليس حاليا من النوع c. أو h. فهذا التمييز يتم بعد حفظ الملف ( حتى و إن كان لا يزال فارغا ! ) و هنا يطلب منكم إدخال اسم للملف و هنا تماما تختارون نمط الملف :
    - إذا سميتموه fichier.c فسيكون من نمط c.
    - إذا سميتموهhfichier.c فسيكون من نمط h.
    إنه طبعا أسهل من هذا، قوموا بحفظ ملفكم في المذكرة répertoire أين تتواجد باقي الملفات الخاصة بمشروعكم ( نفس المجلّد أين يتواجد main.c) و عموما تقومون بحفظ ملفاتكم في نفس المذكرة سواء كانت من نمط c. أو h.
    مجلّد المشروع في النهاية يكون مثل هذا تماما :
    و كما ترون h. و c. معاً . و أخيرا ملفكم محفوظ، و لكنه في الحقيقة لم يتم إسناده إلى مشروعكم ! و لإضافته قوموا بالنقر يمينا على القائمة أيسر الشاشة ( الخاصة بملفات المشروع ) و اختر "Add files" كالتالي :
    ستخرج لك نافذة تطلب منك اختيار الملفات التي تريد أن تدخلها للمشروع، اختاروا الملف الذي قمتم للتو بإنشاءه، و سيتم إدخاله أخيرا . و يعتبر من الآن و صاعدا من ملفات المشروع و ستجدونه في القائمة على اليسار !
    - Les includes des bibliothèques standard
    هناك سؤال يجول الآن برأسكم، إذا أدرجنا الملفات stdio.h و stdlib.h هذا يعني أنهما موجودان في مكان ما و يمكننا البحث عنهما ؟
    نعم بالطبع ! إنهما مسطبان في المكان الذي يتواجد به الـ:IDE خاصتكم، و طبعا في الـ:Code::Blocks مكانهما هنا :
    C:\Program Files\CodeBlocks\MinGW\include

    على العموم يجب البحث على مجلد يحمل اسم include، بداخله تجدون كما هائلا من الملفات، و هي ملفات headers أي من نوع (.h) من مكتبات standard أي مكتبات متوفرة في كل مكان سواء في الويندوز أو الماك أو اللينكس، و ستجدون داخلها ايضا الـ:stdio.h و الـ:stdlib.h . يمكنكم فتحهم إذا أردتم، لكن ستتفاجؤون بأشياء لم تروها من قبل لكن ستعرفوها مستقبلا بحول الله و منها توجيهات معالج لم تروها من قبل ) و لو تلاحظون بشكل جيد ستجدون أن الملف مليئ بنماذك لدوال standard كالـ:printf مثلا
    أوكي، الآن عرفت أين أجد نماذج الدوال standard لكن ألا يمكننى رؤية الكودسورس الخاص بالدوال ؟ أين هي الملفات .c ؟
    إنها غير موجودة أساسا ، لأنها مترجمة compilées إلى ملف مزدوج binaire يعني كود machine و لهذا فأنه من المستحيل أن تقرأها .
    يمكنكم إيجاد الملفات المترجمة في المذكرة المسماة "lib" و التي هي اختصار لكلمة " library " أي مكتبة، بالنسبة لي موجودة في المسار :
    C:\Program Files\CodeBlocks\MinGW\lib
    ملفات المكتبات المترجمة بصيغة .a في البرنامج Code::Blocks الذي يستخدم الـ:compiler من نوع mingw . و بصيغة lib. في برنامج Visual C++ الذي يستخدم الكومبيلر Visual . لا تحاولوا قراءتها إنه أمر فعلا غير مشجع .
    أعتقد أنكم عرفتم الآن كيف يعمل الأمر أعتقد.. في ملفاتكم c. تشملون الـ:h. في المكتبات standars لتتمكنوا من استخدام الدوال standard مثلا الـ:printf و كما تعرفون فالجهاز على اطلاع على النماذج فهو يعرف ما إن كنتم قد طلبتم الدوال بشكل صحيح ( مثلا إذا نسيتم إحدى الإعدادات مثلا ) .
    - الـ:compilation المنفصلة :
    الآن و بعدما عرفتم أن المشروع مبنى على أساس ملفات سورس عديدة، يمكننا الدخول الآن في أعمال عملية التجميع compilation فلحد الآن لم نرة سوى مخطط مبسط عنها، و لهذا سأعطيكم مخططا مفصلا عنها و من المسحسن أن تحفظوه على ظهر قلب :
    هذا مخطط حقيقي على ما يجري بالظبط أثناء التجميع و سأشرحه لكم :
    1. المعالج Préprocesseur : المعالج هو برنامج ينطلق قبل الـ:compilation مخصص للقيام بتشغيل تعليمات نطلبها منه عن طريق ما سميناه بتوجيهات المعالج، و هي الأسطر الشمهورة التي تحتوى إشارة الدياز # ، لحد الآن المعالج الوحيد الذي نعرفه هو الـ:#include و الذي يسمح بإدراج ملف في ملف آخر . طبعا للمعالج مهام اخرى نعرفها لاحقا لكن ما يهمنا الآن هو ما أعطيتكم إياه.
    المعالج يقوم إذا بـ:"استبدال" ملفات #include بملفات أخرى مختارة، فهو يدمج داخل كل الملفات c. الملفات h. التي نعينها و نطلب منه إدراجها في السابقة.
    لحد الآن، الملف c. كامل و يحتوي كل النماذج الخاصة بالدوال التي تستعملونها ( إذن الملف main.c أكبر بقليل على الحالة العادية )
    2. الـ:Compilation : هذه هي المهمة الأهم و التي تسمح بتحويل ملفاتكم إلى أكواد binaire مفهومة بالنسبة لجهازكم، فالمصنف سيقوم بتجميع الملفات c. واحدا بواحدا حتى ينهيها جميعها، و لضمان ذلك و جب أن تكون كل الملفات موردة في القائمة على اليسار ! . سيقوم المصنف بتوليد ملف o. أو obj. و هذا راجع لنوع المصنف و هي ملفات binaire مؤقتة، و على أي حال تمسح هذه الملفات في نهاية الـ:compilation لكن بتعديل الخيارات يمكنك الإبقاء عليها لكن لكن يكون هناك من داع
    3. تحرير الروابط Edition de liens : اللينكر linker أو محرر الروابط هو برنامج يعمل على جمع الملفات binaires من نوع o. في ملف واحد : الملف التنفيذي النهائي ! و الذي يحمل الصيغة .exe في الويندوز و إن كنت تملك OS آخر فسيأخذ الصيغة المناسبة له طبعا .
    و هكذا تكونون قد تعرفتم على العمل الحقيقي في التجميع ، كما قلتها و أكررها الكخطط أعلاه سوبر مهم، فهو يفرق بين برنامج يخلط بين الكودسورس و بين برنامج يعرف تماما ما عليه فعله !
    معظم الأخطاء توجد في الـ:compilation و قد تأتي من الـ:linker و هذا يعني أنه لم يستطع من تجميع كل الملفات o. بطريقة صحيحة ( راجع في أغلب الأحيان لفقدان إحداها )
    - عندما تستعينون بمكتبات :
    ربما قلت لكم أن المخطط أعلاه كامل، في الواقع هو غير ذلك، لأن المكتبات لم تظهر فيه ! إذا كيف تحدث العملية عندما نستخدم مكتبات برمجية ؟
    على أي حال تبقى بداية المخطط هي نفسها، فقط يقوم الـ:linker بأعمال اخرى، يركب ملفاتكم o. ( المؤقتة ) مع مكتبات جاهزة تحتاجونها ( a. أو lib. وفقا للكومبيلر ) :
    هكذا ننتهي و يكون مخططنا هذه المرة كاملا، ملفاتكم من المكتبات a. ( أو lib. ) تم تركيبهما مع الملف التنفيذي l'exécutable مع ملفاتكم o.
    فبهذه الطريقة نتحصل في النهاية على برنامج كامل 100% و الذي يحتوي كل التعليمات اللازمة للجهاز، و كمثال الدالة printf توجد في ملف a. و طبعا سيتم تركيبها مع الكودسورس الخاص بنا في الملف التنفيذي .
    في وقت من الأوقات سنتعلم كيف نستخدم المكتبات الغرافيكية نجدهم أيضا في ملفات a. و تعطي للجهاز تعليمات بكيفية إظهار نافذة على الشاشة كمثال. لكن طبعا، لن ندرس عنها الآن ، كونوا صبرين و خذوا ( douga douga ) خخ مزحة فقط .
    - في نطاق الدوال و المتغيرات :
    لننهي هذا الدرس، سأكلمكم قليلا عما نسميه بداخل نطاق المتغيرات و الدوال، سنعرف متى يمكننا الوصول للدوال و المتغيرات، يعني كيف يمكننا طلبها faire appel à elles .
    - المتغيرات الخاصة بدالة :
    عندما تطلقون متغيرات في وسط دالة و التي تمسح من الذاكرة في نهاية الدالة .
    int triple(int nombre)
    {
    int resultat = 0; // La variable resultat est créée en mémoire

    resultat = 3 * nombre;
    return resultat;
    } // La fonction est terminée, la variable resultat est supprimée de la mémoire


    متغير تم إطلاقه في دالة، لا يكون موجودا إلا في حين تشغيل الدالة يعني pendant que la fonction est exécutée .
    لكن ماذا يعني هذا تحديدا ؟ أنه لا يمكن الوصول إليها من خلال دالة اخرى !
    int triple(int nombre);

    int main(int argc, char *argv[])
    {
    printf("Le triple de 15 est %d\n", triple(15));

    printf("Le triple de 15 est %d", resultat); // Cette ligne plantera à la compilation

    return 0;
    }

    int triple(int nombre)
    {
    int resultat = 0;

    resultat = 3 * nombre;
    return resultat;
    }

    في الـ:main أحاول الوصول إلى المتغير resultat لكن إن كانت مكتوبة ضمن الدالة triple فطبعا لن أجدها في main !
    تذكير : متغير تم إطلاقه في دالة، لا يسرى مفعوله إلا في داخل هذه الدالة نفسها ! و نقول أن المتغير محلّي local .
    - المتغيرات العالمية globale : للتجنب !

    * متغير عالمي محقق في كلّ الملفات
    إنه من الممكن إطلاق متغير يمكن الوصول إليه في كل الدوال من ملفات المشروع، سأريكم كيفية عمل ذلك كي تعرفون بأن أمرهم موجود، لكن عموما تجنبوا القيام بذلك، قد يظهر أنها ستسهل لكم التعامل مع الكودسورس لكن قد يؤدي بكم هذا لوجود العديد من المتغيرات التي تحقق في كلّ جهة مما يدخل لك بعض الوساوس و تتخلبط الأمور.
    لإطلاق متغيرة " عالمي - globale " ، يجب أن تقوموا بطلب المتغير خارج الدوال ، يعني في أعلى الملف، و عموما بعد أسطر الـ:#include
    #include <stdio.h>
    #include <stdlib.h>

    int resultat = 0; // Déclaration de variable globale

    void triple(int nombre); // Prototype de fonction

    int main(int argc, char *argv[])
    {
    triple(15); // On appelle la fonction triple, qui modifie la variable globale resultat
    printf("Le triple de 15 est %d\n", resultat); // On a accès à resultat

    return 0;
    }

    void triple(int nombre)
    {
    resultat = 3 * nombre;
    }
    في مثالي هذا، الدالة triple لا تُرجع أي شيء "void" إنها تقوم بتغيير المتغير العالمي resultat الذي يمكن للدالة main أن تسترجعه .
    المتغير resultat محقق في كل دوال الملف، و لهذا يمكن أن نطلبها في كل دوال البرنامج، و موضوعيا الأمر مماثل بالنسبة للدوال : تعرف الجهاز عليهم قبل تعامله معهم .
    - هل تقصدين بأنه يمكننا وضع نماذج للمتغيرات أيضا الآن ؟
    تقريبا، لكن لا نسمي هذا بالنموذج، لكن تقريبا نفس المبدأ : قبل استعمال متغير، نمنع الكومبيلر الذي كان موجودا و نطلق نمطها، و كل هذا بفضل الكلمة المفتاحية : extern .
    * ملف main.c :
    #include <stdio.h>
    #include <stdlib.h>

    int resultat = 0; // Déclaration de variable globale

    void triple(int nombre); // Prototype de fonction

    int main(int argc, char *argv[])
    {
    triple(15); // On appelle la fonction triple, qui modifie la variable globale resultat
    printf("Le triple de 15 est %d\n", resultat); // On a accès à resultat

    return 0;
    }
    *ملف triple.c :
    extern int resultat; // On prévient que resultat existe dans le projet

    void triple(int nombre)
    {
    resultat = 3 * nombre;
    }
    نلاحظ أنه في الـ:main.c ، نركز على أن المتغير resultat مهيئ عند القيمة 0 . و تلاحظون أنه ليس الأمر نفسه بالنسبة لـ:triple.c . فالكلمة الرئيسية extern لا تشير إلا لوجود المتغير، و ليس أنه مظبوط في القيمة 0 . و تخيلوا أن ملفات كثيرة تعمل على ظبط المتغير resultat في قيم مختلفة، الـ:compiler لن يجد كيف يتعامل مع الأمر و تحدث أخطاء أثناء التجميع .

    بامكاننا وضع الكلمة extern قبل نموذج الـ:triple في الـ:main.c لكن المترجم compilateur ليس غبيا للدرجة ، يعرف بأن الدالة الخاصة بالنموذج ليست في الملف، يجب أن تكون في ملف آخر، و يمكن أن يتدبر أمره بنفسه حينما يكون الأمر متعلقا بدالة " خارجية " . إذا تواجدت الدالة عدة مرات ' أو لم تتواجد أصلا ' فإن الـ:linker من يصحح الأخطاء .
    إن استخدام المتغيرات العالمية لإرجاع قيم هو عموما أمر مستبعد في برنامج بالسي . بدلا من ذلك يتم استخدام إرجاع الدالة return لإرجاع نتيجة معينة.

    * المتغيرات العالمية لا يمكن أن تحقق إلا في ملف واحد
    المتغيرة العالمية السابقة كانت محققة في كلّ ملفات المشروع، يمكن إرجاعها محققة فقط في الملف المتواجدة به، و رغم ذلك تبقى متغيرة عالمية، لكن نقول أنها عالمية في دوال هذا الملف فقط و ليس في كل ملفات المشروع .
    لإنشاء متغيرة عالمية محققة في ملف واحد فقط أضيفوا الكلمة static فقط :
    static int resultat = 0;
    - متغير ثابت لدالة :
    إضا أضفتم الكلمة المفتاحية "static" قبل إطلاق متغير في داخل دالة، هذا الأمر ليس له نفس المعنى عندما يتعلق الأمر بالمتغيرات العالمية، في الواقع، المتغير الثابت لا يمسح في نهاية الدالة، ففي المرة القادمة التي تطلبون فيها الدالة ستحتفظ بهذه القيمة الأخيرة. مثال :
    int triple(int nombre)
    {
    static int resultat = 0; // La variable resultat est créée la première fois que la fonction est appelée

    resultat = 3 * nombre;
    return resultat;
    } // La variable resultat n'est PAS supprimée lorsque la fonction est terminée.

    ماذا يعني هذا بالظبط ؟
    يعني أنه يمكننا طلب الدالة لاحقا و تبقى المتغيرة resultat محتفظة بنفس القيمة الاخيرة . و هذا مثال آخر لفهم أكثر :
    int incremente();

    int main(int argc, char *argv[])
    {
    printf("%d\n", incremente());
    printf("%d\n", incremente());
    printf("%d\n", incremente());
    printf("%d\n", incremente());

    return 0;
    }

    int incremente()
    {
    static int nombre = 0;

    nombre++;
    return nombre;
    }
    النتيجة :
    1
    2
    3
    4
    هنا، في المرة الأولى التي نطلب فيها الدالة incremente ، يتم انشاء المتغيرة "nombre". و الذي هو مضاف incrémentée بـ:1 . و ما إن تنتهي الدالة لا تمسح المتغيرة .
    عندما نطلب الدالة لمرة ثانية، يتم ببساطة قفز السطر الخاص بإطلاق المتغير، و لا نقوم بإعادة إنشاء المتغير بل فقط نعاود استعمال المتغير الذي أنشأناه سابقا . عندما تأخذ المتغيرة القيمة 1 ، تصبح لها القيمة 2 ثم 3 ثم 4 .. الخ
    هذا النمط من المتغيرات ليس مستعمل بكثرة، لكن يمكن له مساعدتكم و لهذا ذكرته في الدرس .
    - الدوال المحلية لملف :
    لانهاء حديثا عن المتغيرات و الدوال، نتكلم قليلا حول الدوال . من المفروض، عندما تنشؤون دالة، و التي هي عالمية لكل البرنامج، يمكن تحقيقها في أي ملف c.
    قد يحتاج الأمر لإنشاء دوال محققة فقط في الملفات التي تتواجد بها، و للقيام بذلك، أضيفوا الكلمة static ( نفسه ) قبل الدالة كالتالي :
    static int triple(int nombre)
    {
    // Instructions
    }
    و لا تنسوا النموذج دائما :
    static int triple(int nombre);
    انتهى ! دالتكم الثابتة triple لا يمكن طلبها إلا داخل دوال تنتمى لنفس الملف( مثلا main.c ) ، إذا حاولت طلب الدالة triple من طرف دالة أخرى من ملف آخر ( مثلا affichage.c )، لن يشتغل البرنامج لأن triple وقتها تكون غير محققة
    - لنلخص كلّ شيء !
    * في نطاق المتغيرات :

    • المتغيرة التي تطلق في داخل دالة تمسح في نهاية الدالة مباشرة . لا يمكن أن تكون محققة إلا داخل هذه الدالة .
    • المتغيرة التي تطلق في داخل دالة بالكلمة المفتاحية static ، لا تمسح في نهاية الدالة لكنها تحتفظ بقيمتها في نهاية البرنامج .
    • المتغيرة التي تطلق خارج الدوال تسمى متغيرة عالمية globale ، تكون محققة في كلّ الدوال و في كلّ ملفات المشروع .
    • المتغيرة العالمية بالكلمة المفتاحية static عالمية فقط في الملفات التي تتواجد بها، و لا تكون محققة في دوال باقي الملفات .

    * في نطاق الدوال :
    • دالة محققة تلقائيا في كل ملفات المشروع، يمكننا طلبها إذا من أي ملف كان .
    • إذا أردنا أن تكون دالة محققة فقط في الملف الذي تتواجد به يجب إضافة الكلمة static قبل الدالة .


  2. #2
    من المشرفين القدامى
    سَرمَديّة
    تاريخ التسجيل: August-2014
    الدولة: بغداد
    الجنس: أنثى
    المشاركات: 32,341 المواضيع: 2,167
    صوتيات: 152 سوالف عراقية: 98
    التقييم: 11970
    مزاجي: الحمدلله ، جيد
    المهنة: legal
    أكلتي المفضلة: دولمة
    آخر نشاط: منذ يوم مضى
    مقالات المدونة: 19
    يسلموو

  3. #3
    اسير وبحبك اطير
    احلاهن واتحداهن
    تاريخ التسجيل: August-2014
    الدولة: العراق-بابل
    الجنس: أنثى
    المشاركات: 1,060 المواضيع: 49
    التقييم: 258
    مزاجي: ضااااايجه
    المهنة: طالبة
    أكلتي المفضلة: اندومي
    موبايلي: ؟؟؟؟؟؟؟؟؟؟
    آخر نشاط: 18/December/2014
    مقالات المدونة: 1
    شكرا

  4. #4
    من أهل الدار
    мᾄḋʀἶḋ'ṩ ʛἶʀl
    شكرا لمرور نورتو

  5. #5
    من أهل الدار
    مجنون بحبك
    تاريخ التسجيل: June-2014
    الدولة: العراق/النجف الاشرف
    الجنس: ذكر
    المشاركات: 984 المواضيع: 30
    صوتيات: 1 سوالف عراقية: 0
    التقييم: 148
    مزاجي: تمام
    أكلتي المفضلة: الدولمه
    موبايلي: IPhone 3GS
    آخر نشاط: 15/November/2021
    مقالات المدونة: 2
    رووووووووووووووعه

  6. #6
    من أهل الدار
    мᾄḋʀἶḋ'ṩ ʛἶʀl
    اﻻروع مرورك بالموضوع

تم تطوير موقع درر العراق بواسطة Samer

قوانين المنتديات العامة

Google+

متصفح Chrome هو الأفضل لتصفح الانترنت في الجوال