Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Присвоение значения структуры
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Student2
Если у нас структура:

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 ? */
aaarrr
Цитата(Student2 @ Aug 6 2009, 16:21) *
Вопрос в том - можно ли гарантировать что компилер будеть заботится об копирование всех полей при присвоения значения между двумя одиноковые структуры (даже если они довольно тежелые)?

Можно.

Цитата(Student2 @ Aug 6 2009, 16:21) *
/* что будет в var1 ? */

Ошибка будет на этапе компиляции.
MALLOY2
Компилятору все равно какие там поля, ему важен начальный адрес и размер обьекта. выполняет он нечто memcpy(StructA,StructB,sizeof(StructA) )
Student2
Если memcopy то после присвоения var1 будет иметь
var1.X - 1
var1.Y - 2
demiurg_spb
И тем не менее MALLOY2 прав.
Если структура мелкая и вызов memcpy неоправданно дорог, то будет непосредственно вставлен цикл копирования блока памяти размером sizeof(struct) (побайтного или пословного или и т.д. в зависимости от выравнивания полей структуры, типа MCU и компилятора).
SM
Цитата(Student2 @ Aug 6 2009, 16:21) *
var1 = (point_t)var2; /* что будет в var1 ? */


А вот так будет то, что ожидается...
var1 = *(point_t*)&var2; /* что будет в var1 ? */
Student2
Спасибо - сейчас все понятно!
xelax
Цитата(demiurg_spb @ Aug 6 2009, 21:56) *
И тем не менее MALLOY2 прав.
Если структура мелкая и вызов memcpy неоправданно дорог, то будет непосредственно вставлен цикл копирования блока памяти размером sizeof(struct) (побайтного или пословного или и т.д. в зависимости от выравнивания полей структуры, типа MCU и компилятора).


Вообще копирование одних типов структур в другие, тем более через memcpy это рассадник ошибок на не 8 битных архитектурах. За такой код maniac.gif
Про выравнивание ненадо забывать.
Если тип структур один и тот же то присвоение корректно. А если разный, то надо присваивать по полям без всяких извращений.
ReAl
Цитата(xelax @ Aug 7 2009, 09:01) *
Вообще копирование одних типов структур в другие, тем более через memcpy это рассадник ошибок на не 8 битных архитектурах.
...Если тип структур один и тот же то присвоение корректно. А если разный, то надо присваивать по полям без всяких извращений.
+1
Редко когда "соображения эффективности" могут перевесить возможный глюкодром в таком месте.
Тем более, что если уж "по жизни" начало второй структуры совпадает с первой, то можно сделать во второй в начале поле типа первой структуры и копировать его.
demiurg_spb
Цитата(xelax @ Aug 7 2009, 10:01) *
Вообще копирование одних типов структур в другие, тем более через memcpy это рассадник ошибок
Да с Вами согласен и призываю оперировать в присвоении одинаковыми типами структур. Я лишь пытался донести во что транслируется строчка struct1 = struct2; при _одинаковых_ типах.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.