[an error occurred while processing this directive] [an error occurred while processing this directive]
прошу прощение за назойливость
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Чайник с прошлой страницы:) 22 декабря 2001 г. 21:52

Напомню вопрос :


Есть массив ARRAY переменных типа B_TYPE.
т.е. B_TYPE ARRAY[10];
по определенным причинам, прямо так определять массив в памяти
не могу. Надо "виртуально" разместить его в определенном адресе.
Не прибегая к средствам компилятора размещать переменные по абсолютным
адресам, хочется сделать "универсально", т.е. через typedef, a
доступ по define.
Так вот, как правильно написать выражение в С через typedef, чтобы обозвать етот
массив одним типом X,
а потом
#define X_DEF (X *)(0x5000000)
и X_DEF->[5] = X_DEF->[6] и т.д.

не используя typedef объявил так
#define X_DEF((B_TYPE (*)[3])(0x5000080)) // (типа нужно всего 3 элемента)

тип B_TYPE имеет следующую структуру


typedef struct {
/* размер 2 байта */ sync;
/* размер 1 байт */ line[43];
} A_TYPE;

typedef struct {
A_TYPE data0 [16];
A_TYPE data1 [16];
} B_TYPE;


с учетом выравнивания структуры :
sizeof(A_TYPE) = 46 байт
sizeof(B_TYPE) = 46 * 32 = 1472 байта

пишу следующее:


long adr1,adr2,adr3;
adr1 = (long)&(X_DEF[0]);
adr2 = (long)&(X_DEF[1]);
adr3 = (long)&(X_DEF[2]);

после чего получается


adr1 = 0x5000080;
adr2 = 0x50011С0;
adr3 = 0x5002300;

т.е получается, что
sizeof(B_TYPE) = 0x1140 = 4416 т.е. ровно в 3 раза больше реального
а ежели объявить так
#define X_DEF((B_TYPE (*)[1])(0x5000080))

то sizeof(B_TYPE) = 1472 как и надо...

Где я не догоняю? и почему так и как же все-таки правильно в С
объявить данное чудо? В конце концов че обозначает цифирь в [] в данном
define ?:)

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru