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

 
 
> Присвоение значения структуры
Student2
сообщение Aug 6 2009, 12:21
Сообщение #1


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Если у нас структура:

typedef struct
{
uint8_t X;
uint8_t Y;
} point_t;

и две переменные

point_t var1 = {.X = 2, .Y = 3};
point_t var2 = {.X = 4, .Y = 5};

после выполнения

var1 = var2;

что будет в var1?

Я вижу что IAR поставил var1.X = 4 , var1.Y = 5
Я тоже увидел что если первая стуктура дефинирована в ЕЕПРОМ а вторая в RAM то будет произходить програмирование ЕЕПРОМ

Вопрос в том - можно ли гарантировать что компилер будеть заботится об копирование всех полей при присвоения значения между двумя одиноковые структуры (даже если они довольно тежелые)?

Извините за незнание, можеть быть ето просто указано в ANSI C стандарте...

Другой вопрос - что будет произходить при typecast, если две структуры не одного типа. Например:

typedef struct
{
uint8_t data[3];
} arr_t;


point_t var1 = {.X = 2, .Y = 3};
arr_t var2 = {1,2,3};

var1 = (point_t)var2; /* что будет в var1 ? */
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Aug 6 2009, 13:03
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Компилятору все равно какие там поля, ему важен начальный адрес и размер обьекта. выполняет он нечто memcpy(StructA,StructB,sizeof(StructA) )
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 6 2009, 13:37
Сообщение #3


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

Группа: Участник
Сообщений: 83
Регистрация: 4-08-09
Из: Болгария / София
Пользователь №: 51 737



Если memcopy то после присвоения var1 будет иметь
var1.X - 1
var1.Y - 2

Сообщение отредактировал Student2 - Aug 6 2009, 13:38
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 6 2009, 17:56
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



И тем не менее MALLOY2 прав.
Если структура мелкая и вызов memcpy неоправданно дорог, то будет непосредственно вставлен цикл копирования блока памяти размером sizeof(struct) (побайтного или пословного или и т.д. в зависимости от выравнивания полей структуры, типа MCU и компилятора).


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
xelax
сообщение Aug 7 2009, 06:01
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(demiurg_spb @ Aug 6 2009, 21:56) *
И тем не менее MALLOY2 прав.
Если структура мелкая и вызов memcpy неоправданно дорог, то будет непосредственно вставлен цикл копирования блока памяти размером sizeof(struct) (побайтного или пословного или и т.д. в зависимости от выравнивания полей структуры, типа MCU и компилятора).


Вообще копирование одних типов структур в другие, тем более через memcpy это рассадник ошибок на не 8 битных архитектурах. За такой код maniac.gif
Про выравнивание ненадо забывать.
Если тип структур один и тот же то присвоение корректно. А если разный, то надо присваивать по полям без всяких извращений.
Go to the top of the page
 
+Quote Post



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

 


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


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