Структуры в С

Уважаемый All! Не знает ли кто, как простым способом получить смещение элемента в структуре на С? То есть, например, имеем описание:

struct test { char a,b; int c; char d[10]; }

Как получить в общем виде смещение элементов c или d[3] относительно начала структуры?

Для конкретной переменной это типа понятно: можно просто получить указатель на элемент. А в общем виде?

С уважением, Сергей

Reply to
Sergey G. Shipilov
Loading thread data ...

(unsigned) &((struct test)NULL)->d[3] == 7 && puts ("embedded system") || puts ("PC computer");

Reply to
Kirill Frolov

Hello Kirill.

Tue Jun 27 2006 19:15, Kirill Frolov wrote to Sergey G. Shipilov:

KF> (unsigned) &((struct test)NULL)->d[3] == 7 && puts ("embedded system") KF> || puts ("PC computer");

Вот из-за таких, как ты, язык Си и пользуется дурной славой. :)

Dimmy.

Reply to
Dimmy Timchenko

Hello Sergey.

27 Jun 06 16:24, Sergey G. Shipilov wrote to all:

SS> Hе знает ли кто, как простым способом получить SS> смещение элемента в структуре на С? SS> То есть, например, имеем описание:

SS> struct test { SS> char a,b; SS> int c; SS> char d[10]; SS> }

SS> Как получить в общем виде смещение элементов SS> c или d[3] относительно начала структуры?

гугл уже не работает ?

formatting link
Dmitry

Reply to
Dmitry Lyokhin

Привет, Sergey !

27 Jun 06 , 16:24 Sergey G. Shipilov писал к All:

SGS> Hе знает ли кто, как простым способом получить SGS> смещение элемента в структуре на С? SGS> То есть, например, имеем описание:

SGS> struct test { SGS> char a,b; SGS> int c; SGS> char d[10]; SGS> }

SGS> Как получить в общем виде смещение элементов SGS> c или d[3] относительно начала структуры?

SGS> Для конкретной переменной это типа понятно: SGS> можно просто получить указатель на элемент. SGS> А в общем виде?

эээ... а в чем проблема?

test a; ... printf("offset of d[3] is %i\n", ((char*)&a.d[3])-((char*)(&a)) );

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... 2B or not 2B = FFFFFFFF

Reply to
Nickita A Startcev

"Dmitry Lyokhin" snipped-for-privacy@p56.f.n5033.z2.fidonet.org> сообщил/сообщила в новостях следующее: news: snipped-for-privacy@p56.f.n5033.z2.ftn...

Гугл, конечно, работает, когда знаешь, что искать... ;-)))

Спасибо!

С уважением, Сергей

Reply to
Sergey G. Shipilov

"Nickita A Startcev" snipped-for-privacy@p19.f.n5030.z2.fidonet.org> сообщил/сообщила в новостях следующее: news: snipped-for-privacy@p19.f.n5030.z2.ftn...

Так я и говорю - для конкретной, объявленной переменной - никаких проблем... Речь шла о получении смещения в ТИПЕ... А этот вопрос великолепно освещен в статье

formatting link
, за ссылку на которую вечная благодарность Dmitry Lyokhin . ;-)))

С уважением, Сергей

Reply to
Sergey G. Shipilov

Кстати да. У этого способа зарыты хитрые грабли, которые в каких-то очень исключительных случаях проявляются. Вот не помню в каких. :-( Так что лучше offsetof(), оно хоть на целевой платформе точно работает, если конечно есть.

Reply to
Kirill Frolov

Hi Dimmy!

27 Jun 06 20:22, Dimmy Timchenko wrote to Kirill Frolov:

KF>> (unsigned) &((struct test)NULL)->d[3] == 7 && puts ("embedded KF>> system") || puts ("PC computer");

DT> Вот из-за таких, как ты, язык Си и пользуется дурной славой. :)

Это фигня по сравнению вот с этим кодом:

formatting link
я даже не пытался понять что там где, но эта программа компилируется, и эти 3,5кб сишного текста действительно играют в шахматы. :)

Slav.

Reply to
Slav Matveev

offsetof() именно примерно так и определен - чуток разве покрасивше -

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

Reply to
Arcady Schekochikhin

Hello Kirill.

Thu Jun 29 2006 12:29, Kirill Frolov wrote to me:

KF> Так что лучше offsetof(), оно хоть на целевой платформе точно KF> работает, если конечно есть.

Кстати, в Аде определено не помню сколько, но больше десятка таких встроенных "функций времени компиляции", называемых атрибутами. А в C/C++, по сути, только одна - sizeof.

Dimmy.

Reply to
Dimmy Timchenko

Slav,

You wrote to Dimmy Timchenko:

KF>>> (unsigned) &((struct test)NULL)->d[3] == 7 && puts ("embedded KF>>> system") || puts ("PC computer"); DT>> Вот из-за таких, как ты, язык Си и пользуется дурной славой. :) SM> Это фигня по сравнению вот с этим кодом: SM>

formatting link
SM> я даже не пытался понять что там где, но эта программа SM> компилируется, и эти 3,5кб сишного текста действительно SM> играют в шахматы. :)

Дурилка это... картонная. В смысле сначала всё написано нормальным общепринятым форматом, а потом "круто" ужали исходник.

Andrey

Reply to
Andrey Arnold

typeof() ещё.

Reply to
Kirill Frolov

А я еще пользуюсь таким

#define lengthof(m) (sizeof(m) / sizeof(m[0]))

возвращает количество элементов в массиве m

Reply to
Anton Fedorov

Hi Anton Fedorov!

afr> А я еще пользуюсь таким

afr> #define lengthof(m) (sizeof(m) / sizeof(m[0]))

afr> возвращает количество элементов в массиве m

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

А как быть если с одной стороны AVR, а с другой PC? На PC есть же всякие выравнивания и прочие заморочки для x86.

Reply to
Alexander Zholtkovsky

Привет, Alexander !

01 Jul 06 , 12:07 Alexander Zholtkovsky писал к Anton Fedorov:

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

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

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

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

AZ> Hа PC есть же всякие выравнивания и прочие заморочки для x86.

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... Гринписовцы - это жители GreenPeace'ской трясины

Reply to
Nickita A Startcev

ascii - работает всегда или rpc

Reply to
Arcady Schekochikhin

Hi Arcady Schekochikhin!

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

А толку? Всё равно надо разбирать пришедшую строку и раскладывать по структуре для дальнейшего использования.

zpc> или rpc

Расскажите в двух словах что это?

Reply to
Alexander Zholtkovsky

izvini za translit zato vsegda rabotaet - zaodno podumaesh - a ono tebe nado? plus - plavayushchie imeyut raznoe predstavlenie.

remote procedure call - dlya chego imeetsa specialnyj standart XDR opisyvayuschiy kak dannye kodirovat chtoby na drugoy storone mogli vsegda prochest - naprimer

formatting link

Reply to
Arcady Schekochikhin

Hi Arcady Schekochikhin!

zpc> izvini za translit zpc> zato vsegda rabotaet - zaodno podumaesh - a ono tebe nado? plus - zpc> plavayushchie imeyut zpc> raznoe predstavlenie.

Да я так и делаю. Просто я думал есть какие-то более красивые и простые способы, видимо нет.

Reply to
Alexander Zholtkovsky

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.