Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> СИ не плюс, const, создание специфического массива, Создание специфического массива. 
:(
    Опции темы
Robus
  Дата 5.4.2012, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: нет
Всего: 1



Здравствуйте.

Возникла проблема в создании массива на классическом СИ.

Задача:
Есть множество #define'ов, которые должны указывать на индекс массива. Я хочу создать массив в ROM, то есть это const, из 256 байт. Каждая ячейка по индексу из define'а должна быть заполнена заданным значением из другого define'а, не заполненные индексы должны прописаться нулями. Теоретический пример:
Код

#define scan_KEY_0  (48)
#define new_KEY_0   (84)
const char masivchik[256]={0,0 .... 0};
masivchik[scan_KEY_0] = new_KEY_0;


На ассемблере я бы сделал очень просто:
Код

scan_KEY_0  EQU 48
new_KEY_0   EQU 84
          ...
masivchik DS 256
         ORG masivchik+scan_KEY_0
         DB new_KEY_0
         ORG masivchik+256
         ...


Вот собственно как это реализовать на СИ ??? Особое внимание обращаю, на то, что должно быть описание как константа, что бы компилятор понял, что это простой массив из 256 байт с нужными мне параметрами. Код пишу под KEIL'ом, если есть фичи KEIL'а, буду рад им, если кто знает их. Но конечно в идеале было бы приятно иметь возможность создавать такие таблицы в классическом СИ, что бы код был таки переносимым ...

Спасибо.
PM MAIL   Вверх
bsa
Дата 5.4.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Robus, хочу тебя огорчить. Даже статический константный массив, скорее всего, будет проинициализирован в момент запуска программы (т.е. в области данных будет выделена память, в которую будет скопированы данные из ПЗУ). Читай документацию к своему компилятору, возможно, там описан особый механизм размещения данных в ПЗУ.
Но, в любом случае, сделать то, что ты хочешь нельзя средствами Си. Придется писать ручками весь массив.
PM   Вверх
alexvs11
Дата 6.4.2012, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



либо рантайм, либо сгенерить скриптом хедер - делов-то
PM MAIL   Вверх
Dem_max
Дата 6.4.2012, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



так
Код

#define new_KEY_0   84
#define new_KEY_1   77
const char masivchik[256]={0,0, new_KEY_0, ..., new_KEY_1,..... 0};



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
bsa
Дата 6.4.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Dem_max, ты видимо задачу понял неверно.  smile 
PM   Вверх
xvr
Дата 6.4.2012, 11:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Если компилятор поддерживает С99, то так -
Код

#define scan_KEY_0  (48)
#define new_KEY_0   (84)
const char masivchik[256]={ [scan_KEY_0] = new_KEY_0, ... };


PM MAIL   Вверх
Robus
  Дата 6.4.2012, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entire



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 15.12.2005

Репутация: нет
Всего: 1



Цитата(xvr @  6.4.2012,  11:42 Найти цитируемый пост)
Если компилятор поддерживает С99, то так -

Спасибо.

Я уже разобрался ... Я шёл по этому пути, но не знал, особенностей С99, и компилил в С11. Задачу решил, но она требует в проект добавлять флаг компиляции С99. Это не самое лучшее решение, но оно наилучшее из всех.

Ещё раз спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0690 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.