الحقيقة الجداول في الكود ؟ كيفية تنظيم الدولة الجهاز ؟

StackOverflow https://stackoverflow.com/questions/603035

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

كنت أفكر في أنني أريد الوصول إلى الحقيقة الجدول كما يلي:

u8 newState[] = decisionTable[input1][input2][input3][input4];

ومن ثم لا يمكن الوصول إلى إخراج القيم:

setOutputPin( LINE_0, newState[0] );
setOutputPin( LINE_1, newState[1] );
setOutputPin( LINE_2, newState[2] );
setOutputPin( LINE_3, newState[3] );

ولكن من أجل الحصول على ذلك ، يبدو أنه قد تم إلى حد ما مربكة الجدول كما يلي:

static u8 decisionTable[][][][][] =
 {{{{ 0, 0, 0, 0 },
    { 0, 0, 0, 0 }},
   {{ 0, 0, 0, 0 },
    { 0, 0, 0, 0 }}},
  {{{ 0, 0, 1, 1 },
    { 0, 1, 1, 1 }},
   {{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }}}},
 {{{{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }},
   {{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }}},
  {{{ 0, 1, 1, 1 },
    { 0, 1, 1, 1 }},
   {{ 0, 1, 0, 1 },
    { 1, 1, 1, 1 }}}};

تلك المتداخلة بين قوسين يمكن أن يكون مربكا بعض الشيء -- هل من أحد لديه فكرة أفضل عن كيف يمكن أن تبقي جميلة تبحث الجدول في قانون بلدي ؟

وذلك بفضل!

تحرير على أساس HUAGHAGUAH الجواب:

باستخدام خليط من الجميع الإدخال (شكرا-اتمنى ان "قبول" 3 أو 4 من هذه الإجابات), أعتقد أنني سوف تحاول أنها ثنائية الأبعاد مجموعة.سوف مؤشر إلى مجموعة باستخدام قطعة صغيرة تحويل الماكرو:

#define SM_INPUTS( in0, in1, in2, in3 ) ((in0 << 0) | (in1 << 1) | (in2 << 2) | (in3 << 3))

و التي سوف اسمحوا لي جدول الحقيقة مجموعة تبدو مثل هذا:

static u8 decisionTable[][] = {
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 1, 1 },
{ 0, 1, 0, 1 },
{ 1, 1, 1, 1 }};

وأنا يمكن بعد ذلك الوصول إلى الحقيقة الجدول كما يلي:

decisionTable[ SM_INPUTS( line1, line2, line3, line4 ) ]

سأعطيك فرصة ونرى كيف يعمل.أنا أيضا استبدال 0 و 1 مع أكثر فائدة #تعرف أن تعبر عن كل دولة يعني ، جنبا إلى جنب مع /**/ التعليقات التي توضح مدخلات لكل خط من النواتج.شكرا على المساعدة يا الجميع!

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

المحلول

لا حاجة الأبعاد الجدول.مع 4 بت => 4 بت رسم الخرائط, هل يمكن أن يكون واحد u8[16] مجموعة الخرائط المدخلات إلى مخرجات.الدولة عمليات البحث سوف تكون أرخص بكثير و يمكنك استخراج الفردية بت مع بعض التحول و قناع العمليات.

إذا الخوارزمية إلى تعبئة الصفوف من السهل تدوين ، يمكن تعريف #ماكرو إلى تعبئة كل صف من الرقم القياسي.

نصائح أخرى

أقترح إما (يفضل النهج الأول):

  • استخدام ماكرو intialize كل "الصف" - وهذا سوف إخفاء الأقواس داخل الكلية الدعوة.
  • استخدام التعليقات لتفريق الصفوف.
  • استخدام الحرف الأول وظيفة تهيئة السياق صراحة - ربما استخدام وظائف تهيئة كل قسم.هذا هو مماثل الخيار الأول أعلاه ولكن لديه عيب أن الحرف الأول وظيفة يجب أن يكون الاحتجاج من قبل الدولة آلة يمكن استخدامها.

أنا شخصيا قرأت من ملف التكوين.CSV, ربما, والتي من السهل تصدير إلى Excel.أو هل يمكن أن مجرد نسخ ولصق من Excel إلى نص عادي ، والتي تعطيك مساحة قيم مفصولة ، والتي من السهل على قدم المساواة إلى استيراد.

وهذا يعني أيضا بالنظر إلى أن كنت تعمل مع C, أنك لن تضطر إلى إعادة ترجمة التعليمات البرمجية الخاصة بك في كل مرة المقرر جدول التغيرات.

أنا الحقيقة-الجدول هو كل القيم المنطقية ، هل يمكن أن مجرد انهيار إلى قائمة أزواج, على سبيل المثال

1111,0000
1110,0110
...

لضغط البيانات ، تمثل القيم كما بايت (اثنين nybbles)...

حيث/كيفية تخزينه لينة الترميز في خاصة بك جزءا لا يتجزأ من نظام التكوين ، فقط يمكنك أن تقول ;-)

إذا كان جدول الحقيقة هو حقا فقط 4x4x4x4 ثم أود أن استخدام وحدات الماكرو.إذا كان أي وقت مضى أن تنمو الماضي, كنت استخدم Ragel.وهناك احتمالات أنها سوف تجعل أصغر وأسرع ج رمز من سوف.

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

عادة عندما يكون لديك مثل هذه المشكلة, حاول أن تقلل بسيطة منطقية الصيغة.أنا لا أرى لماذا هذا لن يكون النهج الأفضل هنا.سيكون أكثر إحكاما وأكثر قابلية للقراءة ، بالإضافة إلى أنه لديه القدرة على أن يكون أسرع (أتصور حفنة من يستخدم المعامل و أملاح الإماهة الفموية تنفذ بسرعة أكثر من جمع يضاعف/التحولات + ذاكرة الوصول اللازمة جدول بحث النهج).أسهل طريقة للحد من هذا الجدول إلى صيغة منطقية مع K-Map.

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