ahmed.o.mohamed

[C] من هنا و هناك !

1 مشاركة في هذا الموضوع

فهرس الأسئلة :

  • كيف أحصل على معيار لغة السي (C standard) ؟
  • ما هي فائدة Null Statement ؟
  • ماذا يعني الرمز _ أمام اسم دالة أو ماكرو أو متغير ؟
  • ما هو عمل الدالة fork ؟
  • ما هي فائدة الدالة system ؟
  • كيف أحول التاريخ إلى سلسلة حرفية ؟
  • كيف أقوم بتوليد أرقام عشوائية ؟
  • ما معنى الخطأ unresolved external symbol [email protected] ؟
  • ما معنى التحذير no new line at end of file ؟
  • أين أجد دروس مُفصَّلة في لغة C ؟
  • أين أجد تمارين جيدة في لغة C ؟

كيف أحصل على معيار لغة السي (C standard) ؟

تم توحيد لغة C من طرف ISO. معيار لغة C مُتاح للبيع على موقع الــ ISO (C90, C99) و كذلك على موقع الــ ANSI (C89). في كل الحالات تجد أن الثمن مكلف بعض الشيء.

النسخة التجريبية الأخيرة من C99 التي تحتوي على TC1, TC2, TC3 يمكن تنزيلها مجانا من موقع الــ OpenStd و بالتحديد من هنا.

ما هي فائدة Null Statement ؟ (الإجابة للأستاذ خالد الشايع)

الـ statement التي تتكون من فاصلة منقوطة فقط, تسمى null statement في C و ++C على حد سواء. قد تجد فكرة مشابهة لها في لغات أخرى كـ Assembly و تسمى في بعض المنصات NOP أو no operation. بمعنى أن ما تقوم به هو أن لا تقوم بأي شيء. فائدتها أننا أحياناً, نحتاج لها. مثلاً, نريد جمع مكعب الأعداد في مدى معين - من سالب ثلاثة إلى ثلاثة مثلاً!

int sum = 0;
for(int n = -3; n <= 3; sum += n++);

أو كما هو الحال في الـ implementation الشهير لـ strcpy من كتاب K&R:

// src & dest are pointers to char arrays.
// forget the details for moment!
// src is the source string.
// dest is the destination string.
while(*dest++ = *src++);

ببساطة إن كان هناك موضع في اللغة يحتاج إلى statement فإنه يمكن استخدام null statement إن كنت لا تريد تنفيذ شيء على الإطلاق. مثلاً, assert تستخدم في حالة الـ debugging و في حالة تفعيل الـ optimizations في المترجمات فإنه يتم إزالتها عن طريق استخدام null statement. هناك طرق أخرى لعمل implementation لـ assert و لكن هذه إحداها.

ماذا يعني الرمز _ أمام اسم دالة أو ماكرو أو متغير ؟

في أغلب الأحيان, يدل هذا الرمز على أن الدالة أو الماكرو المـُرافق له غير قياسي, يُمكننا القول أنه متوافق مع المكتبة القياسية التي تُوفرها البيئة التي تعمل عليها لكنه ليس متوافق مع معيار اللغة. على سبيل المثال, في نظام DOS/Windows, تَتْبع ثوابت الماكرو أو الدوال التالية :

_getch,_kbhit, _spawn*, _P_WAIT, etc

للمكتبة CRT و هي اختصار لــ C Run-Time Library و ليس للمعيار القياسي.

نفس الشيء بالنسبة للدوال _read, _write, _exec* التابعة لمعيار POSIX.

أما بالنسبة للكلمات المعرفة مسبقا و الغير قياسية فتجد أمامها رمزين من Underscore بدلا من رمز واحد, هكذا :

__declspec, __stdcall, __asm, __int32, __int64, etc

ما هو عمل الدالة fork ؟

تقوم الدالة fork بإنشاء Process ابن من الــ Process الأب للبرنامج بحيث يكون الــ Process الإبن مُطابق تماما لأبيه من ناحية الكود . يعمل الأب و الإبن في نفس الوقت إلا أن الأخير يبدأ بالتنفيذ انطلاقا من الأمر الذي يلي frok مباشرة.

frok لا تأخذ أي معاملات و لكنها تعيد متغير من نوع pid_t, .. لتقريب الفكرة .. يمكنك اعتبار أن الدالة frok تُعيد متغير int.

القيمة المُعادة من طرف الدالة تختلف باختلاف وضع أو طبيعة الــ Process. توجد 3 حالات :

  • إذا كانت القيمة المُعادة تساوي -1 : حدث خطأ أثناء إنشاء الــ Process الإبن.
  • إذا كانت القيمة المُعادة تساوي 0 : التحكم الآن بيد الـ process الابن.
  • إذا كانت القيمة المُعادة أكبر من 0 : هذه القيمة تعبر عن الـ PID الخاص بالابن.

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main() {
pid_t pid = frok();
/* يبدأ المعالج الإبن بتنفيذ الأوامر التالية */
if (pid == -1) {
/* حدث خطأ, لم يتم إنشاء المعالج الإبن */
} else if (pid == 0) {
/* التحكم الآن بيد الـ process الابن. */
} else {
/* التحكم الآن بيد الـ process الأب */
}
return 0;
}

ما هي فائدة الدالة system ؟

راجع هذا الموضوع.

كيف أحول التاريخ إلى سلسلة حرفية ؟

تُمَكن الدالة ctime من تحويل timestamp إلى سلسلة حرفية من خلال ضبط التوقيت المحلي :

#include <stdio.h>
#include <time.h>

int main() {
time_t t = time(NULL);
printf("%s\n", ctime(&t));
return 0;
}

أيضا, يمكننا تحويل بنية من النوع struct tm إلى سلسلة محارف باستخدام الدالة asctime و بالتالي الكود السابق مكافئ لــ :

#include <stdio.h>
#include <time.h>

int main() {
time_t t = time(NULL);
printf("%s\n", asctime(localtime(&t)));
return 0;
}

كيف أقوم بتوليد أرقام عشوائية ؟

راجع هذا الموضوع.

ما معنى الخطأ unresolved external symbol [email protected] ؟

هذا الخطأ ينتج عن عدم وجود الدالة WinMain في الكود المـُستعمل. WinMain تقوم مقام الدالة main إذا كان الكود مُخصص لــ Windows. لإصلاح الخطأ غيِّرْ نوع المشروع إلى Console Application project.

ما معنى التحذير no new line at end of file ؟

المعيار القياسي ينص على أن كل سطر يجب أن ينتهي بعلامة سطر جديد (Line break or New line), هذا التحذير يدل على أن السطر الأخير من الملف غير مكتمل, قم بتكملة السطر الأخير من الملف لتخطي هذا التحذير.

أين أجد دروس مُفصَّلة في لغة C ؟

راجع فهرس المواضيع المميزة.

أين أجد تمارين جيدة في لغة C ؟

راجع هذا الموضوع.

أيضا, يحتوي موقع Developpez.com على مجموعة من الكتب الرائعة جدا في لغة C و التي تضم العديد من التمارين و النصائح القيمة, من أهم هذه الكتب, الكتاب الأب The C Programming Language (الذي يُعتبر المرجع الأساسي للغة C) و الذي يحتوي بدوره على مجموعة من التمارين الجيدة في جميع المستويات, و هنا تجد حل التمارين.

تم تعديل بواسطه أحمد الشنقيطي
إضافة أسئلة جديدة.
4

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .