سؤال

ما هي أفضل طريقة لتحديد بيانات إضافية ل typedef enums في C ؟

على سبيل المثال:

typedef enum {
  kVizsla = 0,
  kTerrier = 3,
  kYellowLab = 10
} DogType;

الآن أود أن تحديد أسماء بعضها على سبيل المثال kVizsla يجب أن يكون "فيسلا".أنا حاليا استخدم الدالة بإرجاع سلسلة باستخدام كبيرة كتلة التبديل.

هل كانت مفيدة؟

المحلول

@dmckee:أعتقد أن الحل المقترح جيد ، ولكن البيانات البسيطة (على سبيل المثالإلا إذا كان اسم مطلوب) يمكن أن يكون المعزز مع لصناعة السيارات في التعليمات البرمجية التي تم إنشاؤها.في حين أن هناك الكثير من طرق السيارات-توليد رمز لشيء بسيط مثل هذا أعتقد أنك يمكن أن يكتب بسيط XSLT أن يأخذ في تمثيل XML enum و النواتج ملف التعليمات البرمجية.

XML سيكون من شكل:

<EnumsDefinition>
    <Enum name="DogType">
        <Value name="Vizsla" value="0" />
        <Value name="Terrier" value="3" />
        <Value name="YellowLab" value="10" />
    </Enum>
</EnumsDefinition>

و الرمز الناتج سيكون شيئا من هذا القبيل إلى ما dmckee المقترحة في حل له.

للحصول على معلومات حول كيفية كتابة مثل هذه XSLT محاولة هنا أو مجرد البحث في جوجل و تجد البرنامج التعليمي الذي يناسب.كتابة XSLT ليست الكثير من المرح المنظمة البحرية الدولية ، ولكن الأمر ليس بهذا السوء إما على الأقل نسبيا مهام بسيطة مثل هذه.

نصائح أخرى

حلا مثاليا X() وحدات الماكرو.هذه الأنواع من وحدات الماكرو يمكن استخدام C المعالج لبناء enums و صفائف من نفس المصدر.تحتاج فقط إلى إضافة بيانات جديدة إلى #تعريف تحتوي على X() الماكرو.

المثال الخاص بك يمكن أن تكون مكتوبة على النحو التالي:

// All dog data goes in this list
#define XDOGTYPE \
  X(kVizsla,0,"vizsla") \
  X(kTerrier,3,"terrier") \
  X(kYellowLab,10,"yellowlab")

 // Dog info
 typedef struct {
     int val;       // Defined value
     char * desc;   // Text description
 } DogType;

 // Build an array index using the Names
 typedef enum {
  #define X(Name,Val,Text)     Name,
   XDOGTYPE
  #undef X
  MAXDOGS
 } DogIndex;

 // Build a lookup table of values
 DogType Dog[] = {
  #define X(Name,Val,Text)    {Val,Text},
   XDOGTYPE
  #undef X
 };

 // Access the values
 for (i=0; i < MAXDOGS; i++)
    printf("%d: %s\n",Dog[i].val,Dog[i].desc);

إذا كان تعداد القيم كثيفة بما فيه الكفاية, يمكنك تحديد مجموعة عقد السلاسل و البحث عنها (استخدام NULL أي تخطي قيمة وإضافة حالة خاصة معالج على بحث روتينية).

char *DogList[] = {
  "vizsla", /* element 0 */
  NULL,
  NULL,
  NULL,
  "terrier", /* element 3 */
  ...
};

هذا غير فعال بالنسبة متفرق والتعدادات.

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

typedef struct DogMaps {
  DogType index;
  char * name;
} DogMapt;
DogMapt DogMap[] = {
  {kVizsla, "vizsla"},
  {kTerrier, "terrier"},
  {kYellowLab, "yellow lab"},
  NULL
};

النهج الثاني هو مرن جدا ، ولكن هذا يعني البحث من خلال رسم الخرائط في كل مرة كنت بحاجة إلى استخدام البيانات.مجموعات البيانات الكبيرة تنظر ب-شجرة أو تجزئة بدلا من صفيف.

إما الطريقة يمكن تعميمها على توصيل المزيد من البيانات.في أول استخدام مجموعة من البنيات ، في الثانية فقط إضافة المزيد من الأعضاء إلى البنية.

سوف بالطبع أريد أن أكتب مختلف معالجات تبسيط التفاعل مع البيانات هذه الهياكل.


@Hershi بكل الوسائل ، رمز منفصل و البيانات.الأمثلة المذكورة أعلاه هي من المفترض أن تكون واضحة بدلا من الوظيفية.

أنا أخجل من أن أعترف بأنني لا تزال تستخدم بيضاء فصل ملفات مسطحة لهذا الغرض بدلا من نوع منظم الإدخال الذي يحمل لكن رمز الإنتاج قراءة أكبر قدر من البيانات من مصادر خارجية ممكن.


انتظر أرى أن كنت تقصد رمز جيل.

بالتأكيد.لا حرج في ذلك.

وأظن ، على الرغم من أن العملية كانت مهتمة في ما الشفرة التي تم إنشاؤها يجب أن تبدو...

وهذا النوع من السؤال المفتوح ، ولكن يقترح استخدام الخريطة مع التعداد الرئيسية ونوع المعلومات الإضافية في القيمة.(إذا كان لديك مؤشرات المستمر ، على عكس المثال ، يمكنك استخدام تسلسل حاوية بدلا من الخريطة).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top