|
WinAVR обновился до 20081118rc2, Похоже, скоро релиз появится! |
|
|
|
Nov 25 2008, 09:51
|

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

|
Цитата(singlskv @ Nov 25 2008, 03:49)  Увы, у каждого компилятора свои фенечки...  Да, можно попробовать копировать структуры/массивы циклом, а не передавать их по одному... Скажите, а можно-ли копировать структуры таким образом: Код 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++; Или правильнее будет юзать массивы?
|
|
|
|
|
Nov 25 2008, 11:15
|
дятел
    
Группа: Свой
Сообщений: 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 указателей.
|
|
|
|
|
Nov 25 2008, 17:27
|

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

|
Цитата(demiurg_spb @ Nov 25 2008, 14:51)  Следует уяснить себе раз и навсегда, что структура или какой-либо иной объект не является таким уж абстрактным, а занимает конкретный блок той или иной памяти размером sizeof(object) выделенный под её хранение (представление). Это всё понятно. Но дело в том, что эти данные будут копироваться на PC в подобные им структуры. Есть-ли гарантия того, что размер этих структур будет одинаков? Особенно, если в структуре будут различные размеру данные? И особенно, если учесть, что программы написаны в разных компиляторах...
|
|
|
|
|
Nov 25 2008, 20:30
|

неотягощённый злом
     
Группа: Свой
Сообщений: 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); - код должен быть еще компактнее. Но быть точно уверенным не всегда получается, а так я с Вами полностью согласен.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 26 2008, 06:43
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Сергей Борщ @ Nov 25 2008, 18:40)  А если быть точно уверенным, что размер структуры никогда не будет равным нулю ... Насколько я понимаю, размер структуры никогда не будет равен 0. Размер пустой структуры struct A {}; - 1 байт. Сделано для того, чтобы не порушить операции с указателями на массиве таких структур. Оптимизация пустых структур идет в некоторых случаях в С++ при наследовании. например, struct A {}; struct B : A {}; обычно за счет такой оптимизации sizeof( B )==sizeof( A ).
|
|
|
|
|
Dec 11 2008, 01:50
|

кекс
     
Группа: Свой
Сообщений: 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").
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|