таблица смещений

Модератор: Модераторы разделов

agreed
Сообщения: 143
ОС: Fedora 10, Mac OS X 10.5

таблица смещений

Сообщение agreed »

Понадобилось, вот, решить доольно трудную программистскую задачку: есть ОГРОМНАЯ сишная структура (до девяти уровней вложенности). Собс-но нужно: ссылку или исходник программы, которая строит таблицу смещений для полей этой структуры (крайне желательно учитывать и выравнивание, однако, учитывая сложность задачи - это не обязательно). Должно быть что-то вроде этого:
На входе:

Код: Выделить всё

struct point
{
   int x;
   int y;
}

struct rect
{
   point pt1;
   point pt2;
}

struct cube
{
   rect r1;
   rect r2;
}


И на выходе:

Код: Выделить всё

r1.pt1.x -- 0
r1.pt1.y -- 4
r1.pt2.x -- 8
r1.pt2.y -- 12
.............

Возможно ли вообще решение? Заранее огромное спасибо...
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: таблица смещений

Сообщение oav »

(agreed @ Пятница, 08 Июля 2005, 0:51) писал(а):Понадобилось, вот, решить доольно трудную программистскую задачку: есть ОГРОМНАЯ сишная структура (до девяти уровней вложенности). Собс-но нужно: ссылку или исходник программы, которая строит таблицу смещений для полей этой структуры (крайне желательно учитывать и выравнивание, однако, учитывая сложность задачи - это не обязательно). Должно быть что-то вроде этого:
На входе:

Код: Выделить всё

struct point
{
   int x;
   int y;
}

struct rect
{
   point pt1;
   point pt2;
}

struct cube
{
   rect r1;
   rect r2;
}


И на выходе:

Код: Выделить всё

r1.pt1.x -- 0
r1.pt1.y -- 4
r1.pt2.x -- 8
r1.pt2.y -- 12
.............

Возможно ли вообще решение? Заранее огромное спасибо...


Ну в голову с бухты барахты пришел такой костыль - пишем на питоне ( и чем угодно) тулзу, которая на выходе формирует сишный исходник, в котором для каждого члена заданной структуры выводит в консоль его sizeof(aa) + offset. Offset растет с каждым членом. (в начале ноль и т.д.) Далее скармливаем это gcc и смотрим результат. Ну как?
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: таблица смещений

Сообщение flook »

Код: Выделить всё

struct xxx {
   int a;
   int b;
   int c;
};

#define offsetof(type, member) ((unsigned long)(char *)&((type *)0)->member)


Так?
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: таблица смещений

Сообщение oav »

(flook @ Пятница, 08 Июля 2005, 12:07) писал(а):

Код: Выделить всё

struct xxx {
   int a;
   int b;
   int c;
};

#define offsetof(type, member) ((unsigned long)(char *)&((type *)0)->member)


Так?

Если честно, не совсем понял этот макрос :) в смысле не что он делает, а как он будет использоваться.

Я имел в виду, что скриптовая прога сгенерит такой файл:

Код: Выделить всё

struct xxx {
   int a;
   int b;
   int c;
};

main()
{
  struct xxx item;
  unsigned long offset = 0,elem_size;


  elem_size = sizeof(item.a);
  printf( "xxx.a offset = %d, size = %d\n" , offset , elem_size );
  offset += elem_size;


  elem_size = sizeof(item.b);
  printf( "xxx.a offset = %d, size = %d\n" , offset , elem_size );
  offset += elem_size;


  elem_size = sizeof(item.c);
  printf( "xxx.a offset = %d, size = %d\n" , offset , elem_size );
  offset += elem_size;

/// и так далее
}

:rolleyes: :wacko:
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: таблица смещений

Сообщение flook »

Я написал как определить offset внутри структуры просто и безболезненно, а вот как написать скриптец... :) Пусть bash-ологи, perl-оводы и укротители python-ов подскажут ^_^
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали: