Структуры в С

Jun 27, 2006 Last reply: 19 years ago 40 Replies

Привет Alexander!

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

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

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

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.

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

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.

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

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

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

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

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

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

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

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

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

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

Привет, 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 ... Судьба в флаконе. Взбалтывать перед употреблением. прятать от детей и животных

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"

Привет, 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 ... Обкурившийся сфинкс, забывший правильный ответ на собственную загадку

Ве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ыдали.

Майкл

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

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

Привет, 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

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

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

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

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

Майкл

Ве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ыльях ночи.

Майкл

Привет, 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 ... Что-то странное тут творится.. Мы с тобой тут творимся.

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

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

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

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

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

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

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required