Объединение и проблема упаковки структуры

Директива ErrorDocument , когда указывается локальный путь URL, ожидает, что путь будет полностью определен из DocumentRoot . В вашем случае это означает, что фактический путь к ErrorDocument равен

ErrorDocument 404 /JinPortfolio/error/404page.html

Когда вы исправили его во второй попытке, причина, по которой вы видите эту страницу, заключается в том, что http://localhost/error/404page.html не существует отсюда немного о наличии ошибки 404 при поиске документа обработки ошибок.

6
задан timrau 14 August 2012 в 23:49
поделиться

4 ответа

Ваша структура имеет только 31 бит

8
ответ дан 8 December 2019 в 13:01
поделиться

AFAIK, порядок, в котором хранятся биты в структуре, не определен стандартом C99 (и стандартом C89 тоже). Скорее всего, биты расположены в порядке, обратном ожидаемому.

Вы должны были показать результат, который вы получили, а также результат, который вы ожидали - это поможет нам с диагностикой. Компилятор, который вы используете, и платформа, на которой вы работаете, также могут иметь значение.


В MacOS X 10.4.11 (PowerPC G4) этот код:

#include <inttypes.h>
#include <stdio.h>

typedef union
{
        uint32_t raw;
        struct
        {
                unsigned int present:1;
                unsigned int rw:1;
                unsigned int user:1;
                unsigned int dirty:1;
                unsigned int free:7;
                unsigned int frame:20;
        };
} page_union_t;

int main(void)
{
        page_union_t p = { .raw = 0 }; //.....
        unsigned trg_page = 0xA5A5A;
        unsigned user = 1;
        unsigned rw = 1;
        unsigned present = 1;

        p.frame = trg_page;
        p.user = user;
        p.rw = rw;
        p.present = present;

        printf("p.raw = 0x%08X\n", p.raw);

        p.raw = trg_page<<12 | user<<2 | rw<<1 | present;
        printf("p.raw = 0x%08X\n", p.raw);

        p.raw <<= 1;
        printf("p.raw = 0x%08X\n", p.raw);
        return(0);
}

дает показанные результаты:

p.raw = 0xE014B4B4
p.raw = 0xA5A5A007
p.raw = 0x4B4B400E

При обратном порядке полей , результат более объясним:

#include <inttypes.h>
#include <stdio.h>

typedef union
{
        uint32_t raw;
        struct
        {
                unsigned int frame:20;
                unsigned int free:7;
                unsigned int dirty:1;
                unsigned int user:1;
                unsigned int rw:1;
                unsigned int present:1;
        };
} page_union_t;

int main(void)
{
        page_union_t p = { .raw = 0 }; //.....
        unsigned trg_page = 0xA5A5A;
        unsigned user = 1;
        unsigned rw = 1;
        unsigned present = 1;

        p.frame = trg_page;
        p.user = user;
        p.rw = rw;
        p.present = present;

        printf("p.raw = 0x%08X\n", p.raw);

        p.raw = trg_page<<12 | user<<2 | rw<<1 | present;
        printf("p.raw = 0x%08X\n", p.raw);

        p.raw <<= 1;
        printf("p.raw = 0x%08X\n", p.raw);
        return(0);
}

Это дает результат:

6
ответ дан 8 December 2019 в 13:01
поделиться

Вы не упомянули, что заранее очищаете части структуры, уверены ли вы, что в первом случае у вас не остались биты мусора?

// maybe try this
page_union_t p = {0};
0
ответ дан 8 December 2019 в 13:01
поделиться

Если точное положение битов имеет значение, наиболее безопасным вариантом будет явная упаковка и распаковка структуры в массив беззнаковых символов. Все остальное слишком зависит от реализации.

2
ответ дан 8 December 2019 в 13:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: