أخر الاخبار

دروس في سي بلس بلس ++C الاقترانات السطرية Inline function للمبتدئين

دروس في سي بلس بلس ++C الاقترانات السطرية Inline function للمبتدئين

لغة سي بلس بلس,البرمجة بلغة السي بلس بلس,تعلم لغة البرمجة سي بلس بلس,سي بلس بلس,تعلم سي بلس بلس,كود بلغة سي بلس بلس,مشروع بلغة سي بلس بلس,برنامج مكتوب بلغة سي بلس بلس,بورلاند سي بلس بلس,تعلم البرمجة بلغة سي بلس,شرح سي بلس بلس للمبتدئين,اساسيات سي بلس,بلس,لغة السي بلس بلس,أهمية لغة السي بلس بلس c++,امثلة عل لغة البرمجة ++c,مميزات لغة c++,اساسيات لغه السى بلس بلس c++,برنامج بلغة سي بلس بلس,شرح سي بلس بلس,كورس السى بلس بلس,تطبيق كتابة اكواد سي بلس بلس


السلام عليكم ورحمة الله وبركاتة احبتي الكرام اليوم سوف نقدم درس مهم حول كيفية تعلم لغة البرمجة سي بلس,تعلم سي بلس بلس,كود بلغة سي بلس بلس,مشروع بلغة سي بلس بلس,شرح سي بلس بلس للمبتدئين,اساسيات سي بلس,بلس,لغة السي بلس بلس,مميزات لغة c++,اساسيات لغه السى بلس بلس c++,برنامج بلغة سي بلس بلس,شرح سي بلس بلس.

كورس السى بلس بلس نبذة مختصرة عن الاجراءات الفرعية

تعتبر الإجراءات الفرعية من أهم الوسائل المستخدمة لتقسم البرنامج حيث يتكفل كل إجراء منها بتنفيذ مهمة محددة, كما تستخدم الإجراءات الفرعية لتنظيم العمل المشترك بين مجموعة من المبرمجين.

أهمية الاجراءات الفرعية في لغة السي بلس بلس c++

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

ماذا وفرت لنا لغة سي بلس بلس

وفرت لنا لغة C++ أسلوب برمجي يعرف بالاقترانات السطرية Inline Function والتي تكون صيغتها العامة على النحو التالي :

inline Return_Data_Type Function_Name(Passig_Data);

قد لا تختلف الصيغة السابقة عن الصيغة العامة للتصريح عن الاقتران الفرعي , إلا في نقطة واحدة وهي إضافة الكلمة المحجوزة inline قبل نوع البيانات العائدة من الاقتران.

ماذا تعني الكلمة المحجوزة inline لمترجم C++ ؟؟

بمجرد وصول المترجم إلى تعليمة التصريح Declaration عن الاقتران الفرعي , سيجدها مميزة بالكلمة المحجوزة inline لذا سعل بصورة تلقائية على إعادة كتابة نسخ من الاقتران الفرعي في مكان كل تعليمة استدعاء داخل البرنامج الرئيسي , شرط مراعاة حجم الاقتران الفرعي , وبذلك سنتجنب عملية الاستدعاء أثناء مرحلة التنفيذ مما سيوفر علينا الزمن الضائع. ولكن يشترط هنا مترجم C++ ان يكون حجم الاقتران الفرعي صغيرا ومحدود العدد من التعليمات البرمجية لإجراء عملية إعادة الكتابة ويعتبر هذا الشط من ناحية هندسة البرمجة من أسباب قوة لغة C++ ولعل السبب في ذلك أصبح واضحا , إذ يتم آليا تفضيل الزمن الضائع على حجم البرنامج الذي سيصبح كبيرا جدا بسبب كثرة النسخ المتكررة من الاقتران ذاته المنسوخة في مكان تعليمات الاستدعاء .
ولتوضيح ذلك , لنفترض ان لدينا برنامجا بحجم 500KB يحتوي على الإجراء الفرعي X بحجم 50KB وان هذا الاقتران يستدعي عشر مرات داخل البرنامج الرئيسي , وان شرط التفضيل بين الزمن الضائع من الاستدعاء و حجم البرنامج الرئيسي غير موجود في مترجم C++ , عندها سيعمل المترجم على عمل عشر نسخ من الاقتران x وبذلك يصبح حجم البرنامج العام 100KB أي الضعف  ومن المعروف ان المساحة المحجوزة بذاكرة المعالج تتناسب طرديا مع حجم البرنامج وبذلك سيفوق زمن تنفيذ البرنامج الزمن الطبيعي ( دون استخدام أسلوب inline ) بالإضافة لاستهلاك مساحة ذاكرة المعالج.
وبموجب ما سبق , فان المترجم سيتعامل مع أسلوب inline بحساسية فائقة , إذ سيقوم بفحص حجم الإجراء الفرعي المميز inline فإذا كان كبير الحجم عندها سيتجاهل تعليمة inline ليتعامل معه بالصورة التقليدية أي الاستدعاء أثناء التنفيذ اما إذا كان الاقتران الفرعي صغيرا فسيعمل المترجم على إصدار وكتابة عدة نسخ منه لتوضع بصورة غير مرئية للمبرمج مكان كل تعليمة استدعاء .

امثلة عل لغة البرمجة ++c

مثال على أسلوب inline :لدينا البرنامج التالي -برنامج 1- الذي يحتوي الإجراء الفرعي Sum الذي يتكفل بحساب مجموع العلامة الأولى ممثلة بالمتغير A مع العلامة الثانية ممثلة بالمتغير B


#include<iostream.h>

int A=0;

int B=0;

inline int Sum(int m1,int m2);

void main()

{

cin>>A;

cin>>B;

cout<<Sum(A,B);

}

int Sum(int m1,int m2);

{

return m1+m2;

}


فعند ترجمة البرنامج , سيعمل المترجم على كتابة نسخة مطابقة من الإجراء الفرعي Sum داخل تعليمة الطباعة cout التي تستدعي الإجراء الفرعي Sum , بالطبع نحن لن نرى تلك النسخة داخل البرنامج المصدري المفتوحة على واجهة محرر الكود لكنها ستكون مسجلة بالفعل داخل النسخة الناتجة عن عملية الترجمة ( البرنامج الهدف التنفيذي) .

المفهوم الخاطئ للاقترانات السطرية البرمجة بلغة السي بلس بلس

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

فإذا كان الإجراء الفرعي لا يحتوي ألا تعليمة برمجية واحدة فعندها يمكننا كتابة داخل سطر برمجي واحد فقط بشرط ان يكون هذا السطر مكان تعليمة التصريح Declaration عن الإجراء الفرعي , بذلك تكون تعليمة التصريح شاملة لجسم الاقتران كما في الصيغة التالية:

int X(int C,int B)

{


return C*B;


}


وهنا نجد ان الاقتران X يحتوي تعليمة برمجية واحدة فقط ممثلة بتعليمة ضرب المتغير C بالمتغير B لذلك يمكننا كتابة الاقتران X داخل سطر واحد إلا وهو سطر التصريح. مثال: لنعيد كتابة البرنامج 1 السابق مستخدمين طريقة كتابة الإجراء Sum داخل سطر واحد دون تميزه بكلمة inline ؟

#include<iostream.h>

int A=0;

int B=0;

int Sum(int m1,int m2)

{

return m1+m2;

}

cin>>A;

cin>>B;

cout<<Sum(A,B);

}

لاحظ أثناء عملية التصريح عن الإجراء الفرعي Sum , إننا قمنا بكتابة جسم الاقتران بصورة مباشرة مبتدئين بعلامة قوس البداية واتبعناها بتعليمة إرجاع return ناتج عملية الجمع منتهية بالفاصلة المنقوطة وأخيرا علامة قوس النهاية. لنحصل بذلك على اقتران فرعي متكامل العناصر (التصريح وجسم الاقتران).

البعض يتسائل عن إمكانية استخدام الأسلوب Inline Function مع الاقتران المكتوب داخل سطر واحد

الجواب نعم, يمكننا إجراء ذلك, إذ انه لا يوجد فرق برمجي بين الاقتران المكتوب داخل سطر واحد وبين الاقتران المكتوب على شقين منفصلين الشق الأول يكون عملية التصريح التي تسبق الاقتران الرئيسي main() والشق الثاني يكون جسم الاقتران الذي يكتب في نهاية البرنامج أسفل الاقتران الرئيسي. لنحصل في النهاية على البرنامج بالشكل التالي:


#include<iostream.h>


int A=0;


int B=0;

inline int Sum(int m1,int m2)

{

return m1+m2;

}

void main()

{

cin>>A;

cin>B;

cout<<Sum(A,B);

}



الخاتمة : نشكركم على مروركم الكريم زوار و متابعين موقع الاندرويد تيك التقنية ونتمنى ان نكون قد وفقنا في هذا المقال لمافية من اجر وفائدة للجميع,كما نرحب بعودتكم مرة اخرى لموقعنا ومتابعة كل جديد او يمكنكم متابعتنا والانضمام الى القناة الخاصة بلموقع على التلجيرام من هنا.
تعليقات
ليست هناك تعليقات
إرسال تعليق



    وضع القراءة :
    حجم الخط
    +
    16
    -
    تباعد السطور
    +
    2
    -