الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تحليل ومقارنة اكواد سى بلس بلس

مغلق
بدأه احمد غريب في 16 مارس 2005 · 9 رد · 931 مشاهدة · في قسم المواضيع الهامة في قسم السي /سي++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

اردت ان افتح هذا الموضوع لسبب هام جداً, عندما اخذنا كورس مبسط للغه السى بلس بلس وفى اول محاضره حذرنا الدكتور من وجود الكثير من المراجع التى والكتب التى لا يمكن الاعتماد عليها لسبب عدم فهم كتابها لهذه اللغه, وقال فى ما قال ان اكثر من 90% من هذه الكتب مضرتها اكثر من فائدتها, والسبب هو ان هذه الكتب يعتمدون على إستنتاجات شخصيه بدلاً من التحليل العلمى للماده.

دعونى اضع بعض الامثله ونناقشها سوياً لنرى إن كان كلام الدكتور فى محله ام انه يهرف بما لا يعرف.

المثال الاول ساطرح كود يؤدى "نفس المهمه", ولكن بطريقتين مختلفتين ونرى ايهما الاصح ولماذا, والاقتراح الثانى هو الذى يمل له الدكتور.

class X{
int i;
public:
X(int ii){
i=ii;
}
};

هذا الكونستروكتور يقوم بإعطاء القيمه داخل البرنامج كما هو موضح اعلاه. والان الطريقه الافضل حسب زعم الدكتور.

class X{
int i;
public:
X(int ii):i(ii){
}
};

ايهما افضل ولماذا؟

المثال الثانى

#define f(x) x*x

والافضل

inline int f(const int x){
return x*x;
}

ويفضل ان يعطى مثال توضيحى لماذا الحاله الثانيه افضل من الاولى

المثال الثالث

#define 100

والافضل

const int 100;

هذه بعض الامثله.

والكتب التى ينصح بها الدكتور هى كتاب The C++ Programming Language 3rd Edition (Stroustrap) ولكن هذا الكتاب معقد وصعب رغم ان مؤلف الكتاب هو مصمم السى بلس بلس.

هناك كتاب افضل منه الا وهو Thinking in c++ (Eckel) وانا ايضاً انصح به لانه افضل كتاب برئي المتواضع. وهو مجانى ويمكن الحصول عليه من http://www.planetpdf.com/developer/article...?ContentID=6634, يوجد نسختين, النسخه الاولى هى شرح كامل للغه والنسخه الثانيه هى تطبيق عملى وشرح لكيفيه إستخدام اللغه فى المشاريع الضخمه. الكتاب الاول قرابة 900 صفحه, الله يكون فى عونكم انا تقريباً إنتهيت من قرائته ولله الحمد.

ارجو المشاركه وإبداء الرائى

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#2

السلام عليكم :D ..

حملت الكتاب الذي قمت أنت بقرائته , فلا يزال يقبع داخل الهاردديسك لم استطع أن أدرسه خاصة أنه كتاب إنجليزي..لدي كتاب ورقي اشتريته, هو لشركة MicroApplication وهو من سلسلة "Grand Livre" مكتوب باللغة الفرنسية يقوم كاتبه بعرض لغة سي++ بطريقة جد سهلة و بسيطة..

سأرى إن كنت قد استفدت مما قرات <_< .

السؤال الأول لا أعلم,

السؤال الثاني:

تصحيح فقط للكود لل ماكرو و الصواب هو

#define f(x) (x)*(x)

أظن أن PreProcessor سيقوم بتعويض كل صيغة يصادفها في الكود بمثيل لها نصيا.

و أرى أن الدالة التي عرفت ب Directive ب Inline ستكون أسرع كانها ماكرو وهذا دور Compiler

السؤال الأخير هو هل نستعمل Define أم Const!

أـظن أنك عندما تستعمل Define فإن المصرف سيبحث عن الصنف الأفضل لتسجيل هذا العدد’ لكن عندا تستعمل Const فإن لك الأختيار في وضع هذا الرقم في الصنف الذي تريده أنت..

والله باين اني عميتها :lol: .

سأنتظر رد الأخوة... B)

سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين

يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.

اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.

الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.

إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.

و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله

أخوكم مراد

27_06_06_05_21_41_1151410901logo_adl_wal_ihsan.jpg

#3

السلام عليكم

اخى الحبيب مراد سانتظر حتى يرد الاخوه على السؤال الاول حتى نتيح فرصه للاخرين, الاجابه الثانيه الغرض منها كان عدم وضع الاقواس لذالك اتوقع انك فهمت الخدعه ولكن ايضاً نترك المجال للخرين فى المشاركه.

اما السؤال الاخير const افضل من define لاسباب امنيه اتركك تفكر بالامر وإن شاء الله اعود بالاجابه بعد ان بشارك عدد من الاخوه, شكراً لمرورك الكريم.

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#4

بالنسبة للسؤال الأول فالحل الثاني أسرع, لكن لا أعرف لماذا!

اما الـmacros فبشكل عام تعتبر سيئة لكن ايضا لا أعرف لماذا بالظبط ..

#5

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

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#6

بالنسبة للماكرو و دالة Inline السبب بسيط

هو ان Inline ترجع لنا Int, float..etc علي عكس #define

Inline تاخذ مساحة صغيرة في الملف التنفيذي

هناك اسباب كثيرة ...........

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#7

و define eee 100 لتعريف ثابت

و const ..etc افضل لاننا نستطيع بعد عمل disassembling للبرنامج بتغير محتوي النص في define ... و ممكن تعريف مؤشر ثابت const int* ptr علي عكس define

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#8

السلام عليكم

أشكر الأستاذ أحمد غريب على مواضيعه الحساسة :lol:

المهم، فعلا أن كلام الدكتور صحيح، ولكن لدي تحفظ على كلمة نقلها الأخ غريب على لسان الدكتور

اقتباس
والسبب هو ان هذه الكتب يعتمدون على إستنتاجات شخصيه بدلاً من التحليل العلمى للماده.

لأن الاستنتاج ما هو إلا نتيجة للتحليل العلمي، أليس كذلك؟ :lol:

المهم ، ماعلينا...........

بالنسبة للمثال الأول ، فكلاهما صحيح ، ولكني لم أجد أيهما أفضل من ناحية السرعة ولكن أعتقد أنه توفير في الكتابة فقط ،

أما المثال الثاني والثالث فأنا معه تماما ، لأن عمليات preprocessor لا تخضع لعملية checking التي يقوم بها compiler لذلك قد تحدث أخطاء بدون أن تعرف أين مكانها لذلك فهي ستكون مربكة، إلى غير أنه ستكون هناك مشاكل في عملية الربط بين الملفات إذا وجد macro له نفس اسم المتغير في ملف آخر ، لذلك فإن في ++C استخدام const أفضل من C حيث أن الأخيرة ليس لديها const حيث أنها تستخدم #define فقط ،وهذه لها العيوب السابق ذكرها.

هذا والله أعلم.

والسلام عليكم

برق

System Engineer

Red Hat Certified Engineer

Red Hat Certificate Number

805010381752078

#9

السلام عليكم

الاجابات:

الحاله الاولى يفضل إستخدام init. list بدالا من وضع إعطاء الداله قيمه داخل ال constructure.

X(5);

طبعاً فى كلتا الحالتين يمكنك تكوين عنصر من الداله X بهذه الطريقه ولكن الفرق هو ان المتغير i يحصل على القيمه 0 الاول ثم ياخذ القيمه 5 داخل ال constructure اما فى الحاله الثانيه فإنه يحصل على القيمه مباشرتاً عند إنشاء العنصر, تخيل الان انك انشئت الف عنصر وكان كل عنصر يحتوى على array فإن الطريقه الاولى ستكلفك ضعف الوقت الذى تستغرقه الطريقه الثانيه.

بالنسبه ل macro و ,inline فان الاخ مراد كلامه صحيح 100% تخيل معى لو انك نسيت الاقواس فى الماكره وإستدعيته بالطريقه التاليه:

f(1+2);

الماكرو سيحول الامر إلى التالى

2+1*2+1

ولا اعتقد ان هذا ما كنا نريد, ولكن لو إتبعنا طريقه الاخ مراد فستحل المشكله, تعليق بسيط على الطريقه هو تخليل لو ان عندك معادله معقده تتكون من مجموعه كبيره من المتغيرات وتريد ان تكتبها على شكل ماكره, هل تضمن ان جميع الاقواس فى محلها الصحيح؟؟

اما بالنسبه لinline فإنها تقوم باداء المهمه على الوجه الصحيح.

كذالك إذا كان تعريف const موجود فى ال header وتم تغير قيمته, فلا تحتاج لإعادة علم compile لجميع الملفات التى تستخدمه بل يكفى عمل compile للملف الذى يحتوي الدال, بعكس define.

واخيراً

فلا يوجد لدى إضافه على ماذكره الاخ برق, وإجابته صحيحه 100%.بالنسبه للحاله الثالثه.

اقتباس
لأن الاستنتاج ما هو إلا نتيجة للتحليل العلمي، أليس كذلك؟

ليس بالضرورى ان يكون الاستنتاج نتيجة تحليل صحيح, فمثلاً لو لاحظت المثال الاول وهو الطريقه التى يبرمج بها اغلبية المبرمجين, رغم انها تادى الغرض ولكنها ليست الطريقه المثلى.

بالنسبه لإرجاع القيمه كما ذكر الاخ احمد صالح فإن define ترجع قيمه ولكن بطريقه اخرى مثلاً فى المثال السابق القيمه التى تعيده define هى العدد 6 والتى من المفروض ان تكون 9 المشكله تكمن فى ان الcompiler لا يعرف نوع هذه القيمه عند الترجمه من ما قد يسبب اخطاء من الصعب إكتشافها.

ترقبو المزيد من الاسئله

والسلام

لا إله إلا الله محمد رسول الله

busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.

#10

السلام عليكم

خسارة فاتت علي هالمناقشة الرائعة بحق - شكرا أخي أحمد على هالمواضيع الجميلة -.

بس لازم أعلق على ذلك .

اما فى الحاله الثانيه فإنه يحصل على القيمه مباشرتاً عند إنشاء العنصر, تخيل الان انك انشئت الف عنصر وكان كل عنصر يحتوى على array فإن الطريقه الاولى ستكلفك ضعف الطريقة الاولى.

هذا ماكنت اريدقوله بالضبد منذ ان قرأت بداية المقال.كلام سليم أخي أحمد.ولذلك يفضل دائما استخدام الطريقة الثانية وتكون كعادة برمجية .

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

وبالتوفيق.

اللهم علمنا ما ينفعنا وأنفعنا بما علمتنا أنك أنت العليم الحكيم

سبحان الله وبحمده سبحان الله العظيم

لاحول ولاقوة الا بالله( كنز من كنوز الجنة ).

هذا الموضوع مغلق.

مواضيع مشابهة