• الإعلانات

    • فيصل الحربي

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

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

Khaled Alshaya

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

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

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

مشاركه بواسطة Khaled Alshaya


  1. إذا كنت فهمت سؤالك بشكل صحيح, فأنت تريد ترجمة برنامج مكتوب على Linux لكي يعمل على Windows أيضاً. هل استخدمت مكتبات غير المكتبات القياسية؟ إذا كانت الإجابة بنعم فماهي تلك المكتبات لكي نبحث الاحتمالية, و إذا كانت الإجابة بلا, فالترجمة بدون مشاكل على Windows, هناك عدة مترجمات لنظام Windows يمكنك استخدام أحدها بكل بساطة.

    1

  2. مع احترامي أخي محمد يجب أن تصارع الديناصورات أولاً لكي تكتب عن أنظمة التشغيل.

    و لا تعتقد أن أمزح بكلمة الديناصورات لو أنك قرأت عن أنظمة التشغيل بشكل علمي لعلمت ماذا أقصد :)

    1

  3. أخ mental-driller, بالمثال يتضح المقال بدلاً من التعميم.

    تصور أنك تقوم بكتابة Data Structure معينة, و تريد توفير Iterators لهيكل البيانات الذي تقوم ببنائه. الدوال التي سيحتاجها الـ Iterator ستكون دوالاً يجب أن لا تسمح لأحد غير الـ Iterator بالوصول إليها و هذا منطقي و إلا ما الحاجة إلا الـ Iterator أصلاً؟

    إما أن تكون تلك الدوال public في واجهة الكائن الأصلية و إما أن تكون private. إذا كانت private لا يمكن لأحد الوصول إليها من خارج الكائن, و إذا كانت public فأنت تصدر دوالاً عبارة عن helpers في واجهة الكائن و تكسر الـ encapsulation. ماذا لو كان هناك friend class تستطيع الوصول إلى هذه الدوال دون أن تكون في واجهة الـ data structure التي نقوم ببنائها؟ فكر في هذا المثال.

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

    ملاحظة بسيطة, و هي أنه يمكن أن يحتج على على استخدام friend باستخدام inner classes بدلاً من ذلك, و هذه مشاكلها لا تنتهي بالمناسبة :) أدع لك القراءة في ورقة ممتعة من Stroustrup تنطبق على ++C و #C في نفس الوقت:

    Minimizing Dependencies within Generic Classes for Faster and Smaller Programs

    ملاحظة إضافية:

    كما انها تخلط الOOP بالـــ Procedural Paradigm

    و من قال أن الخلط بين الأساليب يؤدي دائماً إلى كود سيء؟ :lol:

    إضافة أخرى, هذه الأسئلة التي تتعلق بـ friend في SO, استمتع:

    http://stackoverflow.com/questions/tagged/c%2b%2b%20friend

    تحياتي...

    6

  4. باختصار تكسر الـــــــ encapsulation

    عزيزي لا تعتمد على المقارنات الموجودة على الويب لبناء آرائك حول إمكانات معينة لـ ++C. قولك بأنها تكسر الـ encapsulation يعني أنك لا تفهم وظيفة friend, لأنها في الحقيقة تقوي الـ encapsulation, و ليس هذا الموضوع مجالاً لنقاش هذه النقطة و لكن أحببت أن أستفسر عن رأيك و كما يبدو أنه نفس الكلام الموجود في مواقع كثيرة دون وعي عن ماهية الـ friend functions & classes.

    تحياتي...

    0

  5. ماهي المشكلة هي انها تترك الطريق مفتوح ، مثلا وجود الدوال من نوع friend يفتح الطريق لاكواد سيئة كان يمكن كتابتها بطرق اخرى.

    ماهي وظيفة friend برأيك, و مالفائدة من وضعها في ++C, و الأهم كيف تفتح الطريق أما كتابة كود سيء؟

    0

  6. للأخ الذي يسأل كيف يجد الكتاب أقول له لا تتعب نفسك أصلاً. الكتاب ليس guide من أبو 24 ساعة, أو تعلم البرمجة و أنت نائم.

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

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

    2

  7. و الله عن نفسي قرأت الفصل المتعلق بالـ Arbitrary Precision Math, عبارة عن 10 صفحات تقريباً استغرق الأمر أكثر من ثلاثة أشهر مع استشارة أكثر من دكتور في بعض المسائل و لم أستطع فهم الموضوع بشكل كامل. عموماً في النهاية ستكتشف أنك تحتاج إلى أن تكون قد شبعت حتى التخمة من الرياضيات البحتة و المتقطعة - و ستراه يدخل الرياضيات المتصلة بالمتقطعة! - حتى يصح أن تمسك الكتاب بيديك دع عنك القراءة فيه! لذلك عندما تقول بأنك قرأته يجب أن تحل المسائل في آخر كل فصل :) و ليس مجرد مسك الكتاب و تصفحه. إضافة بسيطة, أكره استخدام Knuth لآلته الافتراضية, لو أنه كتب الخوارزميات بلغة C لسهل الأمر على القراء بشكل كبير :(

    و +1 للأخ mental-driller, و لكن Concrete Math هو كتاب لطلاب الدراسات العليا فما بالك بـ TAOCP!!!

    تحياتي...

    0

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

    أفضل شيء هو الترجمة بأعلى مستوى تحذير مع إبطال أي extensions يقدمها VC:

    /Wall و Za/

    1

  9. عزيزي محمد,

    بالنسبة للمتغيرات المؤقتة في مثالك, فإن حياتها تنتهي بمجرد الخروج من الـ Initialization, راجع 12.2

    و على فرض أننا لم نستخدم متغيرات مؤقتة كما في مثالك, فإن الموضوع الذي أشرت إليه سابقاً ينطبق على سؤالك. لا أدري لماذا فهمت أن الموضوع ينطبق على char فقط, بينما كان مثالاً على المشكلة في الوثائق و لكنه ينطبق على المؤشرات حيث درجة الـ indirection عبارة عن 2 أو أكثر.

    تحياتي...

    1

  10. السلام عليكم ...

    بصراحة السؤال صعب و حيرني, و لكن هذا ما عندي.

    أولاً بالنسبة للسطر التالي:

    Number* n[] = { &Number(2), &Number(3), &Number(5), &Number(7) };

    n عبارة عن مصفوفة مؤشرات, قمت بتهيئتها بعنواين متغيرات مؤقتة, هل هذا يصح أصلاً؟

    ثانياً, أذكر أننا تكلمنا في موضوع الـ Aliasing هذا مرة سابقة:

    ال Overloading و ال Type Checking

    0

  11. عزيزي PWCT Maker,

    حسب السياق يتضح المعنى. كلمة Translator متداولة أكثر عند الحديث عن الناحية النظرية سواء كان ذلك الـ Translator عبارة FSM أو Automaton أو حتى Turing Machine بعظمتها! عندما يكون الحديث على التطبيق يطلق عليه Compiler. و لكن كما قلت سابقاً كلمة Translator عامة أكثر من Compiler, بينما الأخيرة انحصر استخدامها في معنى واحد.

    ال Translator يفترض صحة الكود من اللغة المصدر Source Language التى يحول منها

    وبالتالى يقوم ال Translator بالتحويل بدون القيام ب Syntax Analysis ولو اعطيته كود خاطىء سيتحول الى كود خاطىء

    الـ Syntax Analysis ماهي إلا عملية الـ Deriving. يعني أنك ستبني الـ Parsing Tree, و لاحظ أن الشجرة هنا المقصود بها الشجرة نظرياً. كون الـ Translator يقوم بعمل Backtracking في حالة وجود خطأ فهذا ليس مهماً من الناحية النظرية لسبب بسيط. أنك عندما تقوم بكتابة القواعد فإن أي خطأ يعني أن الـ machine انتقلت للـ halt state. بمعنى آخر أن أي خطأ يوقف عملية الترجمة كلها. في الحياة العملية هذا يجعل العمل مع المترجم مستحيلاً, لذلك لابد من تحديد سبب الخطأ(التحديد بشكل مطلق غير ممكن, و لكن المترجم يقدم اقتراحات من خلال توقعات). إضافة إلى ذلك فإنه يفترض إحدى تلك التوقعات و يسير في عملية الترجمة حتى يواجه خطأ آخر, و يحاول افتراض أن المبرمج يقصد قاعدة محددة. و بذلك تحصل على قائمة من الأخطاء بدلاً من ترجمة الكود من جديد عند حصول أي خطأ.

    تحياتي,

    0

  12. وثانيا: كلامي مفيد. لاحظ انني انصح بقراءة كتاب + نظام تشغيل بسيط minix3 لبدئ التجارب فيه. وهذا يندرج تحت "قل خيرا"... وهذا افضل مايمكن "قوله" في هذا "المقام"

    ماهو الكتاب الذي تنصح به حضرتك, و هل جربت تعلم أنظمة التشغيل من خلال Minix3 حقاً؟! لن أعطيك رأيي في الدخول من خلاله لهذا العالم و لكن أول سطرين في الموقع يشرحون لمن يوجه النظام:

    What Is MINIX 3?

    MINIX 3 is a new open-source operating system designed to be highly reliable, flexible, and secure. It is loosely based somewhat on previous versions of MINIX, but is fundamentally different in many key ways. MINIX 1 and 2 were intended as teaching tools; MINIX 3 adds the new goal of being usable as a serious system on resource-limited and embedded computers and for applications requiring high reliability

    0

  13. هو ليس نظام تشغيل بالمعنى الكلاسيكي نعم. ولكن تخيل الرؤية المستقبلية التي يراها البعض. أجهزة الحاسب الشخصية ليست سوى متصفح إنترنت دون أي شئ آخر. ليس لديك ذاكرة أو معالج أو كرت شاشة (غير تلك التي تحتاجها لتشغيل المتصفح). عندها سيكون موقع مثل فيسبوك أقرب لنظام تشغيل. وهناك اتجاه حقيقي لنقل العتاد إلى السحابة. أنا أستطيع الآن عن طريق خدمة OnLive أن ألعب لعبة متطورة مثل Duke Nukem Forever على جهاز لابتوب متواضع ليس فيه حتى كرت شاشة 3D.

    ستحتاج إلى المزيد من العتاد لأنك تضيف طبقة إضافية.

    0

  14. أعتقد أن استخدام لغة C سيكون أفضل لأنه سيكون لديك Standard ABI على كل منصة. ++C ممتازة جداً في استيعاب أي ABI و لكنها الأسوأ في التصدير لأنه ليس هناك ABI موحدة بأي شكل من الأشكال! إذا كنت مصراً على استخدام ++C فستحتاج للقيام بتصدير C-Interface و هذا ممكن عمله بـ ++C, و لكن لا ليس هناك داع لهذا الأمر من الأساس برأيي.

    ابحث عن مكتبة C جاهزة و قم بتعديلها لتلائم API نظامك, و انس فكرة مكتبة ++C. مكتبة C ليست لعبة لكي تدرجها تحت بند فرعي, هي مشروع قائم بذاته.

    تحياتي...

    0

  15. بصراحة رأي شخصي لا فائدة من هذه الأدوات الغبية لأنها في النهاية ستنتج كوداً سيئاً و لن تستغل نقاط قوة كل لغة و لن تتفادى سلبياتها. ببساطة الترجمة الميكانيكية لن تنتج لك كود سريع في ++C و لا expressive كود في JS و هكذا!

    5

  16. أخي محمد,

    في مثالك الكود صحيح لأنك تقوم بإسناد كائن مؤقت حياته لا تنتهي بمجرد الخروج من الدالة, بينما إذا أعادت أي من الدالتين مرجعاً لنص فإن الكود يندرج تحت الـ undefined behavior. لاحظ أننا نتكلم عن هذا الأمر فقط في حالة المراجع الـ const بينما إذا كان الطرف الأيسر بالطبع مرجعاً فقط و ليس مرجعاً ثابتاً فهذا لا يجوز أيضاً.

    0

  17. عزيزي هناك طريقتان لفعل أي شيء إما أن تستخدم عجلة جاهزة أو أن تعيد اختراع العجلة :)

    أنا أختار استخدام Boost.Program_options و هي مكتبة رائعة بحق, و تمكنك من التعامل مع الـ Command Line و الـ Config Files و Environment Variables بكل سهولة, فقط اشرح لها ما تريد!!!

    بالمناسبة بحثت في Boost عن مكتبة تفعل ما تريده بعد قراءة سؤالك و لم يسبق لي التجربة من قبل و خرجت بالمثال التالي الذي قمت بكتابته في 10 دقائق لذلك سنركز على الـ Command Line فقط.

    أولاً خذ المثال التالي و جربه:

    #include <iostream>
    #include <string>
    #include <boost/program_options.hpp>
    namespace po = boost::program_options;

    int main(int argc, char* argv[])
    {
    po::options_description scheme("command line options");
    scheme.add_options()
    ("help", "print the command line options help page")
    ("first_name", po::value<std::string>(), "set first name")
    ("last_name", po::value<std::string>(), "set last name")
    ("age", po::value<int>(), "set age");
    po::variables_map options;
    po::store(po::parse_command_line(argc, argv, scheme), options);
    po::notify(options);

    if(options.count("help"))
    {
    std::cout << scheme;
    return 0;
    }
    std::cout << "first_name: ";
    if(options.count("first_name"))
    std::cout << options["first_name"].as<std::string>();
    else
    std::cout << "[first name wasn't specified]";
    std::cout << std::endl;
    std::cout << "last_name: ";
    if(options.count("last_name"))
    std::cout << options["last_name"].as<std::string>();
    else
    std::cout << "[last name wasn't specified]";
    std::cout << std::endl;
    std::cout << "age: ";
    if(options.count("age"))
    std::cout << options["age"].as<int>();
    else
    std::cout << "[age wasn't specified]";
    }

    هذه تجاربي مع الكود:

    post-89451-000695600 1308365994_thumb.pn

    يمكننا أن نتشارك في فهم الكود إن كانت Boost توافق رغباتك, رغم أن قراءة سريعة للوثائق كافية لتعلم أساسيات المكتبة.

    تحياتي...

    1

  18. أخي mental-driller, ما دام أنك تحاول إسناد متغير انتهت حياته إلى مرجع فما تقوم به غير صحيح. اللغة تحميك من الوقوع في المحظور من خلال منع إسناد القيمة العائدة من الدالة إلى مرجع إذا كانت تلك القيمة A مثلاً. أما إن كان النوع العائد عبارة عن مرجع &A ففي تلك الحالة أنت المسؤول عن ضمان الصلاحية. بمعنى أنك في الحالة التي تقول أن كودك صحيح أعدت مرجعاً لكائن قد انتهت حياته أصلاً بمجرد الخروج من الدالة. اللغة تسمح بفعل هذا الشيء رغم أن هذه الحالة خاطئة, لأنك قد تعيد أحد أعضاء الكائن و متغيرات الكائن(كالعدد الصحيح في مثالك) لا تنتهي بمجرد الخروج من الدالة و إنما بانتهاء حياة الكائن نفسه.

    عذراً أخي علي لم أفهم نقطتك, هل من الممكن أن توضح أكثر؟

    0

  19. بالطبع يمكنك بناء string class تتعامل مع أي ترميز تريده و معظم الـ frameworks الشهيرة تأتي بكائن نص يستعمل ترميز معين و لكن أعتقد أنك تقصد الـ utf-8 literal هذا غير موجود, و لكن في Cpp0x هناك literals لجميع أنواع الترميزات و يمكنك بناء أي literal تريده في الحقيقة :)

    2