سؤال

لقد قمت بإنشاء نظام كتابة ديناميكي في C من أجل إنشاء قاموس يمكن أن يحتوي على قيم بعرض بت مختلف. هيكل الكائن الديناميكي هو:

typedef struct
{
    void* Pointer;
    unsigned char Size;   
} Dynamic;

أحتاج إلى مقارنة اثنين من هذه الديناميات التي لديها قراءات A2D ثم مقارنة الفرق ضد قيمة دلتا لتحديد ما إذا كان التغيير قد حدث. أحد الحلول التي تمكنت من التوصل إليها هي إلقاءها على صفائف char ومقارنتها بايت بواسطة بايت، ولكن هذا لا رائحة الحق. لدي بالفعل فكرة لإجراء مجموعة من مؤشرات الوظائف بناء على عدد البايتات (أو ربما النوع) الديناميات التي تأخذها الديناميات وإجراء وظيفة مقارنة لكل نوع مدعوم. هل يمكن لأي شخص أن يقترح نهجا مختلفا؟ يشعر وكأنني أفتقد شيئا.

تحديث:

شكرا لإخباري عن memcmp، لكن لا يزال لدي مشكلة كيف أحصل على دلتا القيمتين؟ من ما يمكنني أن أقول إليه، يعيد MemCMP، فقط مؤشرا له قيمة أكبر، وليس الفرق بينهما.

تحديث للتحديث:

تبين أن memcmp غير مجدية بالنسبة لي لأن الهندسة المعمارية التي أقوم بها ضد الإناث القليل.

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

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

المحلول

هل هذا شيء مثل هذه كافية؟

#include <string.h>
int compare(Dynamic *a, Dynamic *b) {
    if (a->Size != b->Size) return a->Size - b->Size;
    return memcmp(a->Pointer, b->Pointer, a->Size);
}

إنشاء مجموعة من الوظائف المتخصصة إذا كانت تؤدي عمليات مشابهة للغاية تبدو وكأنها مبالغة.

إضافة

إذا كنت ترغب في حساب الاختلافات ...

int diff(Dynamic *a, Dynamic *b, Dynamic *d) {
    int i, borrow = 0;
    signed char *ap = a->Pointer, *bp = b->Pointer, *dp = d->Pointer;

    assert(a->Size == b->Size && b->Size == d->Size);

    for (i = 0; i < a->Size; ap++, bp++, dp++, i++) {
        // symmetric difference
        *dp = *ap ^ *bp;

        // arithmetic difference, assuming little-endian
        *dp = borrow += *bp - *ap;
        borrow >>= 8;
    }
}

نصائح أخرى

ربما أنا أفتقد شيئا أيضا ... ولكن لماذا لا تستخدم memcmp؟

إذا كنت تحاول تنفيذ وظيفة Bignum (وقد تفكر لأحد آخر (أول Google تضرب على "برعي في C"))، فأكما ترغب في الاستقرار تقريبا في حساب الفرق من خلال الطرح. ينفذ معظم وحدات المعالجة المركزية مقارنة عن طريق القيام بذلك فقط ومن ثم استخدام علامة النتيجة أو الزرهاد ل <،>، أو ==.

انظروا، أنا مهوس الرياضيات، وأنا أعلم، لكن القضية الأساسية تبدو وكأنها "جي، ماذا يكون النظام الطبيعي لهذه الأشياء؟

هي البتات الخام البيانات الأساسية، مثل برعاية؟ ثم يلقيهم إلى شار غير موقعة ومقارنتهم في حلقة. التفكير القليل في الترتيب الذي تقارن فيه سيجعله أكثر كفاءة. نقطة مثيرة للاهتمام هي عندما طول ≠ طول B: هو ≠ B ثم بحكم التعريف، أم أنها القيمة العددية التي تقارن فيها، في هذه الحالة بايت بايت من 0x00 ليست مهمة؟

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

أفترض أن أحجام البت المتغيرة ترجع إلى بعض القيم أكبر من غيرها. إذا كنت تستطيع أن تضمن أن عدد البتات يعني دائما تعيين رقم البت، فيمكنك أولا مقارنة الأحجام وإذا كانت الأحجام متساوية، فقم بإجراء مقارنات البايت غير الموقعة. على سبيل المثال "01" تحتاج فقط 1 بت إلى المتجر، لذلك سيكون حجمه 1، و "100101" يتطلب 6 بت لتخزين لذلك حجمها 6. إذا كان الحجم (أ)> الحجم (ب)، ثم (أ) (ب).

هل هذه مخزنة في الإندان الكبير أو القليل؟

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