|
|
  |
Ламерской вопрос, массив unsigned char |
|
|
|
Feb 8 2007, 19:30
|
Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675

|
Цитата(DASM @ Feb 8 2007, 19:20)  И чего ??? где тут слово array ? ... назовите мне компилятор, который решетом массив разместит При чем тут array? тут даже болише написано: Word alignment (2-byte) When word alignment is on, ..... char and unsigned char variables and fields can be placed at _any_ address
|
|
|
|
|
Feb 8 2007, 19:45
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(DASM @ Feb 8 2007, 21:25)  "А с точки зрения голых Сей результат должен быть одинаковый." кто такое сказал ? Ссылку плиз А почему нет то? Пойдём от противного! Где написано что разименованный указатель на элемент структуры не обязательно равен этому элементу структуры? да и на x86 или без __attribute__ ((__packed__)) результат вывода циклов будет одинаковый.
|
|
|
|
|
Feb 8 2007, 20:06
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(DASM @ Feb 8 2007, 21:53)  ладно, возможно тут и промахнулся, и тем не менее к нашим баранам вернемся, массивам то есть Про массивы я более придерживаюсь твоей точки зрения, т.е. выравнивание должно распрастраняться только на первый элемент массива. Но я не буду столь категоричен, ибо ....
|
|
|
|
|
Feb 8 2007, 22:18
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
DASM полностью прав!!! НЕ МОЖЕТ компилятор положить массив в памяти с дырками! Это противоречит всем законам языка. Я имею полное право сделать так: Код uchar test[10]; void test { char *ptr;
//Классический вариант: ptr = test + 5; //А теперь так: ptr = (uchar*)((void*)test + 5 * sizeof(uchar)); //И вот так: ptr = (uchar*)((int)test + 5 * sizeof(uchar)); Кто покажет мне (и DASM'у) хоть один компилятор, у которого эти три варианта будут не одинаковы??? Хочу сказать отдельное спасибо Alex03 за правильное предупреждение, т.к. доступ через указатель к переменной, не выровненной по умолчанию на архитектуре АРМ может работать некорректно. Я с этим еще не сталкивался, но словив такой глюк, можно долго проблемы разгребать
|
|
|
|
|
Feb 9 2007, 01:36
|
Местный
  
Группа: Свой
Сообщений: 421
Регистрация: 25-12-04
Пользователь №: 1 675

|
Цитата(DASM @ Feb 8 2007, 19:38)  ну а вот теперь сделайте из этих variables ARRAY - .... не надо .... уходить от темы Как раз не ухожу, а наоборот: если уж при "Word alignment" компилятор будет "char variables and fields can be placed at _any_ address", то о каких дырах в массиве может идти речь. (но это конкретный компилятор, допускаю, что есть специфические, может для DSP каких, где компилятору "удасться" сделать дыры, но я таких не знаю).
|
|
|
|
|
Feb 9 2007, 07:05
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(gladov @ Feb 9 2007, 00:18)  Хочу сказать отдельное спасибо Alex03 за правильное предупреждение, т.к. доступ через указатель к переменной, не выровненной по умолчанию на архитектуре АРМ может работать некорректно. Я с этим еще не сталкивался, но словив такой глюк, можно долго проблемы разгребать  Угу,  Мне вот интересно что выдаёт первый цикл из моего примера на других компиляторах? Кому не лень попробуйте на всяких IAR/Keil/RVDS? Только упаковку (например pragm pack(1) вместо __attribute__ ((__packed__))) надо подправить чтобы sizeof(test_struct_t)=5 было. Интуиция мне говорит что возможно не все компиллеры такие разборчивые в этом плане как GCC.
|
|
|
|
|
Feb 9 2007, 10:42
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(Alex03 @ Feb 9 2007, 07:05)  Мне вот интересно что выдаёт первый цикл из моего примера на других компиляторах? Кому не лень попробуйте на всяких IAR/Keil/RVDS? Только упаковку (например pragm pack(1) вместо __attribute__ ((__packed__))) надо подправить чтобы sizeof(test_struct_t)=5 было. Интуиция мне говорит что возможно не все компиллеры такие разборчивые в этом плане как GCC.  Проверил на ИАР 4.40а. На строки Код printf("%d: %c 0x%08X %p\n", n, data[n].uc, data[n].ui, &data[n].ui); pui = &data[n].ui; ругается так: Warning[Pa039]: use of address of unaligned structure member При работе, первый цикл проходит как положено, а во втором из printf вываливается в обработчик ABORT DATA. Почему тогда в первом случае работает я не понимаю
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|