реклама на сайте
подробности

 
 
> Ламерской вопрос, массив unsigned char
Fortune
сообщение Feb 8 2007, 11:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 75
Регистрация: 1-02-07
Из: Украина
Пользователь №: 24 940



Я с ARM еще не работал, но у меня появились вопросы.
Если обьявить массив типа unsigned char в ОЗУ
сколько будет занимать один элемент в памяти?
Можно ли сделать так, чтобы он занимал 1 байт?
Если нет, то как легче всего это сделать программно.
Go to the top of the page
 
+Quote Post
4 страниц V  < 1 2 3 4 >  
Start new topic
Ответов (30 - 44)
DASM
сообщение Feb 8 2007, 19:25
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



"А с точки зрения голых Сей результат должен быть одинаковый."
кто такое сказал ? Ссылку плиз
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Feb 8 2007, 19:30
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 8 2007, 19:38
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



ну а вот теперь сделайте из этих variables ARRAY - на каждый элемент будете allign писать ?? Мы говорили про ARRRAY, не надо проблемы половой жизни сусликов в условиях крайнего Севера сюда приплюсовывать уходить от темы
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 8 2007, 19:45
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(DASM @ Feb 8 2007, 21:25) *
"А с точки зрения голых Сей результат должен быть одинаковый."
кто такое сказал ? Ссылку плиз

А почему нет то?
Пойдём от противного! Где написано что разименованный указатель на элемент структуры не обязательно равен этому элементу структуры?

да и на x86 или без __attribute__ ((__packed__)) результат вывода циклов будет одинаковый.
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 8 2007, 19:53
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



ладно, возможно тут и промахнулся, и тем не менее к нашим баранам вернемся, массивам то есть
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 8 2007, 20:06
Сообщение #36


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(DASM @ Feb 8 2007, 21:53) *
ладно, возможно тут и промахнулся, и тем не менее к нашим баранам вернемся, массивам то есть

Про массивы я более придерживаюсь твоей точки зрения, т.е. выравнивание должно распрастраняться только на первый элемент массива.
Но я не буду столь категоричен, ибо .... smile.gif
Go to the top of the page
 
+Quote Post
tegumay
сообщение Feb 8 2007, 20:12
Сообщение #37


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 16-09-05
Из: Москва
Пользователь №: 8 640



насчет хранения и форматирования данных в памяти это хорошо что затронули тему
только не надо наезжать на святое на контроллер памяти. он работает на кэш. и чем сетка шире тем лучше
данные гонятся пакетами. контроллеру наплевать кто и как положит его задача как положили так и выдать и все. ему си не си наплевать. его задача из микрухи до проца. далше его проца дело


--------------------
;X
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 8 2007, 20:14
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



так... еще лучше.. кто глубже копнет :-D
Go to the top of the page
 
+Quote Post
gladov
сообщение Feb 8 2007, 22:18
Сообщение #39


Частый гость
**

Группа: Свой
Сообщений: 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 за правильное предупреждение, т.к. доступ через указатель к переменной, не выровненной по умолчанию на архитектуре АРМ может работать некорректно. Я с этим еще не сталкивался, но словив такой глюк, можно долго проблемы разгребать cheers.gif
Go to the top of the page
 
+Quote Post
Andrew2000
сообщение Feb 9 2007, 01:36
Сообщение #40


Местный
***

Группа: Свой
Сообщений: 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 каких, где компилятору "удасться" сделать дыры, но я таких не знаю).
Go to the top of the page
 
+Quote Post
Alex03
сообщение Feb 9 2007, 07:05
Сообщение #41


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Цитата(gladov @ Feb 9 2007, 00:18) *
Хочу сказать отдельное спасибо Alex03 за правильное предупреждение, т.к. доступ через указатель к переменной, не выровненной по умолчанию на архитектуре АРМ может работать некорректно. Я с этим еще не сталкивался, но словив такой глюк, можно долго проблемы разгребать cheers.gif

Угу, cheers.gif
Мне вот интересно что выдаёт первый цикл из моего примера на других компиляторах?
Кому не лень попробуйте на всяких IAR/Keil/RVDS? Только упаковку (например pragm pack(1) вместо __attribute__ ((__packed__))) надо подправить чтобы sizeof(test_struct_t)=5 было.

Интуиция мне говорит что возможно не все компиллеры такие разборчивые в этом плане как GCC. smile.gif
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Feb 9 2007, 10:08
Сообщение #42


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Блин, сразу видно - DASM вернулся на форум. Ж) Из ничего флейма на 3 странички. С возвращением! Ж))


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
gladov
сообщение Feb 9 2007, 10:42
Сообщение #43


Частый гость
**

Группа: Свой
Сообщений: 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. smile.gif


Проверил на ИАР 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. Почему тогда в первом случае работает я не понимаю blink.gif
Go to the top of the page
 
+Quote Post
DASM
сообщение Feb 9 2007, 11:19
Сообщение #44


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



да вы доки читайте ! тама написано, что это не рулез и так делать и ничего вам не гарантируется !
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 9 2007, 11:23
Сообщение #45


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(gladov @ Feb 9 2007, 09:42) *
Почему тогда в первом случае работает я не понимаю blink.gif
Здесь как раз никакого чуда. Посмотрите в листинг. Компилятор, зная, что поле структуры не выровнено, обращается к полю побайтно и из считанных байтов "склеивает" содержимое поля.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

4 страниц V  < 1 2 3 4 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01477 секунд с 7
ELECTRONIX ©2004-2016