البرمجة

تعديل الماكروهات في لغة C

مشكلة محيرة تعتريني.

هل من الممكن أن يساعدني أحد في إزالة العلامة “@”؟

أنا أكتب برمجة بلغة “سي” لوحدة تحكم، وأنا كسول؛ لذا أريد حلاً للمشاكل البسيطة باستخدام الماكروهات، مثل تشغيل مصباح LED.

تمكنت من عمل شيء كهذا:

scss
#include .h> #define BIT_STD_SET(PORT, BITNUM) ((PORT) |= (1<<(BITNUM))) #define BIT_STD_CLE(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM))) #define BIT_STD_TOG(PORT, BITNUM) ((PORT) ^= (1<<(BITNUM))) #define LEDPORT_0 C #define LEDPAD_0 3 /*Blau*/ #define LEDPORT_1 D #define LEDPAD_1 4 /*GelbWeis*/ #define PO(n) LEDPORT_##n #define POR(n) PORT##PO(n) #define PA(n) LEDPAD_##n #define PAD(n) PA(n) #define LEDAN(n) BIT_STD_SET(POR(n),PAD(n)) #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("%s\n",h(LEDAN(0))); printf("%s\n",h(LEDAN(1))); printf("\n"); printf("%s\n",h(LEDAN(1))); printf("\n"); printf("%s\n",h(POR(0))); printf("%s\n",h(POR(1))); printf("%s\n",h(f(0,1))); printf("%s\n",g(f(0,1))); return 0; }

وحصلت على:

less
((PORT@C) |= (1<<(3))) ((PORT@D) |= (1<<(4))) ((PORT@D) |= (1<<(4))) PORT@C PORT@D 01 f(0,1)

يجب إزالة العلامة “@”. للأسف، لا أعرف كيف. قرأت بعض الدلائل، ولكنني لا أعرف كيف أعبر عن نفسي.

شكراً جزيلاً.

علماً بأن الرمز البرمجي يمكن تمييزه بوضعه بين أربعة مسافات.

المزيد من المعلومات

بالطبع، سأقدم المزيد من المعلومات لمساعدتك في فهم المشكلة والعثور على الحل المناسب.

في الشيفرة التي قدمتها، يُستخدم الماكرو POR(n) لتوليد اسم المنفذ (PORT) المطلوب بناءً على الوسم (tag) المعطى (C أو D في هذه الحالة). ومن ثم يتم دمج اسم المنفذ مع الوسم باستخدام ##، وهو ما يسبب ظهور العلامة “@” في الإخراج.

لحل هذه المشكلة، يمكننا استخدام ما يُعرف بـ”توسيع الماكرو” (Macro Expansion) بطريقة تسمح بالتعامل مع الوسوم بشكل صحيح دون دمجها مع اسماء المتغيرات.

بدلاً من استخدام POR(n) لبناء اسم المنفذ، يمكننا استخدام ماكرو جديد لتوليد الاسم بشكل صحيح. ولتحقيق ذلك، يمكننا تعريف ماكرو جديد يأخذ الوسم كمعامل ويقوم بإرجاع اسم المنفذ المطابق لهذا الوسم.

إليك كيف يمكن تعديل الشيفرة لتحقيق ذلك:

c
#define LEDPORT_0 C #define LEDPORT_1 D #define GET_PORT(letter) PORT##letter #define GET_PAD(n) LEDPAD_##n #define POR(n) GET_PORT(PO(n)) #define LEDAN(n) BIT_STD_SET(GET_PORT(PO(n)), GET_PAD(n))

تم إضافة ماكرو جديد اسمه GET_PORT، والذي يأخذ وسمًا (مثل C أو D) ويقوم بإرجاع اسم المنفذ المطابق لهذا الوسم باستخدام ## بين “PORT” والوسم. ثم تم استخدام هذا الماكرو في POR(n) لتوليد اسم المنفذ بشكل صحيح دون وجود العلامة “@”.

بهذا التعديل، يجب أن يتم حل المشكلة وأن تعمل الشيفرة بشكل صحيح دون وجود العلامة “@” في الإخراج.

زر الذهاب إلى الأعلى