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

 
 
 
Reply to this topicStart new topic
> Присвоение значения структуры
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
aaarrr
сообщение Aug 6 2009, 12:58
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Можно.

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

Ошибка будет на этапе компиляции.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Aug 6 2009, 13:03
Сообщение #3


Знающий
****

Группа: 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
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5


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

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



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


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


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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


А вот так будет то, что ожидается...
var1 = *(point_t*)&var2; /* что будет в var1 ? */
Go to the top of the page
 
+Quote Post
Student2
сообщение Aug 6 2009, 18:37
Сообщение #7


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

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



Спасибо - сейчас все понятно!
Go to the top of the page
 
+Quote Post
xelax
сообщение Aug 7 2009, 06:01
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 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
ReAl
сообщение Aug 7 2009, 07:04
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(xelax @ Aug 7 2009, 09:01) *
Вообще копирование одних типов структур в другие, тем более через memcpy это рассадник ошибок на не 8 битных архитектурах.
...Если тип структур один и тот же то присвоение корректно. А если разный, то надо присваивать по полям без всяких извращений.
+1
Редко когда "соображения эффективности" могут перевесить возможный глюкодром в таком месте.
Тем более, что если уж "по жизни" начало второй структуры совпадает с первой, то можно сделать во второй в начале поле типа первой структуры и копировать его.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 7 2009, 12:00
Сообщение #10


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

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



Цитата(xelax @ Aug 7 2009, 10:01) *
Вообще копирование одних типов структур в другие, тем более через memcpy это рассадник ошибок
Да с Вами согласен и призываю оперировать в присвоении одинаковыми типами структур. Я лишь пытался донести во что транслируется строчка struct1 = struct2; при _одинаковых_ типах.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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