سؤال

أرغب في الحصول على صفيف داخل بنية مليئة قليلاً. أنا أعرف بشكل ثابت حجم الصفيف (32) ، وأود أن يكون كل عنصر في الصفيف جزءًا واحدًا. على سبيل المثال ، أود أن أكون قادرًا على قول شيء مثل:

struct example_s {
  // ...
  unsigned int flags[32] : 32;
} __attribute__((__packed__));

لقد جربت أمرين ، لكن GCC لن تتزحزح. سيكون من الجيد أن تكون قادرًا على القيام بذلك حتى أتمكن من كتابة رمز نظيف تكراره على العناصر الموجودة في الصفيف المعبأ. أفكار؟

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

المحلول

إذا وضعته ببساطة في (32 بت) int ، فيمكنك التكرار بشكل نظيف على البتات مع حلقة مثل هذا:

for (bit = 0; bit < 32; bit++)
    flagValue = ((flags & (1<<bit)) != 0;

ليس من الصعب الكتابة أكثر من بناء جملة فهرسة الصفيف.

إذا كنت ترغب في إخفاء البتات لجعل الكود أكثر قابلية للقراءة ، فيمكنك حتى استخدام وظيفة أو ماكرو للوصول إلى البتات - على سبيل المثال GetFlag(bit)

نصائح أخرى

لا تحتوي عناصر أعضاء Bitfield على عناوين ، لذلك حتى لو كان بإمكانك إعلان مجموعة منها ، فلن تكون هناك طريقة لاستخدامها (كل الوصول إلى Array في C هو مؤشر الحساب والتخلي عن). من السهل ترميز صفيف البت الخاص بك باستخدام أجزاء من النوع الأكبر ؛ وقد أوضح جيسون الأساسيات. بشكل عام ، يجب تجنب استخدام Bitfields إلا إذا كان لديك سبب وجيه حقًا. عادة ما تكون مشكلة أكثر مما يستحقون.

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