• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Khaled Alshaya

المشرفون
  • عدد المشاركات

    2,052
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة Khaled Alshaya

  1. لماذا مايكروسوفت

    السلام عليكم ... أخي محمد أكرم, أتمنى أن تكون بخير, لدي فقط تعليق بسيط: إذا كنت تتكلم عن المنتجات الموجهة للـ end-user فأنا أتفق معك 100% و لكن كم مرة قامت Microsoft بسحب البساط من تحت المبرمجين؟ هل نبدأ بـ Visual FoxPro أم بـ Visual Basic أم ....... و هناك العديد من الأمثلة. برأيي أن لغات البرمجة و التقنيات يجب أن تكون Standards بغض النظر عن كون الـ Implementations مغلقة المصدر أو مفتوحة المصدر أو حتى من القمر, طالما أنني أضمن أني سأجد أداة أخرى في حالة احتجت إلى ذلك. تحياتي...
  2. ميزة جميلة أخ PWCT Maker :) كنت سأدخل في موضوع الـ Syntax Sugar و كيفية جعل اللغة Strongly Typed مع إبقاء مرونة الـ Weak Typing و لكن هذا مشوار طويل :P هناك لغة تسمى Lua فيها ميزة تشبه الموجودة في اللغة التي قمت بصناعتها, و لكن بشكل عام أعتقد أنها ميزة تضيف شيئاً مميزاً لكلا اللغتين. في Lua عملية التحويل نفسها لابد أن تكون صريحة, و لكن اللغة بدلاً أن تضيف دوال لتحويل النصوص إلى أعداد, فإنها جعلتها العملية الرئيسية, و جعلت عملية الـ concatentatoin عملية تتم بغير "+", استخدمت "..", فمثلاً: 1+1 2 1+'1' 2 '1'+'1' 2 '1'..'1' '11' '1'..1 '11' 1..1 -- ERROR! because ".." is the concatenation operator! شكراً على إثراء الموضوع,
  3. Visual Studio 2010 Released

    السلام عليكم ... أعتقد أن النقاش أخذ مجرى مختلف عن منبعه, و لكن للأسف برأيي الشخصي مقارنة لغة* PHP بلغة مصممة جيداً هو ضرب للمنطق بعرض الحائط. PHP لغة مصممة من هاو, صحيحit gets the job done و لكن كان من الممكن أن تكون أفضل بكثير. نحن في 2010 و مازالت مصممو PHP يحاولون إضافة دعم جيد لـ Unicode حتى الآن! أما أن تأتي إلى Statically Typed Language أو بمصطلح أدق لغة تتطلب الـ Type Annotation كما هو معتاد في اللغات الـ Statically Typed منذ زمن بعيد, و تخبرها بأن اللغة التي أستخدمها لا تتطلب ذلك الـ Type Annotation, بالتالي اللغة التي أستخدمها أفضل أو كما تقول More Expressive فهذا أيضاً خروج عن المنطق! كثير من اللغات الـ Dynamically Typed تملك الـ Expressiveness التي تملكها PHP و أكثر. و هناك لغات Statically Typed كـ Haskell تحطم PHP و غيرها في هذه النقطة. أخيراً, أنا لست هنا لأكون مع لغة ضد أخرى, و لكن لأوضح رأيي فقط في أن لكل لغة مميزات كما أن لها عيوب. و مادام أن المبرمج يعرف اللغة جيداً فسيكتب كود جيد و العكس صحيح. و لا تنسى أصلاً أن لغة PHP تعتبر Weakly Typed, و معظم اللغات الـ Dynamic الحديثة كـ Python هي لغات Strongly Typed. * أتكلم هنا عن اللغة فقط, بغض النظر عن الـ Framework نفسه أو لماذا PHP عملية كـ منصة تطوير بشكل عام.
  4. James Gosling يغادر Oracle/Sun

    أخ JustPassing, أنت أتيت بالذي كنت أريد البحث عنه :) انظر إلى السؤال التالي: Q: Are you open sourcing the Java language or the Java SE platform specifications? A: While we are open sourcing Sun's implementations of both, we cannot "open source" the Java programming language, nor the platform APIs and specifications, which are governed by the JCP.
  5. James Gosling يغادر Oracle/Sun

    صحيح لم يتركها معنوياً, و لكن Oracle هي من تقول الآن إذا كان هناك Java بعد الآن أم لا :) صححوا معلوماتي رجاءً إن كنت مخطئ بشأن ملكية Java, و أقصد هنا اللغة نفسها و ليس أحد الـ Implementations
  6. James Gosling يغادر Oracle/Sun

    السلام عليكم... أعتقد أنه موضوع محزن من ناحية أن مؤسس الـ Java لن يعود له سلطة عليها. أما موضوع موت Java فهذا يمكن أن نتحدث فيه بعد عشرين أو ثلاثين سنة, فـ Java ليست لغة يتم تجربتها في المختبرات :lol: سئل Stroustrup, مرة عن أهم قرار اتخذه بالنسبة لـ ++C, فقال أني جعلتها ملكاً للـ ISO, أي أنها فعلياً في الـ Public Domain. تصور أن Stroustrup نفسه لا يستطيع توجيه اللغة إلى الوجهة التي يريدها. و إنما لجنة مكونة من حوالي 250 من كبار المبرمجين. هذا ما سيؤثر في تطور الـ Java برأيي, لأنها محكومة من قبل شركة, أما موضوع موتها فهذا أمر خيالي أكثر من حقيقي صراحة :) تحياتي...
  7. هذه وصلة تحميل خارجية, رغم أني كتبته منذ زمن بعيد, و لكن فكرته بسيطة. لذلك ربما أحتاج إلى قراءة الكود مرة أخرى, http://s000.tinyupload.com/index.php?file_id=07623785102972087345 تحياتي....
  8. هل يمكن عمل Socket Flood

    بالعكس أخ علاء, مواضيع الـ Security من أجمل المواضيع, و صدقني ليس القصد عملية استغلال الثغرات نفسها. أما عن الـ SYN Flood فهو موجود منذ وجد TCP, و سيبقى حتى ينتهي TCP. المشكلة في البروتوكول نفسه, و ليست في جانب آخر. لهذا تم تطوير SCTP, و لكن عجلة التكنلوجيا تتحرك أبطأ مما نتصور خصوصاً عن الحديث عن الشبكات. هذا بروتوكول مضى عليه ما يقارب الثلاثة عقود, و مازال الجميع يعمل به للتوافقية لا أكثر. و إلا بروتوكول SCTP يوفر حلول لمشاكل TCP. لذلك أي حل يستخدم TCP في الأساس هو ليس حلاً و إنما عملية "ترقيع" للمشكلة. تحياتي...
  9. هل يمكن عمل Socket Flood

    أخي الـ UDP عبارة عن Connectionless Protocol, بمعنى أنك ترسل Datagram إلى الطرف الآخر دون عملية اتصال أساساً. تخيل أنك تريد إرسال SMS إلى جوال شخص آخر, هل تقوم بعملية اتصال؟ بالطبع لا, هل تعرف هل وصلت الرسالة أم لا؟ بالطبع لا! الآن كيف يمكن أن تغرق الـ Socket الذي تريد مهاجمته في هذه الحالة؟ تحتاج إلى Server أقوى من السيرفر الذي تقوم بمهاجمته, و ذلك لإغراق السيرفر المقابل. أقوى هنا تعني أنك تستطيع إرسال Datagrams أسرع مما يستطيع السيرفر الذي تريد مهاجمته من معالجتها. هذا الأمر, لا أعتقد أنه ممكن باستخدام حاسوب شخصي واحد, مقابل Server أقوى بعدة مرات مخصص للعمل على الانترنت. الحالة الثانية هي كون الـ Protocol المستخدم هو TCP. المشكلة في TCP, هي عملية الـ Three Way Hand Shaking. و فهم هذه العملية سيعطيك فكرة عن الـ Socket Flooding. عندما تقوم بفتح إتصال, فإنك ترسل SYN, في هذه الحالة, فإن السيرفر سيقوم بحجز الـ Buffers اللازمة لعملية الـ Flow Control, و موارد أخرى و خلافه. و سيرد بـ SYN+ACK على المتصل, ثم ينتظر الـ Server المتصل لكي يرسل الـ ACK النهائية لكي يكون الإتصال مفتوحاً من الطرفين. حتى الآن كل شيء سليم. الذي يمكن أن يحصل, هو تقوم بوضع IP وهمي في الـ IP Packet التي تحتضن طلب الإتصال, بحيث عندما يقوم السيرفر بحجز الموارد و الرد بـ SYN+ACK فإن الرد يضيع على شبكة الانترنت, لأن الـ IP الذي تم الرد عليه, عبارة عن IP وهمي, و لم يقم بفتح الإتصال أصلاً. باختصار. أنت تقوم بعمل إتصال, و لكن تقوم بوضع IP وهمي في الـ IP Packet. و هكذا ترسل العديد منها, بحيث يوم السيرفر بعملية حجز موارد كثيرة مقابل طلبات صغيرة نسبياً من قبلك. هناك حلول كثيرة للمشكلة, كما في SCTP Protocol حيث يتم استعمال Cookie للتأكد من وجود متصل حقيقي. هناك أيضاً, عملية تحديد عدد عمليات الإتصال المسموحة بشكل عام خلال فترة زمنية معينة. هذا مالدي, عدا عن ذلك فتحتاج إلى شخص يفهم في الشبكات ليخبرك بالتفاصيل. تحياتي...
  10. TFS و Source Controls

    السلام عليكم ... الصراحة أنا تعرفت على git على يد الأخ حسن. لم أكن افهم الفائدة أو كيف استخدم تلك الأدوات "المعقدة" المستخدمة لإدارة المشاريع. لذلك لن أدخل في النقاش من هذه الناحية, لدي فقط تعليق بسيط: الـ Dogfooding لها إيجابيات, كما أن لها سليبات. هناك شخص يسمى jalf كتب عن الموضوع,و كيف أن التغني بالموضوع هو أمر دعائي أكثر منه أمر ذو فعالية حقيقية. تحياتي...
  11. آراء جميلة, رغم أني أرى بعض الاختلاف فيها, من حيث الأولويات. فمثلاً, قيل بأن الـ Elegant Code هو أيضاً Efficient Code, و هذا أحد أوجه الأناقة. تقريباً ثلاثة ردود ركزت على هذا الأمر. أيضاً, فكرة أن الـ Elegant Code عبارة عن Clean Design منذ البداية, بحيث يتم عمل Modularization للكود, و هذا وجه آخر للأناقة. بالطبع, الرأي الثالث, هو أن الأناقة تعني أن الكود سهل القراءة, كما أتى الأخ أحمد عبدالمنعم بالاقتباسات الشهيرة. الرأي الأخير, هو أنه من الصعب أن تكتب كود أنيق من أول مرة, و لكنه يأتي بالمراجعة, تماماً كما في عملية الكتابة العادية. لا أحد يستطيع أن يكتب كتاباً من جرة قلم واحدة, و إنما يأتي الأمر بالتنقيح. رأيي الشخصي, هو نفس رأي الأخ حسن في الحقيقة, إضافة إلى أن هناك نقطة مهمة لدي. و هي أنني إذا فهمت الـ Problem Domain فإني حلي يكون أنيقاً, بينما إذا كنت أحاول كتابة كود في مجال لا أفهمه, ففي الغالب أنني لا أحصل على "الأناقة", و إن عمل الكود. هناك بضعة أسئلة بالطبع, للرأي الأول, هل تعتبر أن الكود إذا كان سهل القراءة و يؤدي المطلوب, و لكنه يستنفذ موارد بحيث يمكن تحسينه, كوداً غير أنيق؟ للرأي الثاني, هل تعتقد أنه في لغات مثل الـ Assembly, حيث هناك مساحة ضيقة لعمل Modularization, لا يمكن كتابة كود أنيق؟ بعبارة أخرى, هل تقولون بأن الكود الأنيق, هو كود تصميمه جيد, في لغة توفر لك طرق تصميم كـ OOP أو Functional Paradigm مثلاً, و غيرها؟ أليست الأناقة على مستوى Implementation نفسه, و ليس التصميم؟ تحياتي...
  12. السلام عليكم و رحمة الله و بركاته, أود أن أطرح موضوعاً نتشارك فيه بالمعرفة, و لكن لا أريد أن يفهم الموضوع على أن له علاقة بالموضة و الأناقة. ما أقصده هو هل تحاول أن تكتب الـ the most elegant code you could write ترجمها على كيفك! في البداية أود أن أسمع آرائكم حول تعريف أناقة الكود, و من ثم هل تهتم بذلك, و هل تعتبر أن مقروئية الكود أهم صفة فيه, على افتراض صحته بالطبع؟ ماهي أولوياتك حينما تقوم بكتابة الكود؟ و هل تختلف الأولويات في الكود الذي تكتبه في عملك أو دراستك عن الكود الذي تكتبه لشخصك الكريم كهواية؟ في النهاية, هل الـ Refactoring عملية مهمة برأيك أم أنك تتبع المثل القائل Why fix what ain't broken :sleep: تحياتي...
  13. c compiler

    السلام عليكم ... ماهو النظام الذي تعمل عليه؟ على Windows قم بتحميل Visual Cpp express 2008, و قم بإنشاء مشروع ++C, بعد ذلك قم بإعادة تسمية الملف بدلاً من filename.cpp إلى filename.c و سوف يقوم بترجمته على أنه كود C. بالطبع هناك خيارات عديدة, و لكن خياري المفضل هو العمل على GCC خصوصاً على Linux. لترجمة برامج C يعتبر GCC أفضل بكثير, و يدعم C99 آخر مقياس لـ C, و أفضل استخدامه من الـ shell, إذا كنت تعمل على Linux أعطنا فكرة حتى نعطيك مقدمة بسيطة. أما إذا كنت تعمل على Windows فـ VC أسهل بالنسبة لك إذا لم تكن معتاداً على العمل من الـ Shell. يا أخ أحمد. Dev ليس مترجماً هو يستخدم GCC port للـ Windows. و هي النسخة الثالثة من GCC, صحيح أنها جيدة, و لكن النسخة الرابعة على Linux صدرت منذ زمن بعيد. نصيحتي ابتعد عنه و عن أمثاله مثل Turbo C و غيرهم ممن أكل الزمن عليهم و شرب. جرب VC أو GCC على Linux, أو إذا كنت تريد المغامرة جرب CLang :) تحياتي...
  14. تشغيل البرنامج دون كتابة "main"

    السلام عليكم ... +1 للموضوع الأصلي منذ زمن, و لكن للإجابة على سؤال الأخ. أول خطوة هي أن الـ Preprocessor سيقوم باستبدال begin بالتالي: #define decode(s,t,u,m,p,e,d) m##s##u##t int decode(a,n,i,m,a,t,e)() { printf(" ArabTeam2000 "); return 0; } الخطوة بسيطة جداً, مجرد search/replace من قبل الـ preprocessor لا أكثر! الخطوة الثانية هي تطبيق الماكرو المسمى decode. هذا الماكرو يستقبل سبعة معاملات و أسماها الأخ s, t, u, m, p, e, d و لكن النقطة المهمة هي أنه استعمل المعامل: ## بين معاملات هذا الماكرو, المعامل ## كل ما يقوم به هو عملية جمع النصين, أي ببساطة لو لدينا a و b فيسكون ناتج a##b عبارة عن ab بعد ذلك تم استدعاء الماكرو, و ذلك بالمعاملات التالية: decode(a,n,i,m,a,t,e) لتفهم الذي حصل, فقط فكر كيف تعمل الدوال العادية, ماتم تمريره في الأعلى هي الـ arguments لهذا الماكرو, و ناتج هذا الماكرو هو جمع بعض الـ arguments مع بعضها البعض. الناتج بالطبع في النهاية: int m##a##i##n() { printf(" ArabTeam2000 "); return 0; } و من ثم يتم تحويله إلى: int main() { printf(" ArabTeam2000 "); return 0; } تحياتي...
  15. ما تقسيركم لهذا التصرف .

    يا أخ ofnet, في لغة C و ++C, يمكن للمبرمج أن يقوم بكتابة كود غير صحيح بكل بساطة, و ربما "يعمل" ذلك الكود, و لكن نتيجته لن تكون "محددة" دائماً. عندما تقوم بأي Undefined Behavior فأنت دخلت منطقة ضبابية, منذ تلك اللحظة البرنامج خاطئ و إن أعطى الإجابة الصحيحة. تخيل أنك تقوم بالتالي: int* addr = /* some random address */; std::cout << *addr; ما تراه عبارة عن Undefined Behavior, لأنك قمت بالوصول إلى ذاكرة لا تملكها. بالطبع في C و ++C لن يأتي أحد و يخبرك بأنك قمت بهذا الأمر, ببساطة ليس هناك run-time checking. بمجرد محاولتك الوصول إلى ذلك المكان الذي يشير إليه addr فإن برنامجك دخل منطقة ضبابية, النتائج يمكن أن تكون أي شيء! الآن يمكن أن نرجع للمثال الذي وضعته :) في C و ++C (في الحقيقة هما لغتان مختلفتان, و قواعدهما مختلفة في كثير من الأحيان, و لكن للتبسيط لا أكثر). فإننا عندما ندخل إلى statement فإن المترجم سيقوم بإحضار قيم المتغيرات الموجود في تلك الـ Statement. و هذه اللحظة تسمى Sequence Point, في حالتنا هذه سيقوم بإحضار a كما ترى, فإن a عندما تم إحضارها كانت قيمتها تساوي 5, ثم قمنا بالزيادة عليها بمقدار 1 طبعاً لا مشكلة حتى الآن, لأننا لو انتظرنا حتى نصل إلى الـ Sequence Point التالية, بحيث يتم إعادة a إلى مكانها لمن يريد الاستعلام عنها من جديد. و لكن الذي حصل, هو أننا قمنا بزيادة a مرة أخرى. في هذه المرة الثانية, أين حصلت الزيادة بالضبط؟! هل في a التي أحضرناها, أو في a الأصلية؟ هنا المشكلة. في لغة C و ++C لا يمكنك تعديل متغير أكثر من مرة واحدة بين two Sequence Points متتالية. بالطبع, كل مترجم حر أن يتصرف بالطريقة التي تعجبه, لأن الكود ليس صحيح أصلاً.(و لكن تذكر أنه ليس Syntax Error حتى يخبرك المترجم). هناك لغات, يتم تحديد معنى إحضار و إعادة a فيها, و يتم حل هذه المشكلة في تعريف اللغة نفسه. لا أعرف الكثير عن Java, و لكن حسبما أعرف ليس هناك Undefined Behavior فيها. طبعاً, سيطرأ سؤال مباشرة, و هو لماذا C و ++C لا تقومان بتعريف معنى إحضار a و إعادتها؟! الجواب, هو أن C و ++C تجبران المبرمج على عدم فعل ما تكلمنا عنه, و لكن في نفس الوقت, فهي تعطي المترجم حرية أكبر بكثير لفعل ما يريده. فربما يحضر المتغير إلى register, و هو الغالب, و في هذه الحالة يصبح هناك نسختان, و ربما يقوم بعمليات Optimization أخرى. المهم هو أننا طالما التزمنا بقوانين اللغة (و هي صعبة بالفعل), فإن المترجم سيعطينا الإجابة الصحيحة. عدا عن ذلك, فلا معنى للإجابة, لأن السؤال خاطئ في الأصل. تحياتي....
  16. كم طريقه تعرف للتعامل مع المصفوفات

    حلوة يا أبوحميد ما تخطر على بال :lol:
  17. السلام عليكم و رحمة الله و بركاته, أنهيت قبل فترة مشروعاً بسيطة, المشروع بكل بساطة هو عبارة Python-like Range! و لكن بلغة ++C و لمبرمجي ++C :) المشروع يتبع المواصفات القياسية للـ Containers و الـ Iterators, و إذا كنت تريد أن تكون دقيقاً كفاية فهو Immutable random access container. على العموم المشروع بسيط, و لكنه أخذ جهداً لا بأس به من القراءة حول موضوع الـ STL-like containers و للأسف لم أجد مكاناً يتكلم بشكل وافي عن الموضوع, و دائماً ما اضطررت الرجوع إلى الوثائق الخاصة بـ ++Cإضافة إلى هذا الموقع الرائع. الآن ما المطلوب من هذا الموضوع؟ لا ليس دعاية لمشروعي الظريف :lol: المطلوب هو مبرمج آخر أو اثنان, لكي نجعل المشروع محترم, و نقوم بكتابة مقال مطول حول كيفية البداية في كتابة STL-Like container. كما قلت سابقاً, المعلومات الموجودة حول الموضوع, إما عن كيفية استخدام STL, أو كتب متقدمة لا تصلح لمن يريد أن يتعرف على الموضوع, و تناقش أمور التصميم. عموماً, أتمنى لمن يريد المشاركة في كتابة المشروع و المقال(سيكون باللغة العربية و الإنجليزية), أن يذكر ذلك هنا, و نرتب بعد ذلك و لو بشكل بسيط لكي يصبح لدينا علم يصلح نشره, حتى لا نبدأ من الصفر, فإني قمت بكتابة range كمثال على STL-like Container, و المكتبة تحتوي على كمية جيدة من التعليقات, إضافة إلى كود اختبار جيد, إضافة إلى ثلاث أمثلة شاملة لكيفية البداية في استخدام range و من ثم التعامل مع STL containers إضافة Standard Algrithms, ربما الكود يعطي فكرة أوضح. أولاً مع أبسط مثال: #include <iostream> #include "../range.hpp" // everything belongs to range is in Range namespace using namespace Range; int main() { /* A range is a sequence of numeric elements. So, when you declare a range, you specify the first element(inclusive), the last element(exclusive) and finally how much difference is there between each two successive elements: range x(first_element = 1, last_element = 10, step_size = 2); The range would be like: [1, 10), [step = 2] The elements are: [1, 3, 5, 7, 9] */ range x(1, 10, 2); // you can use the range as if it were an array! range::value_type sum_of_range_elements = 0; for(std::size_t i = 0; i < x.size(); ++i) { sum_of_range_elements += x[i]; } // you can go with STL-style iterators! range::value_type product_of_range_elements = 1; for(range::iterator i = x.begin(); i != x.end(); ++i) { product_of_range_elements *= *i; } // printing the elements of the range std::cout << "The range x(1, 10, 2) consists of: [ "; for(range::iterator i = x.begin(); i != x.end(); ++i) { std::cout << *i << ' '; } std::cout << ']' << std::endl; std::cout << "The sum of x elements = " << sum_of_range_elements << std::endl; std::cout << "The product of x elements = " << product_of_range_elements << std::endl; } ثانياً مع كيفية استخدامه مع الـ Container: #include <iostream> #include <iomanip> #include <vector> #include "../range.hpp" // everything belongs to range is in Range namespace using namespace std; using namespace Range; int main() { // [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] range r(0, 100, 10); // range interpolates with STL-containers very well. // in fact it is an STL-like container! // range::value_type: is simply "int"! vector<int> numbers( r.begin(), r.end() ), reversed_numbers( r.rbegin(), r.rend() ); std::cout << std::setw(10) << "index" << std::setw(20) << "numbers" << std::setw(20) << "reversed_numbers" << std::endl; for(std::size_t i = 0; i < numbers.size(); ++i) { std::cout << std::setw(10) << i << std::setw(20) << numbers[i] << std::setw(20) << reversed_numbers[i] << std::endl; } } ثالثاً مع الخوارزميات: #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include "../range.hpp" // everything belongs to range is in Range namespace using namespace Range; /* range works with standards algorithms as well! range is immutable, i.e. you can't apply modifiying algorithms on it, only the non-modifiying algorithms can be applied. */ // A simple product functor. We will use it // with for_each struct functor { functor() : product(1) { } void operator()(int number) { product *= number; } int product; }; // to be used with count_if bool is_odd(int number) { return number % 2 == 1; } int main() { range r(1, 10, 1); // [1, 2, 3, 4, 5, 6, 7, 8, 9] // with for_each int product = std::for_each( r.begin(), r.end(), functor() ).product; std::cout << "the product of the range elements = " << product << std::endl; std::cout << std::endl; // with count_if int count_odd_numbers = std::count_if( r.begin(), r.end(), is_odd ); std::cout << "there are " << count_odd_numbers << " odd numbers in the range" << std::endl; std::cout << std::endl; // with accumulate // sum = 1000 + (range elements summation) int sum = std::accumulate( r.begin(), r.end(), 1000 ); std::cout << "the sum of the range elements + 1000 = " << sum << std::endl; std::cout << std::endl; // with partial_sum std::vector<int> partial_summation( r.size() ); std::partial_sum( r.begin(), r.end(), partial_summation.begin() ); for(std::size_t i = 0; i < partial_summation.size(); ++i) std::cout << "partial summation until " << r[i] << " = " << partial_summation[i] << std::endl; std::cout << std::endl; } تحياتي, range.zip
  18. ما تقسيركم لهذا التصرف .

    للأسف تحتاج إلى شرائها, أو الذهاب للموضوع المثبت للأخ محمد الذي وضع فيه كل الـ Standards الخاصة بـ C و ++C لتحميلها من هناك:) عموماً, هذه إجابة كنت قد أجبتها منذ فترة في SO حول الموضوع. و ستجد في الإجابة التي تعلو إجابتي طلبك. أنا قمت بشرح الموضوع بطريقة مبسطة, بينما الـ Standards تعرفها بشكل صارم لمنع حصول إشكال, لذلك قد تجد الـ Standards غير مفهومة إن لم تكن لديك خلفية حول الموضوع. ابحث في SO حول Undefined Behavior و ستجد الكثير, تحياتي....
  19. ما تقسيركم لهذا التصرف .

    السلام عليكم ... هذا الأمر خاطئ من ناحية الـ Semantics الخاصة بـ ++C و C. كل ما في الأمر, أنه Undefined Behavior لأنك تقوم بتعديل قيمة متغير أكثر من مرة خلال Sequence Point واحدة. باختصار الأمر خاطئ, و لا يوجد مترجم صحيح و الآخر خاطئ لأن الكود نفسه خاطئ. في C و ++C ليس كل شيء خاطئ يعطى Syntax Error, لأنك لو تلاحظ ليس هناك خطأ لغوي. حاول الإطلاع على معنى الـ Undefined Behavior في الـ Cpp Standards. تحياتي...
  20. كم طريقه تعرف للتعامل مع المصفوفات

    Salam Alikum, I just got 3 ways for now :) x[0]; // 1 *(x+0); // 2 0[x]; // 3
  21. caballero, عذراً على التأخير, لدي اختبارات و نسيت نفسي :P سأطلع على الحل قريباً بإذن الله, تحياتي...
  22. السلام عليكم و رحمة الله و بركاته, كيف أستطيع حل Congruence Relation من الدرجة الثالثة كالتالي: LaTeX حيث أن المطلوب إيجاد جميع قيم x الصحيحة في الفترة: LaTeX تحياتي,
  23. الخطأ C2678

    السلام عليكم ... هناك ملاحظتان, الملاحظة الأولى, هي أن: bool DArray::operator ==(const DArray& comparator) تعرف comparator على أنه كائن const, بالتالي لا يمكن استدعاء أي دالة من دواله الغير معرفة على أنها const. لذلك نقوم بإضافة دالة جديدة للمعامل [] بحيث تكون const: int operator [] (int nIndex) const; const في آخر التعريف تعني أن الدالة لا تغير الكائن, و بالتالي يصبح باستطاعتنا مناداتها على كائنات معرفة على أنها const. الملاحظة الثانية, هي أن: this->operator [] خاطئة لغوياً, يمكنك كتابتها بالطريقتيتن التاليتين: (*this)[counter] أو ببساطة: itsArray[counter] مع التعديل يصبح الكود لديك: class DArray { public: DArray(int); ~DArray(); int GetNumOfElements() const {return itsNumOfElements;} void SetNumOfElements(int newNum) { itsNumOfElements=newNum;} int& operator [] (int); int operator [] (int nIndex) const; // 1 bool operator == (const DArray&); bool operator < (const DArray&); private: int *itsArray; int itsNumOfElements; }; DArray::DArray(int NumberOfElements) { itsArray = new int [NumberOfElements]; itsNumOfElements = NumberOfElements; } DArray::~DArray() { delete [] itsArray; } int& DArray::operator [] (int nIndex) { return itsArray[nIndex]; } int DArray::operator [] (int nIndex) const { return itsArray[nIndex]; } bool DArray::operator ==(const DArray& comparator) { if (this->GetNumOfElements() == comparator.GetNumOfElements()) { bool equals=true; for (int counter = 0 ; counter < this->GetNumOfElements() ; counter++) { if ( itsArray[counter] != comparator[counter]) // 2 { equals = false; break; } } return equals; } else return false; } bool DArray::operator < (const DArray& comparator) { if (this->GetNumOfElements() < comparator.GetNumOfElements()) return true; else if (this->GetNumOfElements() == comparator.GetNumOfElements()) { int total1 = 0 , total2 = 0; for (int counter = 0 ; counter < this->GetNumOfElements() ; counter++) { total1 += itsArray[counter]; // 3 total2 += comparator[counter]; } return (total1 < total2); } else return false; } و بهذا تصحح جميع الأخطاء اللغوية في الكود.
  24. المصفوفات و عناويين الذاكرة

    99.99999999999% من البرامج التي نصنعها تكون I/O bounded أو network bounded أما القلة القليلة من البرامج التي تكون Computationally bounded فهي في الغالب تكون على الـ HPC, و ليست على الأجهزة الشخصية. في تلك الحالة بالفعل يتم كتابة أجزاء ليست بالهينة بالـ Assembly الخاصة بتلك المنصة. تحياتي....
  25. المصفوفات و عناويين الذاكرة

    كلام سليم, الأمر ببساطة أن "لغة" ++C تشترط أن عناصر المصفوفة تكون متتالية في الذاكرة, هذا بالطبع شرط يجب على صانع المترجم أن يحققه لكي يصبح المترجم الذي يصنعه مترجم ++C حقيقي. بينما في حالة المتغيرات المحلية, فرغم أنها تكون متتالية في تعريفها داخل دالة مثلاً, لا يشترط على صانع المترجم أن يضع تلك المتغيرات في أماكن متتالية في الذاكرة, في الحقيقة أن اللغة لا تشترط عليه شيء. الآن, هل هذا يعني أن المتغيرات يجب ألا تكون متتالية في الذاكرة؟! بالطبع لا, لأننا نقول أن اللغة لا تشترط و هذا يعني أن المترجم حر بترتيبهم حسبما يريد. و لكن في غالب الأحيان فإنه يتم وضعهم في أماكن متتالية في الذاكرة. هناك أحيان يقوم فيها المترجم بإعادة ترتيب المتغيرات, و ذلك يتعلق بعملية الـ Padding لتسريع عملية الوصول إلى المتغيرات في الذاكرة, و لكن هذا Implementation Detail لا أكثر. عموماً, لا تشغل بالك بأيهم أسرع لأنه لا يوجد شيء أسرع من شيء, و إنما هناك حالة أسرع من حالة, و نحن نتكلم عن جزء من المليون في الثانية حتى لو وضعنا حاسوباً يراقب الموضوع فلن يلاحظه. لذلك مواضيع الـ performance في الغالب كلها كلام في كلام :) تحياتي...