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

 
 
> Ошибка при копировании структур, Почему-то виснет при копировании вложенных структур
kolobochishe
сообщение Oct 20 2014, 10:41
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 240
Регистрация: 14-04-10
Из: Россия, г.Челябинск
Пользователь №: 56 634



Структура типа im_rect является вложенной в структуре im_widget. При создании массива из элементов im_widget внутренняя структура im_rect InnerRect не копируется (прибор виснет при отладке) в случае если элементы im_widget в одном массиве. В Visual Studio все работает, а в Visual DSP виснет. Что делать? И как Вы делаете копирование структур? Читал, что в старых компиляторах на это было ограничение. Можно memcpy или memmove. Но хочется разобраться в таком поведении контроллера.

Код
typedef int_fast16_t im_int;

typedef struct
{
im_int Left;
im_int Top;
im_int Right;
im_int Bottom;
} im_rect;

typedef struct {
im_int Type;
im_rect OuterRect;    
im_rect InnerRect;    
void * Widget;
im_int State;
char * Title;
char * Text;
char * Hint;
pt2Function Function;
void * AddInf;
im_pixel BkPixel;
uchar AutoSize;
pt2Function DrawFunction;
} im_widget;


im_rect TestRect = { 5, 6, 7, 8 };
im_widget wFKey[4];

wFKey[0].InnerRect.Left = 5;

memcpy(&wFKey[1].InnerRect, &wFKey[0].InnerRect, sizeof(im_rect)); // Работает
wFKey[1].InnerRect = wFKey[0].InnerRect; // Виснет
wFKey[1].InnerRect = TestRect; // Работает


Т.е. виснет при копировании вложенных структур внутри массива.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
inventor
сообщение Oct 31 2014, 10:10
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(kolobochishe @ Oct 20 2014, 14:41) *
Структура типа im_rect является вложенной в структуре im_widget.


на вскидку: невыровненная структура - вероятно в эксепшен вылетает
смотрите чтобы все поля по 32 бита были.
ну а если нет такой возможности - делайте юнион
на свою структуру и копируйте с помощью memcpy по-байтно

Не надо цитировать всё подряд.

Сообщение отредактировал Herz - Oct 31 2014, 15:32
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 31 2014, 12:56
Сообщение #3


Гуру
******

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



Цитата(inventor @ Oct 31 2014, 12:10) *
на_вскидку: невыровненная структура - вероятно в эксепшен вылетает
Автор пишет, что никаких специальных мер по нарушению выравнивания не предпринимал, читайте внимательнее.

Цитата(inventor @ Oct 31 2014, 12:10) *
смотрите чтобы все поля по 32 бита были.
А это еще зачем? А вложенная стрктура тоже полем является, она тоже по 32 бита должна быть?

Цитата(inventor @ Oct 31 2014, 12:10) *
ну а если нет такой возможности - делайте юнион на свою структуру и копируйте с помощью memcpy по-байтно
1) у memcpy параметр имеет тип void *, согласно правилам неявного приведения типов указатель на структуру будет приведен к этому типу неявно. Никакой union не нужен.
2) Стандарт языка гарантирует, что структура должна копироваться без всяких плясок с бубном. Вне зависимости от размера, типа и количества своих членов. Даже если структура объявлена с другим выравниванием, компилятор об этом знает и обязан выполнять копирование корректно. Проблема с выравниванием может возникнуть только при доступе через указатель, если программист явным приведением типов сознательно нарушил правила выравнивания.


--------------------
На любой вопрос даю любой ответ
"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
_pv
сообщение Nov 1 2014, 08:35
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



Цитата(Сергей Борщ @ Oct 31 2014, 18:56) *
Автор пишет, что никаких специальных мер по нарушению выравнивания не предпринимал, читайте внимательнее.

Даже если структура объявлена с другим выравниванием, компилятор об этом знает и обязан выполнять копирование корректно.

он хоть и обязан, но баги в компиляторах тоже бывают, и про VDSP нельзя сказать что это самый безглючный компилятор.
тут похоже грабли из-за массива структур, посмотрите по каким именно адресам он от положил wFKey[0] и wFKey[1].
и для проверки, попробуйте добавить, сколько надо ucharов в структуру, чтобы размер sizeof(im_widget) стал кратным четырём.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 18:03
Рейтинг@Mail.ru


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