سؤال

أنا أخطب بعض رمز Linux C في معالج إشارة لاستثناءات النقاط العائمة. الهدف هو التحقق من سجلات النقاط العائمة، وطباعة بعض المعلومات، ثم إحباط. أحصل على خطأ تجزئة عند محاولة طباعة نتيجة (char)('0' + phyreg).

struct ucontext *   uc = (struct ucontext *) data;
fpregset_t      fp = uc -> uc_mcontext.fpregs;

int top = (fp -> sw >> 11) & 0x07;
int i,j,k;
for (i = 0; i < 8; i++) {
    static const char * tags [] = {
        "valid", "zero", "invalid/infin", "empty"
    };
    int phyreg = (top + i) & 0x07;
    struct _libc_fpreg* r = &(fp -> _st [phyreg]);
    const char* regExp = (((r->exponent & 0x8000) != 0) ? "-" : "+");
    printf ("  FP %s: Mantissa= %s",
            (char) ('0' + phyreg), // reg stack (SIGSEGV here)
            regExp); // register exponent sign
    j = (r->significand[3] >> 15) & 0x01;
    printf ("%s.",(char) ('0' + j)); // mantissa (Also SIGSEGV here when
                                     // previous SIGSEGV is commented out)
    ...
}

انها ليست حساب (char)('0' + phyreg) هذه هي المشكلة، لأنه عند نقلها إلى خط منفصل وتخزين النتيجة في متغير درجة الحرارة، لا أحصل على Segfault حتى تحاول PrintF عرض متغير TEMP. إذن، أين هو الخطأ الذي يسبب segfault؟

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

المحلول

أنت تطبع مع٪ s. يجب أن تكون "fp٪ c: mantissa =٪ s".

نصائح أخرى

يعني٪ S سلسلة، أنت تعطيها شخصية. يتم تفسير قيمة الطابع هذه بواسطة printf كأشر إلى الحرف الأول من السلسلة للطباعة، والتي تنفذ بالطبع بصورة مصرية.

ضع الشخصية في صفيف حرف مع عنصرين، والثاني " 0"، أو معرفة ما إذا كان لدى PrintF شيئا يقيم على حرف.

استخدم ال %c تنسيق محدد للحصول على شخصية واحدة، بدلا من %s (والتي يجب أن تستخدم ل nullالسلسلة المميزة).

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