تخطَّ إلى المحتوى

18. «خطر» واستدعاء C

أن تستدعي دالة من مكتبة C، وتعرف ما الذي لا يُكتب إلا في كتلة خطر ولماذا.

  • خارجي يصرّح بدالة من مكتبة C بأنواع C صريحة، ثم تستدعيها كأي دالة. المجمّع يتحقق عند الترجمة أن الرمز موجود.
  • طول("ميم") يعدّ الأحرف (3)، وstrlen من C يعدّ البايتات (6): الحرف العربي بايتان في UTF-8.
دالتان من C
خارجي "m" داله جذر_c(س كسر) كسر باسم "sqrt"
خارجي داله طول_c(ن نص) حجم باسم "strlen"
اطبع(جذر_c(2.0))
اطبع("ميم بالبايتات: ", طول_c("ميم"), "، وبالأحرف: ", طول("ميم"))
مخرجات مسجّلة من المجمّعmeem 17_خارجي.م · meem 0.10.0+b01b55f
1.4142135623730951ميم بالبايتات: 6، وبالأحرف: 3
  • الذاكرة الخام (احجز_خام) وفهرسة المؤشر الخام وتعطيل الفحوص (بلا_فحص) لا تُكتب إلا داخل خطر:. هناك لا يفحص المجمّع الحدود، والخطأ مسؤوليتك.
ذاكرة خام داخل خطر
خطر:
م = احجز_خام(عدد32, 3)
م[0] = 10
م[1] = 20
م[2] = 30
اطبع(م[0] + م[1] + م[2])
حرر(م)
مخرجات مسجّلة من المجمّعmeem 17_خطر.م · meem 0.10.0+b01b55f
60
  • لا يحتاجه المبتدئ: القوائم والقواميس والوحدات القياسية تكفي أغلب البرامج. وخطر يحصر ما قد يُفسد الذاكرة في كتل تراها بعينك وتراجعها.
  • الخيار --no-unsafe يمنع خطر كله، و--no-ffi يمنع خارجي.

صرّح بالدالة abs من مكتبة C (تأخذ عدد32 وترجعه)، واطبع قيمتها المطلقة لـ -7 و0 و12.

اعرض الحل
الحل
خارجي داله abs_c(س عدد32) عدد32 باسم "abs"
لكل ع في [-7, 0, 12]:
اطبع(ع, " ← ", abs_c(ع))
مخرجات مسجّلة من المجمّعmeem 17_حل.م · meem 0.10.0+b01b55f
-7 ← 70 ← 012 ← 12

عملية خام خارج خطر:

يسبب الخطأ
م = احجز_خام(عدد, 2)
مخرجات مسجّلة من المجمّعmeem 17_بلا_خطر.م · meem 0.10.0+b01b55f
​[خطأ دلالي E0414] سطر 1:5 - 'احجز_خام' لا تُكتب إلا داخل منطقة 'خطر'   1 | م = احجز_خام(عدد, 2)     |     ^~~~~~~~  تلميح: ضعها في كتلة  خطر:  أو في دالة معرَّفة بـ  خطر داله ...

رمز الخروج: 2

في فهرس الأخطاء: E0414

ما هو خطر؟ · الطبقة المنخفضة · استدعاء C