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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
> WinAVR обновился до 20081118rc2, Похоже, скоро релиз появится!
sonycman
сообщение Nov 25 2008, 09:51
Сообщение #31


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(singlskv @ Nov 25 2008, 03:49) *
Увы, у каждого компилятора свои фенечки... smile.gif

Да, можно попробовать копировать структуры/массивы циклом, а не передавать их по одному...

Скажите, а можно-ли копировать структуры таким образом:
Код
struct somestruct
{
    byte a;
    byte b;
    byte c;
    byte d;
    byte e;
    byte f;
} some;

byte size = sizeof(some);
byte * ps = (byte*)&some;
byte * pd = ...
while (size--) *pd++ = *ps++;

Или правильнее будет юзать массивы?
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 25 2008, 10:12
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(sonycman @ Nov 25 2008, 12:51) *
Скажите, а можно-ли копировать структуры таким образом:
...

Дык а чем стандартный memcpy не устраивает?
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 25 2008, 10:38
Сообщение #33


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(Непомнящий Евгений @ Nov 25 2008, 14:12) *
Дык а чем стандартный memcpy не устраивает?

Можно и memcpy. Вопрос не в том - правильно ли копировать структуры таким образом? С точки зрения языка С?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 25 2008, 10:51
Сообщение #34


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

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



Цитата(sonycman @ Nov 25 2008, 13:38) *
Можно и memcpy. Вопрос не в том - правильно ли копировать структуры таким образом? С точки зрения языка С?

Следует уяснить себе раз и навсегда, что структура или какой-либо иной объект не является таким уж абстрактным, а занимает конкретный блок той или иной памяти размером sizeof(object) выделенный под её хранение (представление). И если Вы осуществите перенос/копирование этого блока памяти любым алгоритмом - Вы скопируете/перенесёте и это нечто... А как копировать блок памяти на С не мне Вам объяснятьsmile.gif
while (size--) *dst++ = *src++; - тоже правильно


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
singlskv
сообщение Nov 25 2008, 11:15
Сообщение #35


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(sonycman @ Nov 25 2008, 12:51) *
Да, можно попробовать копировать структуры/массивы циклом, а не передавать их по одному...

Скажите, а можно-ли копировать структуры таким образом:
Или правильнее будет юзать массивы?
Можно по любому, я в своем примере просто показал что если сделать
внешнюю функцию копирования и передавать указатель на буфер и на структуру,
то gcc даже при перемешивании полей структуры в буфере будет делать
компактный код:
Код
*pd++ = p->b1;
  6a:    89 81           ldd    r24, Y+1; 0x01
  6c:    81 93           st    Z+, r24
  *pd++ = p->b5;
  6e:    8f 81           ldd    r24, Y+7; 0x07
  70:    81 93           st    Z+, r24

то есть вобще без LDS и STS и с использованием 2x указателей.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2008, 15:40
Сообщение #36


Гуру
******

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



Цитата(demiurg_spb @ Nov 25 2008, 12:51) *
while (size--) *dst++ = *src++; - тоже правильно
А если быть точно уверенным, что размер структуры никогда не будет равным нулю, то можно и do *dst++ = *src++; while (--size); - код должен быть еще компактнее.


--------------------
На любой вопрос даю любой ответ
"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
Rst7
сообщение Nov 25 2008, 16:04
Сообщение #37


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(Сергей Борщ @ Nov 25 2008, 17:40) *
А если быть точно уверенным, что размер структуры никогда не будет равным нулю, то можно и do *dst++ = *src++; while (--size); - код должен быть еще компактнее.

Все хорошо, только если size типа char, то в этом гнусе все ломается (подробности в теме про сборки klen'а, этот гнусь тоже поломатый sad.gif ). К циклу с итератором размером 2 байта тоже есть вопросы.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sonycman
сообщение Nov 25 2008, 17:27
Сообщение #38


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(demiurg_spb @ Nov 25 2008, 14:51) *
Следует уяснить себе раз и навсегда, что структура или какой-либо иной объект не является таким уж абстрактным, а занимает конкретный блок той или иной памяти размером sizeof(object) выделенный под её хранение (представление).

Это всё понятно. Но дело в том, что эти данные будут копироваться на PC в подобные им структуры.
Есть-ли гарантия того, что размер этих структур будет одинаков?
Особенно, если в структуре будут различные размеру данные?
И особенно, если учесть, что программы написаны в разных компиляторах...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 25 2008, 20:30
Сообщение #39


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

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



Цитата(sonycman @ Nov 25 2008, 20:27) *
Это всё понятно. Но дело в том, что эти данные будут копироваться на PC в подобные им структуры.
Есть-ли гарантия того, что размер этих структур будет одинаков?
Особенно, если в структуре будут различные размеру данные?
И особенно, если учесть, что программы написаны в разных компиляторах...
Совершенно неважно какой компилятор Вы используете.
В каждом из них имеются свои средства задающие размер блока на который происходит выравнивание полей структуры.
К примеру для borland'a можно использовать прагмы или задавать через параметры проекта.
Код
#pragma pack(push,1)  // Выравнивание полей структур = 1 байт.

typedef struct
{
    float Amplifier[3];
    float Bias[3];
} TInputConfig;

#pragma pack(pop) // возврат к выравниванию "по умолчанию"

Цитата(Сергей Борщ @ Nov 25 2008, 18:40) *
А если быть точно уверенным, что размер структуры никогда не будет равным нулю, то можно и do *dst++ = *src++; while (--size); - код должен быть еще компактнее.
Но быть точно уверенным не всегда получается, а так я с Вами полностью согласен.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Nov 26 2008, 06:43
Сообщение #40


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Цитата(Сергей Борщ @ Nov 25 2008, 18:40) *
А если быть точно уверенным, что размер структуры никогда не будет равным нулю ...


Насколько я понимаю, размер структуры никогда не будет равен 0.
Размер пустой структуры struct A {}; - 1 байт. Сделано для того, чтобы не порушить операции с указателями на массиве таких структур.

Оптимизация пустых структур идет в некоторых случаях в С++ при наследовании.
например,
struct A {};
struct B : A {};
обычно за счет такой оптимизации sizeof( B )==sizeof( A ).
Go to the top of the page
 
+Quote Post
Serjio
сообщение Dec 10 2008, 17:12
Сообщение #41


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

Группа: Свой
Сообщений: 137
Регистрация: 3-09-04
Пользователь №: 594



Зарелизили http://sourceforge.net/projects/winavr/
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 11 2008, 01:50
Сообщение #42


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(sonycman @ Nov 25 2008, 19:27) *
Есть-ли гарантия того, что размер этих структур будет одинаков?

Размер одной и той же структуры может изменяться взависимости от правил выравнивания (Alignment). Для 8-ми битных процов каковым есть AVR - выравнивание обычно - 1 (на границу байта).
А вот на PC выравнивание может быть 4 (на границу DWORD, Win32), 2 (WORD под DOS), 8 (QWORD под Win64).
В многих компиляторах (не только C и C++) выравнивание полей на границу байта задается ключевым словом packed/__packed. например:

__packed struct tagSOME_STRUCT
{
....
} ...;

Но может задаваться и по-другому, см. описание конкретного компилятора на тему как задать выравнивание струтуры (ключевые слова для поиска "Alignment/Align/Pack/Packed").
Go to the top of the page
 
+Quote Post

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

 


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


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