Структуры в С

Привет Alexander!

02 Jul 06 11:42, Arcady Schekochikhin писал Alexander Zholtkovsky:

htons(), ntohs(), htonl(), ntohl(), и каждое поле структуры вкладывать индивидуально.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... В главной роли - Сильвестр с талоном.

Reply to
Alex Mogilnikov
Loading thread data ...

Hi Nickita A Startcev!

AZ> Полезные макросы, а вот объясните мне как лучше всего складывать AZ> структуру в пакет для передачи? memcpy(buf,(uint8_t*)MyStruct, AZ> sizeof(MyStruct)) прокатывает если принимающая сторона имеет такую же AZ> архитектуру и скомпилена тем же компилятором.

AZ> А как быть если с одной стороны AVR, а с другой PC?

NAS> #pragma pack (push,1) NAS> struct... NAS> #pragma pack pop NAS> для выравнивания.

Это видимо для IAR-а? Так мне надо общий случай для голого Це.

NAS> Описать в документации порядок передачи байтов, но это на тот случай, NAS> если на NAS> том конце может оказаться что-то BE.

Это конечно описано.

Reply to
Alexander Zholtkovsky

Hello Alexander.

Mon Jul 03 2006 12:09, Alexander Zholtkovsky wrote to Nickita A Startcev:

NAS>> #pragma pack (push,1) NAS>> struct... NAS>> #pragma pack pop NAS>> для выравнивания.

AZ> Это видимо для IAR-а? AZ> Так мне надо общий случай для голого Це.

Hету в голом Цэ модификатора packed. Да и в плюсах, кажется, тоже.

Dimmy.

Reply to
Dimmy Timchenko

Ну как же, есть всякий htonl - ntohl и htons - ntohs, а вообще лучше на AVR (или другой системе с маленькими ресурсами) передавать/принимать как ей удобно, а разбираться на стороне PC.

Reply to
Anton Fedorov

Заморочки есть и не только для x86, и их на самом деле ГОРАЗДО БОЛЬШЕ.

Достаточно простой и надёжный способ -- на одном конце выдавать printf'ом, а на другом загружать scanf'ом. Сложно сказать, где бы не работало.

Или выдавать в выходной поток ПОБАЙТНО. Для каждого используемого типа данных вручную пишется "сериализатор" в байтовый поток. Все остальные методы -- абсолютное зло. Имеется ввиду т.н. "упакованные структуры" и т.п.

Reply to
Kirill Frolov

Это решает проблему с представлением типов в памяти.

Э. Таненбаум, "Современные операционные системы"

Э. Таненбаум, М. Ван-Стеен, "Распределённые системы, принципы и парадигмы"

У. Стивенс, "Unix, разработка сетевых приложений"

А. Робачевский, "Операционная система Unix"

У. Стивенс, "Unix, взаимодействие процессов".

Reply to
Kirill Frolov

Привет, Alexander !

03 Jul 06 , 12:09 Alexander Zholtkovsky писал к Nickita A Startcev:

AZ>> Полезные макросы, а вот объясните мне как лучше всего складывать AZ>> структуру в пакет для передачи? memcpy(buf,(uint8_t*)MyStruct, AZ>> sizeof(MyStruct)) прокатывает если принимающая сторона имеет AZ>> такую же архитектуру и скомпилена тем же компилятором.

AZ>> А как быть если с одной стороны AVR, а с другой PC?

NAS>> #pragma pack (push,1) NAS>> struct... NAS>> #pragma pack pop NAS>> для выравнивания.

AZ> Это видимо для IAR-а?

не.

AZ> Так мне надо общий случай для голого Це.

общего случая нет, но в реальности большинство компиляторов поддерживают #pragma pack 1

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... Судьба в флаконе. Взбалтывать перед употреблением. прятать от детей и животных

Reply to
Nickita A Startcev

Tue Jul 04 2006 08:56, Nickita A Startcev wrote to Alexander Zholtkovsky:

AZ>>> Полезные макросы, а вот объясните мне как лучше всего складывать AZ>>> структуру в пакет для передачи? memcpy(buf,(uint8_t*)MyStruct, AZ>>> sizeof(MyStruct)) прокатывает если принимающая сторона имеет AZ>>> такую же архитектуру и скомпилена тем же компилятором.

Ручками отдельно для каждого типа данных.

ptr = buf;

*ptr++ = byte1(Struct.data16); *ptr++ = byte0(Struct.data16);

*ptr++ = byte3(Struct.data32);

*ptr++ = byte2(Struct.data32); *ptr++ = byte1(Struct.data32); *ptr++ = byte0(Struct.data32);

и так далее.

Все прочие варианты - поиск проблем на собственную задницу.

"Resistance is futile"

Reply to
Yuriy K

Привет, Yuriy !

08 Jul 06 , 16:57 Yuriy K писал к Nickita A Startcev:

AZ>>>> Полезные макросы, а вот объясните мне как лучше всего AZ>>>> складывать структуру в пакет для передачи? AZ>>>> memcpy(buf,(uint8_t*)MyStruct, sizeof(MyStruct)) прокатывает AZ>>>> если принимающая сторона имеет такую же архитектуру и AZ>>>> скомпилена тем же компилятором.

YK> Ручками отдельно для каждого типа данных.

YK> ptr = buf;

YK> *ptr++ = byte1(Struct.data16); YK> *ptr++ = byte0(Struct.data16);

YK> *ptr++ = byte3(Struct.data32); YK> *ptr++ = byte2(Struct.data32); YK> *ptr++ = byte1(Struct.data32); YK> *ptr++ = byte0(Struct.data32);

YK> и так далее.

YK> Все прочие варианты - поиск проблем на собственную задницу.

Есть еще "беспроблемный вариант" - посылать аскии текстом. "val1=666,val2=7.40"б, Итп.

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... Обкурившийся сфинкс, забывший правильный ответ на собственную загадку

Reply to
Nickita A Startcev

Веpишь ли Вы в жизнь после топки, Nickita? Сpеда Июль 19 2006 10:03, Nickita A Startcev wrote to Yuriy K:

YK>> *ptr++ = byte3(Struct.data32); YK>> *ptr++ = byte2(Struct.data32); YK>> *ptr++ = byte1(Struct.data32); YK>> *ptr++ = byte0(Struct.data32); YK>> и так далее. YK>> Все пpочие ваpианты - поиск пpоблем на собственнyю задницy. NS> Есть еще "беспpоблемный ваpиант" - посылать аскии текстом. NS> "val1=666,val2=7.40"б, Итп.

Угy. Только в pеальной жизни такие ваpианты обычно идyт лесом :) Мне очень понpавилась pеализация printf в VisualDSP. Довольно пpиличная, вpоде как pаботает, пpи вызове printf("ля-ля-ля\n") из пpоги для BlackFin загpyженной в отладочнyю доскy полyчаешь это самое ля-ля-ля в окошке отладчика. Кpyто? Кpyто, и даже может быть yдобно. Только когда printf("%f",sin(3.14)) на дефолтной конфигypации доски выдал, что недостаточно памяти в сегменте кода, мы с коллегами дpyжно pыдали.

Майкл

Reply to
Michael Mamaev

Над чем рыдали?

Часто поддержка плавающей точки включается отдельно и если не нужна, то и память не занимает.

Reply to
Kirill Frolov

Привет, Michael !

20 Jul 06 , 19:47 Michael Mamaev писал к Nickita A Startcev:

MM> Угy. Только в pеальной жизни такие ваpианты обычно идyт лесом :) MM> Мне очень понpавилась pеализация printf

А мне printf вообще не нравится. :) в околоэхотажных местах предпочитаю использовать putc, print_string, print_int.

MM> в VisualDSP. Довольно MM> пpиличная, вpоде как pаботает, пpи вызове printf("ля-ля-ля\n") из MM> пpоги для BlackFin загpyженной в отладочнyю доскy полyчаешь это самое MM> ля-ля-ля в окошке отладчика. Кpyто? Кpyто, и даже может быть MM> yдобно. Только когда printf("%f",sin(3.14)) на дефолтной конфигypации MM> доски выдал, что недостаточно памяти в сегменте кода, мы с коллегами MM> дpyжно pыдали.

А просто на sin(3,14) места хватало? :)

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... Шурупы с головкой под ключ на 24

Reply to
Nickita A Startcev

Но третий десяток лет никакой адекватной замены ему не предложено.

Reply to
Kirill Frolov

мало того - ярые бойцы с наследием С в виде printf - Java - в версии 1.5 просто поменяли сам синтаксис языка - добавили вызовы с переменным числом папаметров - лишь бы только суметь реализовать printf.

Reply to
Arcady Schekochikhin

Веpишь ли Вы в жизнь после топки, Kirill? Пятница Июль 21 2006 21:16, Kirill Frolov wrote to Michael Mamaev:

KF> Часто поддеpжка плавающей точки включается отдельно и если не KF> нyжна, то и память не занимает. Это хоpошо, что Вы такой yмный. Жаль только что не догадались, что sin(...) я написал именно потомy, что именно его pаботоспособность меня интеpесовала.

Майкл

Reply to
Michael Mamaev

Веpишь ли Вы в жизнь после топки, Nickita? Сyббота Июль 22 2006 13:50, Nickita A Startcev wrote to Michael Mamaev:

MM>> Угy. Только в pеальной жизни такие ваpианты обычно идyт лесом :) MM>> Мне очень понpавилась pеализация printf NS> А мне printf вообще не нpавится. :) NS> в околоэхотажных местах пpедпочитаю использовать putc, print_string, NS> print_int. Hy дык, то доска, а то - pеальная железка... Хотя я тyт yже наyчился хоpошо овеpлеи делать, можно попытаться и printf подгpyжать если найти безглючный сишный исходник pазyмного pазмеpа.

MM>> доски выдал, что недостаточно памяти в сегменте кода, мы с MM>> коллегами дpyжно pыдали. NS> А пpосто на sin(3,14) места хватало? :)

Еще как. Сам понимаешь, он за собой тащит половинy флоатовой либы, но лезет очень даже неплохо. Кстати, эмyляция аpифметики двойной точности в нынешней веpсии библиотеки написана на сях... Ужос на кpыльях ночи.

Майкл

Reply to
Michael Mamaev

Привет, Arcady !

23 Jul 06 , 14:54 Arcady Schekochikhin писал к Kirill Frolov:

AS> мало того - ярые бойцы с наследием С в виде printf - Java - в версии AS> 1.5 просто поменяли сам синтаксис языка - добавили вызовы с переменным AS> числом папаметров - лишь бы только суметь реализовать printf.

а что, в жабе нет аналога плюсавых cout << "переменная аа равна" << aa <<endl; ? (хотя у потоков другие проблемы лезут).

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... Что-то странное тут творится.. Мы с тобой тут творимся.

Reply to
Nickita A Startcev

Из библиотеки hitech. Можно конечно ещё в newlib или gnu libc полезть, но на счёт размера сомневаюсь...

Ибо двойная точность мало кому в действительности нужна.

Reply to
Kirill Frolov

А я думал -- над собой.

printf("%d.%u", ...)

Собственно и сам sin() можно в целых числах посчитать. Хоть таблично, хоть кордиком. Если таблично и значения выбираются последоватльно, то таблицу очень удобно в "сжатом" виде (разности) хранить -- занимает совсем не много. Если конечно точность высокая не нужна.

Reply to
Kirill Frolov

Даже этого нет - весь ввод-вывод был по типу паскаля - по отдельной функции на тип. В джаве нет перезагрузки операторов - есть автопреобразование в конструкции String+integer например - просто гнусный хак.

Reply to
Arcady Schekochikhin

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.