الحاجة:Wrappable العداد حيث < و > هل "الشيء الصحيح"

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

  •  19-08-2019
  •  | 
  •  

سؤال

أنا في حاجة إلى رمز couter أن يسمح تجاوز فيها < > تواصل أقول في وقت سابق القيم في وقت لاحق من القيم لبعض تحديد الفاصل الزمني.

للتوضيح واحد ممكن التنفيذ:

النظر في اثنين من هذه العدادات cur و dut (الجهاز تحت الاختبار) ، النظر في وظيفتين:

bool isEarlier(cur, dut)    // Is dut earlier than cur?
bool isLater(cur, dut)

cur و dut هي 16 بت ، cur فقط فاض ، قيمته الحالية ، دعونا نقول 5.اعتمادا على قيمة dut, وظائف سيعود

  • 0 إلى 16384:isEarlier -> (cur < dut), isLater -> (cur > dut)
  • 16384 إلى 32768:isEarlier -> كاذبة ، isLater -> صحيح
  • 32768 إلى 49152:صالح, سجل خطأ
  • 49152 إلى 65536:isEarlier -> صحيح ، isLater -> كاذبة

أستطيع أن أكتب مدونة نفسي, لا مشكلة.أنا كسول فقط.أنا أعرف حقيقة أن هناك شيء من هذا القبيل في كيو (الصفقة معرفات التفاف), أنا فقط لا يمكن العثور على وظيفة في الواقع لا.أنا متأكد من أن هناك شيء من هذا القبيل في نواة لينكس ، ربما ماكرو.ولكن neighther جوجل codesearch ولا البقرى أكثر من /usr/include/linux يمكن أن تتحول عنه.أي فكرة أين هو ؟

توضيح دور كور و dut.غير صالح "" هل هناك كإجراء وقائي.كما الاختلافات بين cur و dut تصبح أكبر وظيفة في نهاية المطاف يشكو.

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

المحلول

أعتقد أنك تتحدث عن التعامل مع ملفوف عدد دائرة بشكل صحيح.فإنه من السهل جدا في الواقع.

هذا لا تفعل بالضبط ما قلت (لست متأكدا لماذا لديك هذا "الاستثناء" الفاصل) ، ولكن:

typedef unsigned short uint16_t;
typedef signed short int16_t;
// abstract out 16-bit types in case "short" doesn't correspond to 16bits

bool isEarlier(uint16_t a, uint16_t b)
{
   int16_t diff = a-b;
   return diff < 0;
}
bool isLater(uint16_t a, uint16_t b)
{
   int16_t diff = a-b;
   return diff > 0;
}

تحرير:وهذا له "فرع نقطة" في مهرجان دبي السينمائي الدولي=-32768 ، بحيث إذا كان أ=5 ب=32772 مهرجان دبي السينمائي الدولي=-32767 وهو أقل من 0 ومن ثم 5 "في وقت سابق" من 32772.إذا كان أ=5 ب=32774 مهرجان دبي السينمائي الدولي=-32769=32767 الذي هو أكبر من 0 و من ثم 5 "في وقت لاحق" من 32774.يعرف هذا "في وقت سابق" و "لاحقا" في معنى (أ) أبسط الرياضيات ، و (ب) لأن ملفوف العدادات يمكن تفسير وجود حلول متعددة وزارة الدفاع 65536 ، فإنه يختار الحل من a و b التي هي "الأقرب" إلى بعضها البعض فيما يتعلق بعدد دائرة.

إذا كان a و b تختلف من 32768 ثم يتم بالتساوي متباعدة و الرياضيات البسيطة المستخدمة في اختيار أسهل...هذا "ينتهك" اللامتماثل ممتلكات "في وقت سابق" و "لاحقا" بمعنى أن isLater(5,32773) صحيح isLater(32773,5) غير صحيح أيضا.ولكن كيف يمكنك أن تعرف ما إذا كان "5" يمثل العد من 5 أو "5" يمثل عدد 65541?(تماما كما abs(-32768) == -32768 يعطي غريبة لا معنى لها الجواب) إذا كنت ترغب في الحفاظ على antisymmetry مثلاisLater(b ، a) == isEarlier(a,b), ثم يمكنك دائما القيام بذلك:

bool isLater(uint16_t a, uint16_t b)
{
   int16_t diff = b-a;
   return diff < 0;
}

إذا كنت ترغب في التحيز فرع نقطة في اتجاه واحد أن يحدث في -32768+K ثم استخدام هذا بدلا من ذلك:

bool isEarlier(uint16_t a, uint16_t b)
{
   int16_t diff = a-b-K;
   return diff < -K;
}
bool isLater(uint16_t a, uint16_t b)
{
   int16_t diff = b-a-K;
   return diff < -K;
}

هذا لم يعد يستخدم الأقرب;إذا ، على سبيل المثال ، K=12768 ، a=5 ، ثم ب=6,7,8,9,...20005, isEarlier(أ ، ب) و isLater(b ، a) سوف يكون صحيحا ، ب=20006, 20007, ...65534, 65535, 0, 1, 2, 3, 4, 5 isEarlier(أ ، ب) و isLater(b ، a) سوف تكون كاذبة.

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

نصائح أخرى

أول حساب الفرق ، ثم تحقق في أي نافذة يسقط.

لأنها بسيطة جدا و أحجام الماضي/المستقبل/خطأ في نظام التشغيل windows تختلف عليك أن تفعل ذلك بنفسك.

موافق للعلم.هنا الحل هذا ما قصدته:

#include <stdint.h>


void increase_cyclic_counter (uint16_t *cnt)
{
#ifdef CYCLIC_COUNTER_EXPLICIT_WRAP
    if (*cnt < 2^16-1)
        *cnt++;
    else
        *cnt = 0;
#else
    *cnt++;
#endif
}


#define SAME 1
#define LATER 0
#define EARLIER 2
#define FORBIDDEN -1

/* dut (device under test) is tested against cur
 * returns:
 *    EARLIER (LATER) if dut happened earlier (later) in the sequence than cur
 *    SAME            if dut == cur
 *    FORBIDDEN       if dut and cur are that far away in the cyclic sequence
 *                    that no unambigious jugement is possible
 *
 * The basic idea is the same as with two-character year codes, where 
 * '97' stands for 1997 and '11' stands for 2011. '50' is regarded as 
 * too ambigous and therefore rejected.
 *
 * The implementation splits the short integer range 0-65535 into 4 parts:
 *   0-16383, 16384-32767, 32768-49151, 49152-65536
 * With cur and dut in the same range, normal arithmetics apply, else the 
 * ranges are compared to each other.
 */

int test_cyclic_counter (uint16_t cur, uint16_t dut)
{
    switch (((int)(cur>>14)) - ((int)(dut>>14)))
    {
        case 0:  // same range
            if (dut < cur) 
                return EARLIER;
            else if (dut == cur)
                return SAME;
            else 
                return LATER;

        case 1:
        case -3:
            return EARLIER;

        case 3:
        case -1:        
            return LATER;

        default: 
            return FORBIDDEN;
    }
}

يبدو لي أنك مجرد كتب عليه :).لماذا لم تترجم بعد إلى بعض ج الرمز ؟

نضع في اعتبارنا أن كنت لا يمكن الحصول على ">" و "<"أن تفعل ما تريد في C.أنها تنطبق على أرقام فقط, و لا يوجد عامل الحمولة الزائدة.نفس الشيء ينطبق على استثناء ؛ ج لا استثناءات.

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

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