سؤال

لا بد لي من تخزين التعليمات والأوامر التي سأتلقاها عبر التسلسل. ستكون الأوامر 8 بت طويلة.

أحتاج إلى الحفاظ على الشفافية بين اسم الأوامر وقيمتها. وذلك لتجنب الاضطرار إلى ترجمة عدد 8 بت وردت في المسلسل في أي نوع.

أود استخدام المعادلة للتعامل معها في التعليمات البرمجية الخاصة بي. تعداد فقط يتوافق مع هذه المنصة عددا صحيحا 16 بت.

المنصة هي AVR ATMEGA169V ميكروكنترولر، على Butterfly Demo Board.. وبعد إنه نظام 8bit مع بعض الدعم المحدود لعمليات 16bit. إنه ليس نظام سريع ولديه حوالي 1 كيلو بايت من ذاكرة الوصول العشوائي. ليس لديها أي فمائل مثل ملف I / O أو أنظمة تشغيل.

لذلك أي اقتراحات فيما يتعلق بالنوع الذي يجب أن أستخدمه لتخزين أوامر 8 بت؟
يجب أن يكون هناك شيء أفضل من رأس # Defines ضخمة.

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

المحلول

gcc-fshort-enums من الممكن ان يكون مفيدا:

تخصيص نوع "Enum" فقط أكبر عدد ممكن من البايتات لأنها تحتاج إلى النطاق المعلن للقيم المحتملة. على وجه التحديد، سيكون نوع "ENUM" ما يعادل أصغر نوع عدد صحيح يحتوي على غرفة كافية.

حقيقة، هناصفحة سا مع الكثير من المعلومات ذات الصلة. آمل أن تأتي عبر العديد من مفاتيح دول مجلس التعاون الخليجي، فلن تعرف أبدا. ؛)

نصائح أخرى

أنت تحاول حل مشكلة غير موجودة.

سؤالك هو الموسومة C. في C Enum Language أنواع Enum في سياق القيمة متوافق تماما تماما مع أنواع متكاملة وتتصرف تماما مثل أنواع غير متكاملة أخرى. عند استخدامها في التعبيرات، تعرضها للضبط بالضبط نفس الترقيات المتكاملة مثل أنواع متكاملة أخرى. بمجرد أن تأخذ ذلك في الاعتبار، يجب عليك أن تدرك أنه إذا كنت ترغب في تخزين القيم الموصوفة بواسطة ثوابت التعداد في نوع متكامل 8 بت، كل ما عليك فعله هو اختيار نوع متكامل عام 8 بت مناسب (على سبيل المثال int8_t) واستخدامها بدلا من نوع المعهد. لن تفقد أي شيء على الإطلاق عن طريق تخزين قيمك الثابتة الخاصة بك في كائن من النوع int8_t (على عكس كائن أعلن صراحة مع نوع المعهد).

ستكون المشكلة التي تصفها موجودة في C ++، حيث يتم فصل أنواع ENUM إلى أبعد من أنواع غير متكاملة أخرى. في C ++ باستخدام نوع غير متكامل بدلا من نوع Enum لغرض حفظ الذاكرة هو أكثر صعوبة (رغم أنه ممكن). ولكن ليس في ج، حيث لا يتطلب أي جهد إضافي على الإطلاق.

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

سوف تحصل على مقارنات 16 بت بهذه الطريقة، وآمل أن تكون مشكلة في الأداء (لا ينبغي أن تكون، خاصة إذا كان المعالج 16 بت كما يبدو أنه كذلك).

يتيح لك برنامج التحويل البرمجي C Microsoft القيام بشيء من هذا القبيل، ولكنه ملحق (قياسي في C ++ 0x):

enum Foo : unsigned char {
    blah = 0,
    blargh = 1
};

نظرا لأنك تم وضع علامة على دول مجلس التعاون الخليجي، فأنا غير متأكد تماما إذا كان الشيء نفسه ممكنا، لكن دول مجلس التعاون الخليجي قد يكون امتدادا gnu99 وضع أو شيء ما لذلك. جرب.

أوصي بالبقاء على العادة في أي حال للأسباب التالية:

  • يتيح لك هذا الحل تعيين قيم الأوامر مباشرة إلى ما تتوقع بروتوكولك التسلسل.
  • إذا كنت تستخدم بنية 16 بت حقا، فلا يوجد عدد كبير من المزايا للانتقال إلى 8 بتات. فكر في جوانب أخرى ثم 1 ذاكرة البايت المحفوظة.
  • في بعض المترجمات، استخدمت حجم المعهد الفعلي يستخدم الحد الأدنى من البتات (العادة التي يمكن أن تكون لائقا في البايت المستخدمة بايت فقط، ثم 16 بت ثم 32).

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

كخيار آخر، يمكنك تحديد "Enum" كبيانات عرض تقديمية للأوامر واستخدام التحويل إلى البايت مع 2 عمليات بسيطة لتخزين / استعادة قيمة الأوامر إلى / من الذاكرة (وتغليف هذا في مكان واحد). ماذا عن هذا؟ هذه عمليات بسيطة جدا حتى تتمكن من ضمهم (ولكن هذا يتيح لك استخدام البايت فقط فقط للتخزين ومن جانب آخر لأداء العمليات باستخدام أكثر Enum المعرفة كما تريد.

الإجابة التي هي ذات صلة مترجم قوس (نقلت من دليل Metaware C / C ++ Programmer دليل ARC؛ القسم 11.2.9.2)

حجم التعدادات حجم نوع المعمنة يعتمد على حالة تبديل * long_enums *.

■ إذا تم تبديل * Long_enums * إيقاف تشغيل، فإن خرائط النوع ENUM إلى أصغر واحد أو اثنين أو أربعة بايت، بحيث يمكن تمثيل جميع القيم.

■ إذا تم تبديل * LONG_ENUMS * قيد التشغيل، وهي خرائط ENUM إلى أربعة بايت (مطابقة اتفاقية مترجم AT & T Portable C).

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