|
Вопрос на счет выравнивания переменных |
|
|
|
Oct 19 2009, 15:05
|

Частый гость
 
Группа: Участник
Сообщений: 98
Регистрация: 3-03-09
Пользователь №: 45 590

|
Всем привет! Код u32 func(char * array, u32 * A) { *A = 2; return *A; } Иногда возникает такая проблема, если А не выравнена по слову, попадает смещенная величина. Вот пример: В самом начале: ____word___________wordA____ | 00 00 00 00 |____| 00 00 00 00 | Должно получиться после присваивания: ____word___________wordA____ | 00 00 00 00 |____| 02 00 00 00 | А получается так: ____word___________wordA____ | 00 00 00 02 |____| 00 00 00 00 | Кто как борет это? Компилятор GCC.
Сообщение отредактировал AirDevil - Oct 19 2009, 15:06
|
|
|
|
|
 |
Ответов
|
Oct 19 2009, 17:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AirDevil @ Oct 19 2009, 18:05)  Кто как борет это? Первое и самое главное не писать "говнокод" работу которого компилятор не сможет проконтролировать. Второе, если уж где-то реально нужно, то контролировать полученный адрес на выравненность и использовать для таких случаев (или тупо всегда) копирование областей памяти. Цитата(demiurg_spb @ Oct 19 2009, 18:28)  Для какой архитектуры компилятор? ARM, например. Не AVR, не x86....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 19 2009, 20:13
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AHTOXA @ Oct 19 2009, 22:44)  при условии, что A - это указатель на u32 Да, это указатель на u32, но не выровненный, а находящийся, например, в каком-нибудь буфере передачи.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 19 2009, 20:40
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(zltigo @ Oct 20 2009, 02:13)  Да, это указатель на u32, но не выровненный, а находящийся, например, в каком-нибудь буфере передачи. Для этого в IARе нужно было всего-то объявить невыравненный тип u32_unalign и вообще не напрягаться Код #pragma pack(push, 1) typedef u32 u32_unalign; #pragma pack(pop)
u32 func(u08 * array, u32_unalign * A) { u32 tmp = *(u32_unalign *)array; *A = tmp; return tmp; } Работает ли это в GCC ? Ессно изменив прагму.
Сообщение отредактировал GetSmart - Oct 19 2009, 21:17
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 19 2009, 21:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Oct 19 2009, 23:40)  Для этого.. #pragma pack(push, 1) typedef u32 u32_unalign; #pragma pack(pop) Цитата(_Pasha @ Oct 20 2009, 00:04)  Например: typedef unsigned int u32_unalign __attribute__ ((aligned (1))); Даже не знаю, сметься, плакать, или спросить где Вы оба берете такую траву? Можно я помолчу?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
AirDevil Вопрос на счет выравнивания переменных Oct 19 2009, 15:05 demiurg_spb Для какой архитектуры компилятор?
Вы что-то путает... Oct 19 2009, 15:28 AirDevil Цитата(zltigo @ Oct 19 2009, 20:05) Перво... Oct 19 2009, 19:27    _Pasha Цитата(GetSmart @ Oct 19 2009, 23:40) Раб... Oct 19 2009, 21:04 GetSmart От зараза, не сработала
Я обычно через структуру ... Oct 19 2009, 22:43 zltigo Цитата(GetSmart @ Oct 20 2009, 01:43) Но ... Oct 19 2009, 23:14  GetSmart Цитата(zltigo @ Oct 20 2009, 05:14) Чем д... Oct 19 2009, 23:39 rezident Цитата(GetSmart @ Oct 20 2009, 04:43) Хот... Oct 19 2009, 23:54 GetSmart Отдельные переменные не всегда выравнены. В посте ... Oct 20 2009, 00:21 rezident Цитата(GetSmart @ Oct 20 2009, 06:21) Впо... Oct 20 2009, 00:32 SasaVitebsk Была аналогичная проблема.
Данные "готовились... Oct 20 2009, 09:17 zltigo Цитата(SasaVitebsk @ Oct 20 2009, 12:17) ... Oct 20 2009, 09:23  SasaVitebsk Цитата(zltigo @ Oct 20 2009, 12:23) Наибо... Oct 20 2009, 16:21
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|