• الإعلانات

    • فيصل الحربي

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

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

Khaled Alshaya

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

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

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

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

  1. بشكل عام, تستخدم ++C في جميع أنواع الـ Backends. بمعنى أبسط, إذا أردت بناء مكتبة, و استعمالها بـ ++C أو بغيرها فهي من أفضل اللغات من هذه الناحية. بالنسبة لبناء Desktop Application فلا مشكلة يوجد العديد من الـ Frameworks التي يمكن الاختيار منها. أما الويب فمن الأفضل أن تستخدم لغة أخرى تسهل لك الموضوع لأنه ++C ليست موجهة لتطبيقات الويب رغم أنها تستخدم في كثير من المواقع الكبيرة و لكن وراءة الستار و ليس للموقع نفسه.
  2. ترتيب ملف شكلا

    السلام عليكم ... فكري فيها كأنت تقومين بتصميم برنامج كـ Excel. مجموعة من الصفوف و الأعمدة. خلايا المصفوفة عبارة عن الكلمات, و أطول كلمة في كل عامود هي من يحدد طول الخلية. بالطبع نحتاج للمرور على جميع الكلمات في كل عمود و صف للحصول على أطول كلمة في كل عمود. ثم نقوم بعملية الإخراج بناء على طول أطول كلمة في كل عامود و نضيف الـ justification الإضافية التي نريدها. أنا أضفت مسافتين إضافيتين في لكل عمود. المشكلة أن الكود بـ ++C, لذلك حاولي أن تجدي طريقك فيه :) #include <cstddef> #include <fstream> #include <sstream> #include <string> #include <vector> #include <algorithm> using namespace std; // look down for what this function does! bool words_count_comparator (const vector<string>& lhs, const vector<string>& rhs) { return lhs.size() < rhs.size(); } int main() { // get the unjustified text from input.txt, // and produce justified text in output.txt ifstream input("input.txt"); ofstream output("output.txt", ios::out); // we store in words_matrix every word in every line alone. vector<vector<string>> words_matrix; // this will store how many characters we need in each column. vector<size_t> columns_justification; // used for extracting the lines and words out of raw text. string line, word; // get the longest line(words per line) size_t max_words_in_row; // extract words out of text. while( getline(input, line) ) { vector<string> tokenized_line; stringstream line_tokenizer(line); while( line_tokenizer >> word ) tokenized_line.push_back(word); words_matrix.push_back(tokenized_line); } max_words_in_row = max_element (words_matrix.begin(), words_matrix.end(), words_count_comparator)->size(); columns_justification.resize(max_words_in_row); for(size_t i = 0; i < words_matrix.size(); ++i) for(size_t j = 0; j < words_matrix[i].size(); ++j) columns_justification[j] = max (words_matrix[i][j].size(), columns_justification[j]); for(size_t i = 0; i < words_matrix.size(); ++i) { for(size_t j = 0; j < words_matrix[i].size(); ++j) { // print them with the specified justification for each column. // we added two spaces for each column as extra spaces. output << words_matrix[i][j] << string(columns_justification[j] - words_matrix[i][j].size()+2, ' '); } output << endl; } } المثال التي وضعتيه: بعد المرور على البرنامج: تحياتي...
  3. أخ محمد, هناك العديد من الدوال في المكتبة القياسية لـ C لمعرفة نوع الحرف: http://en.wikipedia.org/wiki/Ctype.h#The_contents_of_.3Cctype.h.3E
  4. أستاذي ياسر, ألا تعتقد أن من حصل على ثلاثين نقطة مثلاً و عرضها للإجابة عن سؤاله, بالفعل قد قدم للمنتدى الكثير بحصوله عليها في المقام الأول؟ لذلك لن يستطيع القيام بذلك إلا شخص أفاد و استفاد. تحياتي...
  5. لم نكن نحاول اختراع طريقة, عبارة عن سؤال للمتعة لا أكثر :)
  6. يا محمد, عملتلي شورت في آخر فيوز كان عندي :lol: كلامك تمام و صحيح 100%. لم أكن أعرف أن هناك Ranges مطلوبة من الـ standards! دائماً, كنت أعتقد أن قواعد الأحجام هي المطبقة, و عندما قرأت مشاركتك أول مرة اعتقدت أنها تتعارض مع قواعد الأحجام! هنا تلخيص للـ standards الخاصة بـ ++C: http://stackoverflow.com/questions/271076/what-is-the-difference-between-an-int-and-a-long-in-c/271132#271132 عموماً, لابد أن أرفع لك القبعة الآن :happy:
  7. أخ محمد بالفعل, آخر draft لـ C يحدد "أصغر" مدى ممكن لتلك الأنواع و يترك للـ implementation الحرية في أن يكون المدى أكبر من ذلك! لم أكن أعرف ذلك صراحة, و هذه أحد نقاط الإختلاف الجديدة بين ++C و C :) بدأت الأسلاك تتشابك في عقلي, سأعود لهذه النقطة بعد قليل من القراءة. تحياتي...
  8. أهلاً أخي محمد, هذه عبارة عن implementation defined constants. و 03++C تعتمد على C89, و Cpp0x تعتمد على C99. و في كلا الحالتين, مدى الأنواع متروك للـ Implementation. هذا بالنسبة لـ ++C و أنا متأكد منه. المعلومة الجديدة, و بصراحة انا متفاجئ منها :lol: هي المتعلقة بآخر C draft. هل من مكان لتحميله بعد إذنك. رغم أن الـ C standards الحالية تعتبر هي لغة C, و لكن من الغريب أن تقوم C بتعريف أصغر مدى للأنواع. سأقرأه و ربما نتوصل إلى نقاش مثمر بإذن الله. تعديل: ------- أخ محمد كيف يكون آخر draft في 25-7-2010 ربما تقصد 25-6-2010 :P جاري القراءة... تحياتي...
  9. المكتبة مع h أو بدونها

    السلام عليكم ... الموضوع ببساطة, أنه لم يكن هناك "مرجع" standards للغة ++C. و كانت جميع الـ classes و الدوال و الثوابت و غيرها تأتي في المجال العام global مثل C بالضبط. هذا خلق الكثير من المشاكل, خصوصاً عندما تقوم بكتابة دالة لها نفس الإسم لماهو موجود في الـ standard library. قام مصممو ++C باعتماد الـ namespaces, و وضعوا جميع المكتبات القياسية في الـ namespace المسمى std. عملية تنظيمية لا أكثر. ثم فرضوا على جميع صناع المترجمات, بأن تكون الـ headers القياسية, بدون لواحق extensions و هذه هي كل القصة. فقط للتفريق بين الـ headers القديمة التي كان يوفرها صناع المترجمات. و بين الـ headers الجديدة بعد اعتماد الـ standards. لاتخلط بين الـ Cpp standard library و بين الـ run-time library. الفرق أن الأولى هي مكتبة ++C, و الثانية هي مكتبة يحتاجها المترجم و ليس لها علاقة فعلياً بـ ++C و ربما تكون مكتوبة بلغة أخرى. ببساطة, الـ run-time library من اسمها, عبارة عن مكتبة تقوم مقام "الصمغ" بين البرنامج الذي تقوم بكتابته بـ ++C و بين نظام التشغيل الذي سيعمل عليه البرنامج. مثلاً, عندما تقوم بتشغيل برنامج مكتوب بـ ++C, فإن هناك كود يعمل قبل main يقوم بتجهيز بعض الأمور لبرنامجك كحجز مساحة افتراضية من الـ heap و تحديد أولوية الـ process الخاصة ببرنامجك, و تمرير command line arguments لـ main ثم ينقل التحكم لـ main. و بعد الإنتهاء من البرنامج يقوم بعمل cleaning و خلافه. المهم, هو أنك لا يجب أن تشغل بالك بالـ run-time library لأنها مكتبة مساعدة للمترجم و ليس للمبرمج. و هي تختلف باختلاف نظام التشغيل و باختلاف نسخة نظام التشغيل و نسخة المترجم. باختصار ليس لك علاقة بها كمبرمج. تحياتي...
  10. لغة C و ++C لاتحددان لا القيم الصغرى و لا القيم الكبرى. ببساطة, لاتحددان سوى التالي: char <= short int <= int <= long إضافة إلى أن جميع الأنواع أحجامها من مضاعفات char, و هذا يعني أنه من الممكن أن تكون جميع الأنواع بنفس حجم char! و لكن هذا ليس شائعاً. هو بالفعل في صالح C. و لذلك C و ++C تستخدمان كـ Infrastructure. و لكن مع هذا يأتي وجع الرأس, و القواعد الغريبة أحياناً للغة لجعلها Super Portable. أي أنه trade-off و لكن في هذه الناحية, بالطبع هو من صالح C إن كنت تستخدم C بالطريقة الصحيحة.
  11. في الحقيقة, أن المؤشرات ليست أنواع أولية بالمعنى "الدقيق". و كما قلت لك سابقاً, اصطلح على تعريف int على أنه الـ word الخاصة بالـ machine التي يعمل عليها البرنامج. و لكن هذا ليس شرطاً مطلوباً. أما *void فهي عبارة عن مؤشرات خاصة, تستطيع حمل أي نوع من أنواع المؤشرات الأخرى, و بالتالي, يجب أن تكون كبيرة كفاية لحمل أي نوع مؤشرات. و هذا باعتقادي سبب استخدامها في الكود الذي وضعته. برأيي الشخصي, استخدام int أفضل, لأن هذا هو الاستخدام الشائع. لاحظ أن *void أو أي مؤشر ليس من الضرورة أن يكون نوعاً بسيطاً, فربما يكون نوعاً مركباً بكل بساطة. هل تذكر أيام Segmentations و خلافه؟ المؤشر كان عبارة عن قسمان قسم للـ Segmentation و قسم للـ offset. و بالتالي, سيكون حجم المؤشر يختلف عن حجم الـ word في المنصة. حالياً, مع انتشار الـ Virtual Memory فالأمر أصبح شبه معتمد بأن المؤشرات عبارة عن أنواع بسيطة. و لكن نعود من جديد للنقطة الأساسية, و هي أن الـ C و ++C كـ Standards لاتفترضان أياً مما نتحدث عنه على شكل شروط. يعتقد البعض أن C سيئة في هذه الناحية, من حيث أننا لا نستطيع معرفة حجم المتغير(العددي على سبيل المثال) الذي نتعامل معه, و هذا يعطي أفضلية للغات الأخرى. بالطبع هذا لو كنا نتكلم في مادة programming 1 :) سأريك شيئاً في ++C, و يمكنك فعل نفس الشيء في C. للأسف مترجم Microsoft لايدعم ذلك الأمر للغة C.(المكتبة غير متوفرة افتراضياً لـ VC و لكن هناك مكتبة يمكن تحميلها بكل بساطة لفعل الأمر): #include <boost/integer.hpp> int main() { boost::uint8_t octet; boost::uint16_t two_octets; boost::uint32_t four_octects; boost::uint64_t eight_octets; boost::uintmax_t max_int; // maximum unsigned integer type available. } هل ترى, لدينا الأنواع ذات الأحجام المحددة في C و ++C :) هل تريد رؤية مزيد من المرونة: boost::int_t<32>::exact exactly_32_bits; boost::int_max_value_t<9999>::fast this_variable_can_hold_9999_for_sure; يمكن الحصول على ما تريد بكل بساطة, و بمرونة غير موجودة في أي مكان آخر. و لكن لاحظ, أن هذه الأشياء مفيدة على مستوى الـ system programming و بكل بساطة ليس هناك فائدة منها عندما تريد بناء برنامج شؤون الموظفين. لايجب الخلط بين مهمة C و ++C و بين الحاجة إلى abstractions أعلى. في ++C يمكنك الحصول على Abstractions كالموجودة في أي لغة أخرى, أما في C فهي بطبعها low level. متى نحتاج إلى هذه المرونة؟ بالطبع, لن تقضي حياتك كلها مع أحجام البيانات :) سأضرب لك مثالاً, تعلمته من مكتبة نار على علم بلغة C, و أحاول تطبيقه في مكتبتي الجديدة uint و لكن بـ ++C. هناك مكتبة اسمها gmp. هذه المكتبة تعتبر بلاشك أحد أقوى المكتبات التي عرفها المبرمجون على الإطلاق. مهمتها هي التعامل مع الأعداد الكبيرة جداً. و نحن نتكلم هناك عن آلالف الخانات وصولاً إلى ملايين الخانات. سنأخذ عملية الجمع كمثال بسيط جداً. مع مراعاة أننا أغفلنا عملية إدخال الأعداد و إخراجها لتبسيط الفكرة لا أكثر. الأعداد العملاقة التي لا يمكن تمثيلها بالأنواع الأولية في أي لغة, يتم تحويلها إلى base آخر. ربما يستخدم كل octet أو byte إن أحببت تسميته كـ خانة. بالتالي تصبح كل خانة قادرة على حمل الأعداد من 0 إلى 255. ببساطة نتعامل مع أعداد base 256. أو يمكننا أن نعمل على خانات عملاقة. بحيث تكون كل خانة عبارة int. الآن, من المعلوم أنك إذا أردت أقصى سرعة حسابية في المعالج, فالمفروض أن تعمل على حجم الـ registers. بالتالي, يمكننا تمثيل كل خانة بـحجم register واحد. و لكن كيف نقوم بذلك portably؟ هنا تأتي فكرة عدم تحديد أحجام البيانات في C. فيمكننا ترك عملية تحديد حجم الخانة, لكل مترجم, و بالتالي سنعمل على حجم الـ register و الذي في الغالب هو حجم int كما تكلمنا سابقاً. هذه هي الفكرة. سأدع طريقة الحصول على الحجم المطلوب لأنها تحتاج إلى الكثير من الكود في C و لننظر إلى خوارزمية جمع الأعداد العملاقة عندما نقوم بكتابتها بشكل generic في C: component carry = 0; for(size_t i = 0; i < components; ++i) { double_component sum = (double_compoenet)lhs[i] + rhs[i] + carry; lhs[i] = component_sum(sum); carry = component_carry(sum); } الآن لو استطعنا جعل كل مترجم يقوم باختيار الأنواع المناسبة لـ component و double_component بحيث يكون حجم الثاني ضعف حجم الأول, مع الأخذ في الحسبان أننا نريد أكبر أحجام ممكنة على المنصة التي نترجم لها, سنحصل على أكبر efficiency ممكنة دون أن نلجأ للـ Assembly الخاصة بالمنصة. كيفية الحصول على أكبر حجم ممكن إضافة إلى نوع بنصف ذلك الحجم متروك كتمرين للقارئ العزيز :lol: إذا كان الكلام مشتتاً فلاتقلق, أنت تسير على الطريق الصحيح, كل ما عليك أن تصبر قليلاً, و سنرى مبرمج C ماهر بيننا بإذن الله. تحياتي...
  12. السلام عليكم ... سؤال جميل أخي هويدي :) دعني أوضح لك شيئاً في البداية. لغة C عندما صممت, وضع في الحسبان أنها ستعمل على أنظمة مختلفة جذرياً. حتى افتراض أن الـ Byte يحتوي على 8 bits لا يفترض في لغة C! لغة C و ++C تعملان "فعلياً" على أنظمة حيث عدد الـ Bits في الـ Byte الواحدة يمكن 8 أو غير ذلك. مثال ذلك, بعض الـ DSP-Digital Signal Processors التي تحتوي على byte بحجم 40 bits. أنواع البيانات تكون من مضاعفات الـ Byte, و لا تنسى أننا قلنا بأن الـ Byte لا يفترض أن يكون أصلاً 8 bits. بالطبع, ربما لن ترى في حياتك كلها تلك المنصات حيث الـ byte لا يتكون من 8 bits. أصبحت الـ Byte مرادفاً لـ 8 bits رغم أن المصطلح الأدق هو octet. حسناً, ماذا عن أنواع البيانات؟ أنواع البيانات أيضاً لم يتم تحديد حجمها(يجب أن تكون من مضاعفات الـ Byte الخاص بالمنصة, و لا يمكن أن تكون كسور). السبب بسيط جداً, و هو أن لدى مصنع المترجم الحرية في توزيع أنوع البيانات بحيث يحصل على أكبر مساحة لتوفير efficiency. لا تنسى أن كتابة كود generic سيصبح صعباً(و يجب أن يكون لديك خبرة كبيرة في C حتى تكتب كود يمكن الإعتماد عليه في أكثر من منصة). و لكن المردود كبير أيضاً. خذ مثلاً Sqlite و Lua, كلاهما يعملان حيث يوجد مترجم C بغض النظر عن المنصة, و ترجمتهما على أي منصة يعطي نفس الكفاءة تقريباً, لأنه ليس هناك افتراضات حول أحجام البيانات. هذه النقطة تحتاج لتوضيح أكثر, بإذن الله سوف أطرح لك مثال عن متى نحتاج و كيف نستطيع كتابة كود لا يعتمد على حجم معين للأنوع الأولية. سأعود لإكمال الموضوع, لأنه كبير جداً, و لكن سأحاول طرح مثال بإذن الله. حالياً, يمكنك معرفة عدد الـ bits في أي نوع بالطريقة التالية: #include <stddef.h> /* size_t */ #include <limits.h> /* CHAR_BIT */ int main() { /* How many bytes in int and void* Note that CHAR_BIT is the number of bits in a byte */ size_t bits_in_int = sizeof(int) * CHAR_BIT; size_t bits_in_void_ptr = sizeof(void*) * CHAR_BIT; } بالنسبة لإجابة سؤالك, فهو أنه ليس هناك شيء اسمه قياس المعمارية, و لكن "اصطلح" على أن يكون النوع int هو النوع الذي يوافق حجم الـ registers في المنصة التي سوف يعمل عليها البرنامج. و هذا الافتراض أصبح معتمد رغم أنه ليس مطلوباً في الحقيقة. تحياتي...
  13. لم أقصد أنه لا يمكن الحصول على بيانات عشوائية. ماقصدته أنه إذا أردت بيانات عشوائية حقيقية فهذه ليست طريقة مضمونة. وضعت الرابط للفائدة, و لاحظت أنك أشرت إلي أن البيانات ليست عشوائية حقيقية في مشاركتك. تحياتي...
  14. لمعلوماتك فقط, عملية تحويل الصوت إلى بيانات نصية(يمكن تحليلها) فقد العلماء الأمل فيها. http://robertfortner.posterous.com/the-unrecognized-death-of-speech-recognition الخطوة التالية, هي تحليل معنى البيانات التي قمنا بتحويلها من الصوت(semantic analysis). هذه الخطوة يتقنها صفوة من المبرمجين و العلماء على الكرة الأرضية, للغات يمكن وصفها بـ Formal Grammar, فما بالك باللغات البشرية! تذكرني مرة عندما كنت أدرس الـ Number Theory. و كان الأستاذ يتحدث عن RSA. طبعاً, سالته بكل سذاجة, مالذي سيحصل لو اكتشفت طريقة مباشرة لتحليل الأعداد؟ قال لي بأنك ستصبح أشهر عالم رياضيات لـ 300 سنة قادمة :lol: ببساطة أنت اختزلت المشكلة في حوار يحصل بين آدمي و حاسوب, و نسيت سلسلة من المشاكل التي لم يستطع أحد حتى الآن حلها, دع عنك الفائدة المرجوة منها. تحياتي...
  15. السلام عليكم ... Could a truly random number be generated using pings to psuedo-randomly selected IP addresses? No!
  16. جميل جداً, المنتدى يتطور يوماً بعد يوم. إن شاء الله سترتقي التطويرات الجديدة بالمنتدى للأعلى.
  17. السلام عليكم ... أخ هويدي, انظر لتعريف الدالة هنا: http://cplusplus.com/reference/clibrary/ctime/localtime/ Return Value A pointer to a tm structure with the time information filled in. This structure is statically allocated and shared by the functions gmtime and localtime. Each time either one of these functions is called the content of this structure is overwritten. بمعنى أبسط, العائد من الدالة عبارة عن static variable في الـ function نفسها. و هذا يعني أنك كمبرمج لست مسؤولاً عن الذاكرة العائدة, المفروض أن تقوم بالاستخدام فقط. أي أنك تقوم بتنفيذها فتقوم الدالة بتغيير الـ structure الذي هو عبارة عن static variable في الدالة, و من ثم تقوم بإرجاع مؤشر له.
  18. ما رأيك بFirefox 4.0 beta ؟

    هذه ميزة "هندسية" رهيبة جداً. عندما تسقط إحدى الـ processes فإنها تسقط لوحدها, و الـ Parent Process تنبه إلى هذا الأمر, و التواصل يكون عبر IPC مما يعني أنه مهما حصل في إحدى الـ tabs لن يؤثر ذلك على الـ Parent Process. هندسة جميلة جداً. هذا الأمر متبع في nix* من باب تلك الأنظمة لمحرابها. أيضاً, أثبتوا أن إنشاء processes إضافية قد لا يكون مكلفاً من ناحية المعالجة و الذاكرة كما يدرس دائماً في كتب أنظمة التشغيل, و تركوا العبث في الـ shared memory لمن يريد العبث بها :)
  19. بدأت بالغوص يا أخ عبود :P http://stackoverflow.com/questions/1898524/difference-between-pointer-to-a-reference-and-reference-to-a-pointer/1898556#1898556
  20. السلام عليكم ... عموماً يمكن حل السؤال بـ Formula: السبب بسيط, و هو أن كل عدد prefect square نريد أن نضمنه في العد, لابد أن يكون جذره أقل من 1000 مثلاً. إذاً عدد الـ perfect squares هو نفس عدد الأعداد الأقل من جذر 1000 لأن كل عدد أقل أو يساوي جذر 1000 عند ضربه بنفسه يعطي perfect square أقل من 1000. بالنسبة لدالة الـ Floor فهي لكي نقول بأن العدد الذي نريد أن نضمنه في العد, لابد أن يكون حاصل ضربه بنفسه أقل أو يساوي من عدد الأبواب. تحياتي :)
  21. ياااااااااااااااااااه الحل صحيح :lol: ما فهمته أن الـ perfect squares بالفعل هي الأعداد الوحيدة التي تمتلك عدد فردياً من القواسم! السبب بسيط, و لا أدري لماذا لم أقرأ ذلك في الصفحة التي وضعتها في مشاركتي السابقة :) http://en.wikipedia.org/wiki/Divisor_function#Properties اقرأ أول سطر. على العموم, هنا الإثبات: بما أن أي قاسم لعدد ما ينتج عن قسمة العدد الأصلي به, عدد صحيح آخر, إذا القواسم توجد على شكل أزواج. إلا في حالة perfect squares سيكون هناك زوج عبارة عن العدد نفسه: أي n*n. بصراحة لم أتصور أن يكون الحل بهذه البساطة :)
  22. السلام عليكم و رحمة الله و بركاته, أخ وجدي, من أين أتيت بهذا الحل العجيب :cool: أود أن أفهم جوابك أكثر بعد إذنك, بداية, وضعت حلي بناءً على المعلومة التالية: أي باب, سيمر عليه أشخاص بعدد قواسمه الصحيحة. فمثلاً, العدد 4 سيمر عليه 1, 2, 4 و كما تلاحظ, فإن الباب في الأساس يكون مغلقاً, و فتح بالواحد و أغلق بـ 2 و فتح مرة أخرى بـ 4. إذاً, إذا كان عدد الأشخاص الذي يمرون على باب ما فردياً, فإنه سيكون مفتوحاً, و إذا عددهم زوجياً, سيكون مغلقاً. الأبواب ذات الأعداد الأولية كلها ستكون مغلقة, لأن عدد القواسم زوجي, العدد 1 و العدد الأولي نفسه. تمام؟ كل ما علينا هو الحصول على قواسم العدد, و بناء على كونها زوجية أو فردية, يمكننا أن نحدد كون الباب مفتوحاً أم لا.الذي أعرفه, أن عدد القواسم لاتوجد له دالة تعوض فيها مباشرة Explicit. و حتى الدوال التي تقبل التعويض المباشر, تشترط حصولك على الأعداد الأولية المكونة و تكراراها المكون للعدد. كل ما يقوم به حلي, هو أن يمر على قواسم أي عدد بطريقة الـ Sieving. السؤال هو كيف يمكنك القول بأن الـ perfect squares هي الوحيدة فقط التي لديها عدد قواسم فردي؟ ربما هناك شيء لم أفهمه في حلك, و أعتقد أني أغفلت أشياء بسيطة أخرى. تحياتي أخ وجدي,,,
  23. حجز شيء على الـ stack يعني incrementing the stack pointer! عبارة عن عملية جمع سريعة جداً, و لكن الحجز على الـ Stack ليس مرن كما في حالة الـ heap, لأنك لا تستطيع عمل release إلا للـ top of stack. عملية الـ release عبارة عن عملية طرح. معظم المعالجات الحديثة(منذ السبعينيات) تأتي بتعليمات مخصصة لعمل pop و push على الـ activation record الخاصة بالدالة. بالنسبة للـ dynamic memory سواء كانت manual أو GCed, فهذا عبارة عن نظام متكامل يحتوي على معلومات الأجزاء التي تم حجزها و الأجزاء الفارغة, ناهيك عن عملية عمليات ترتيب الذاكرة للتخلص من الـ fragmentation التي يمكن أن تحصل حسب الـ memory allocation scheme المستخدمة. ببساطة شديدة, يمكن أن تتخيل أن لديك مصفوفتان, واحدة للأماكن المحجوزة و الأخرى للأماكن الفارغة. عملية الحجز, عبارة عن عملية بحث. و عملية الـ release عبارة عن عملية نقل بين هاتين المصفوفتين. هذا تبسيط مخل, لأن العملية أكثر تعقيداً من ذلك. تحياتي...
  24. لايوجد تعارض بين الاستمتاع بالبرمجة و بين تقديم منتج ناجح في السوق. اسأل مبرمجي Google و غيرهم من الشركات التي تقدم ما لا يقدمه غيرها.