C / C ++ предопределенный массив со значениями памяти

0

Я хочу сделать предварительное определение некоторого массива данными из определенного места памяти, но он почему-то не работает.

// Location of first byte in memory
#define MEMORY   0x7800

// Take a data from memory to array which will be containing the data
const uint8_t *MemArray[3] = { (const uint8_t *)MEMORY, 
                               (const uint8_t *)MEMORY+1, 
                               (const uint8_t *)MEMORY+3 };

// Now, I want to define some another array with values upper, but it not working
const uint8_t TargetArray[7] = { 1,2,3,4, 
                                 (const uint8_t)(*MemArray[0]), 
                                 (const uint8_t)(*MemArray[1]), 
                                 (const uint8_t)(*MemArray[2]) };

Кто-нибудь знает, как это сделать?

Компилятор получает предупреждение и ошибку в строках (const uint8_t) (* MemArray [i])

Предупреждение [Pe191]: идентификатор типа не имеет смысла в типе типа D:..\Source\file.c

Ошибка [Pe028]: выражение должно иметь постоянное значение D:..\Source\file.c

Я использую компилятор IAR для ядра 8051

  • 2
    «не работает» и «не работает» не является хорошим описанием вашей ситуации. Ваши ошибки могут быть не очень актуальны в этом случае, но вы должны иметь привычку включать информацию.
  • 0
    Исправил, спасибо
Показать ещё 2 комментария
Теги:
memory

2 ответа

3

Значения инициализатора должны быть постоянной времени компиляции. Таким образом, они не могут зависеть от значений, считанных из памяти, компилятор должен иметь возможность генерировать инициализированный массив.

Для этого нужно указать фактический код. Просто сделайте это сначала в main(), перед остальной частью вашей программы.

  • 0
    Да, я делаю это прямо сейчас с mem_cpy, но в этой ситуации массивы должны быть статическими, я имею в виду, что они должны быть в оперативной памяти, но у меня ее нет, поэтому я хочу сохранить массив как const. Если нет другого способа сделать это, хорошо, все равно спасибо
  • 0
    @ user3914764: Он не может быть статическим, потому что компилятор не знает, каким будет значение времени выполнения позиции 0x00007802.
Показать ещё 1 комментарий
0

Адреса связаны с очень медленным устройством? В противном случае вы можете просто указать точку указателя const на это место и зачитать значения по желанию.

Что-то вроде этого:

#define MEMORY 0x7800

const struct __attribute__ ((__packed__)){
    uint8_t foo;
    uint8_t bar;
    uint8_t __reserved;
    uint8_t baz;
} *mem = (const void *)MEMORY;

Вы можете прочитать местоположения mem->foo и т.д.

Примечание. Точный синтаксис для структурированной упаковки меняется, в этом примере используется GCC.

  • 0
    Я использую IAR-компилятор, а он не знает атрибута или упакован позже, я попытаюсь найти некоторые похожие объявления

Ещё вопросы

Сообщество Overcoder
Наверх
Меню