|
Выравнивание структур и в структурах..., детский вопрос... |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 16)
|
Sep 16 2006, 13:09
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Спасибо, добрый человек... Конец моим мучениям. Структура структур: Код const struct { struct usb_st_configuration_descriptor cfg; struct usb_st_interface_descriptor ifc; struct usb_st_hid_descriptor hid; struct usb_st_endpoint_descriptor ep1; } usb_configuration = { /* CONFIGURATION */ { 0x9, CONFIGURATION, /* =2 */ CONF_LENGTH, /* длина всех дескрипторов */ 1, /* число интерфейсов */ CONF_NB, /* номер конфигурации */ 0, /* дескр. строки конфигур */ CONF_ATTRIBUTES, /* аттрибуты */ MAX_POWER /* 100 mA */ }, /* INTERFACE 0 */ {}, /* Дескриптор HID */ {}, /* Дескриптор первой конечной точки */ {} };
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Sep 16 2006, 13:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Чтоб не плодить тем, спрошу тут же... Может есть какой более простой метод преобразования строки в юникодовскую, чем что-то вроде этого: #define USB_PRODUCT_NAME1 {'T',0,'e',0,'s',0,'t',0,'b',0,'o',0,'a',0,'r',0,'d',0} Больно такой метод накаляет. З.Ы. это явно можно как-то решить с помошью define, но я не специалист. 6)
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Sep 16 2006, 14:31
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(Dron_Gus @ Sep 16 2006, 19:57)  #define USB_PRODUCT_NAME1 {'T',0,'e',0,'s',0,'t',0,'b',0,'o',0,'a',0,'r',0,'d',0} Больно такой метод накаляет.  А так? #define USB_PRODUCT_NAME1 L"Test board"
|
|
|
|
|
Sep 16 2006, 14:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Цитата(zltigo @ Sep 16 2006, 18:17)  Это следует понимать, что вариант оказался "очень простой" с #pragma pack( 1 ) ??? Не совсем понял, в каком смысле "очень простой"? Цитата(Alex03 @ Sep 16 2006, 18:31)  А так? #define USB_PRODUCT_NAME1 L"Test board" А что то за аргумент и где про них вообще можно почитать?
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Sep 16 2006, 15:14
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dron_Gus @ Sep 16 2006, 17:53)  Не совсем понял, в каком смысле "очень простой"? В том смысле, что физически ясный и везде описанный - т.е. лежащий на поверхности.. А вот если-бы выравнивание побайтно не сработало по какой-то причине, тогда поиск правильного синтаксиса, обходных путей и разборки с компилятором :-( Цитата А что то за аргумент и где про них вообще можно почитать? В описании языка, там где речь идет о том, как сказать компилятору из скольки бит состоит 'число' и сколько бит в 'Char'
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 16 2006, 20:19
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dron_Gus @ Sep 16 2006, 23:04)  Я еще начинающий... для меня на поверхности мало что пока лежит.  Ну во-первых три дня разбирались самостоятельно, во-вторых было упомянуто правильное слово выравнивание... Это уже совсем горячо, что и привело мня к мысли, что скорее всего не стоит поминать "#pragma pack" не уточнив проблемы. Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 18 2006, 05:31
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(zltigo @ Sep 17 2006, 02:19)  Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает. Я вот кстати не понимаю почему GCC для ARM push/pop не подерживет!  main.c:105: warning: #pragma pack(push[, id], <n>) is not supported on this target Притом не поддерживает именно push/pop, сам(а) #pragma pack(n) поддерживается. При этом насколько я понимаю от target-а push/pop никак не зависит, это чисто возможность компилятора, и если она есть например в x86 то почему нет в ARM. Подозреваю что те кто делали GCC-порт под ARM просто отключили эту столь полезную возможность. Притом и в GCC 3.x.x b и в 4.x.x. Абидна блин!
|
|
|
|
|
Sep 18 2006, 06:18
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(zltigo @ Sep 17 2006, 00:19)  Цитата(Dron_Gus @ Sep 16 2006, 23:04)  Я еще начинающий... для меня на поверхности мало что пока лежит.  Ну во-первых три дня разбирались самостоятельно, во-вторых было упомянуто правильное слово выравнивание... Это уже совсем горячо, что и привело мня к мысли, что скорее всего не стоит поминать "#pragma pack" не уточнив проблемы. Кстати, не забудьте вернуть обратно, правильнее всего через опции push/pop, если Ваш компилятор их поддерживает. Вопрос по этой же теме: объясните пожалуйста, а зачем нужны эти push/pop?
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 18 2006, 06:25
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Harvester @ Sep 18 2006, 09:18)  Вопрос по этой же теме: объясните пожалуйста, а зачем нужны эти push/pop? Восстановить состояние существовашее ДО Вашего изменения правила паковки структуры, причем НЕ ЗНАЯ его предыдущего состояния заданного, например, в командной строке компилятора, или что мног хуже :-) какой-нибудь галочкой в дебрях меню IDE.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Sep 18 2006, 06:59
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(zltigo @ Sep 18 2006, 10:25)  Цитата(Harvester @ Sep 18 2006, 09:18)  Вопрос по этой же теме: объясните пожалуйста, а зачем нужны эти push/pop?
Восстановить состояние существовашее ДО Вашего изменения правила паковки структуры, причем НЕ ЗНАЯ его предыдущего состояния заданного, например, в командной строке компилятора, или что мног хуже :-) какой-нибудь галочкой в дебрях меню IDE. А почему нельзя просто pack() - восстанавливает значение по-умолчанию?
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Sep 18 2006, 09:14
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(Harvester @ Sep 18 2006, 12:59)  А почему нельзя просто pack() - восстанавливает значение по-умолчанию? push/pop могут быть вложенные. Как правило эти модификаторы приписываются в *.h файлах, последовательность "инклудирования" и вложенность которых может быть всякой, а многие из них вообще от сторонних производителей. При этом далеко не все восстанавливают за собой упаковку. В общем push->код->pop (или push->код->push->код->pop->pop) - после себя ничего не меняют/оставляют (в плане упаковки) и ИМХО являются правилами хорошего стиля.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|