Структуры в С

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

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



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



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



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



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


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

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.

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

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

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

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

Спасибо!

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

"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 . ;-)))

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

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

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.

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

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

Hello Kirill.

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

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

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

Dimmy.

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

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

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

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

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.

Привет, 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'ской трясины

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

Hi Arcady Schekochikhin!

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

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

zpc> или rpc

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

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

Hi Arcady Schekochikhin!

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

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

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required