URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5165
[ Назад ]

Исходное сообщение
"структуры в памяти"

Отправлено ghost_in_machine , 22-Фев-06 13:44 
Здравствуйте! Вопрос касается размещения полей структур в памяти. Я хочу создать функцию для поиска данных в массиве (произвольных) структур, заданных в общем виде как void*. А как задать поле для поиска? В текущем варианте я использую смещение от начала структуры в массиве и длину поля. Но это неудобно т.к. иногда поля приходиться переставляться, что приводит к трудно выводимым ошибкам глубоко в коде программы, кроме того, несколько нелогичным выглядит самому указывать размер поля и размер структуры данного типа, ведь компилятор сам знает о них в каждом конкретном случае. Может кто подскажет, как сделать правильно? Спасибо.

Содержание

Сообщения в этом обсуждении
"структуры в памяти"
Отправлено chip , 22-Фев-06 15:30 
>Здравствуйте! Вопрос касается размещения полей структур в памяти. Я хочу создать функцию
>для поиска данных в массиве (произвольных) структур, заданных в общем виде
>как void*. А как задать поле для поиска? В текущем варианте
>я использую смещение от начала структуры в массиве и длину поля.
>Но это неудобно т.к. иногда поля приходиться переставляться, что приводит к
>трудно выводимым ошибкам глубоко в коде программы, кроме того, несколько нелогичным
>выглядит самому указывать размер поля и размер структуры данного типа, ведь
>компилятор сам знает о них в каждом конкретном случае. Может кто
>подскажет, как сделать правильно? Спасибо.

Как вариант, использовать макрос offsetof .


"структуры в памяти"
Отправлено ghost_in_machine , 22-Фев-06 17:58 
Хороший макрос, спасибо!


"структуры в памяти"
Отправлено dimus , 28-Фев-06 07:22 
Еще вариант - есть две структуры: структура фиксированного размера вида
struct NODE
{
   struct NODE* next;  // Следующий элемент списка. Если это массив, то ненужен
   int data_type;      // Тип сохраненных данных
   void* data;         // Указатель на сохраненные данные
}

Сохраненные данные могут быть любыми. Для них есть два условия:
1. Данные должны быть такого типа, который известен и их тип помещаться в dada_type
2. Должен быть зарезервирован тип данных "ПУСТЫЕ ДАННЫЕ"

При таком типе хранения довольно просто выполнять поиск, сортировку и т.п. для любых типов данных. Вобщем, это попытка на С сделать некое подмножество RTTI