Добрый день!
Прошу прошения, если что не так, ведь это первая тема, будем, так сказать, учиться по ходу. Я уже давненько не брался за программирование на С++ (аж с 3–ого курса института), но тут судьба заставила и столкнулся с проблемой, суть которой в том что нужно по ходу программы определить структуру. Опишу подробнее:
У меня есть lib – файл, поставляемый разработчиком, и функции из него принимают в качестве параметра структуру, о которой до некоторого момента я ничего не знаю, но по её имени могу определить. При этом есть два варианта:
1. Я про неё узнаю до момента компиляции (определяю в коде);
2. Я про неё узнаю после сборки проекта (пользователь вводит имя).
После определения имени структуры я могу определить количество её членов, их тип и названия (хотя название особого смысла не несёт). Так вот каким образом я могу сгенерить эту структуру для передачи в функцию.
Заранее благодарю, за ответы.
Re: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>Добрый день! UF>Прошу прошения, если что не так, ведь это первая тема, будем, так сказать, учиться по ходу. Я уже давненько не брался за программирование на С++ (аж с 3–ого курса института), но тут судьба заставила и столкнулся с проблемой, суть которой в том что нужно по ходу программы определить структуру. Опишу подробнее: UF>У меня есть lib – файл, поставляемый разработчиком, и функции из него принимают в качестве параметра структуру, о которой до некоторого момента я ничего не знаю, но по её имени могу определить. При этом есть два варианта: UF>1. Я про неё узнаю до момента компиляции (определяю в коде); UF>2. Я про неё узнаю после сборки проекта (пользователь вводит имя). UF>После определения имени структуры я могу определить количество её членов, их тип и названия (хотя название особого смысла не несёт). Так вот каким образом я могу сгенерить эту структуру для передачи в функцию.
UF>Заранее благодарю, за ответы.
Гыгы, вам в жабу. В с++ такими вещами не занимаются
Re[2]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
05.04.07 14:31
Оценка:
К сожалению, с джавой не знаком, а вот сделать надо
Re: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>...Так вот каким образом я могу сгенерить эту структуру для передачи в функцию.
Для этого достаточно методом научного тыка исследовать платформо-зависимую реализацию расположения полей структуры в памяти, а по полученным релультатам написать код, который будет генерировать "вирутальную" структуру по её описанию.
Здравствуйте, ArtDenis, Вы писали:
AD>Для этого достаточно методом научного тыка исследовать платформо-зависимую реализацию расположения полей структуры в памяти
Имеется ввиду конечно общие принципы, по которым компилятор расставляет и выравнивает поля структуры
Здравствуйте, Garrrrr, Вы писали:
G>Гыгы, вам в жабу. В с++ такими вещами не занимаются
оффтоп, конечно, просто интересно — как такое делать в джаве? что, там можно в рантайме создать структуру и с ней работать как с обычной?
Re: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
05.04.07 18:16
Оценка:
продефайнить все варианты структуры и написать шаблонную функцию для работы с ней подойдет?
Re[2]: Каким образом можно динамически определить структуру?
Re[3]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
06.04.07 05:52
Оценка:
Здравствуйте, UncleFox, Вы писали:
UF>К сожалению нет, вариантов сотни.
А что с этими структурами делать Вы собираетесь? Вариантов может быть и сотни, а кирпичиков раз-два и обчелся:
— целое число
— число с плавающей точкой
— время
— деньги
— контейнер этих структур
Re: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>Добрый день! UF>Прошу прошения, если что не так, ведь это первая тема, будем, так сказать, учиться по ходу. Я уже давненько не брался за программирование на С++ (аж с 3–ого курса института), но тут судьба заставила и столкнулся с проблемой, суть которой в том что нужно по ходу программы определить структуру. Опишу подробнее: UF>У меня есть lib – файл, поставляемый разработчиком, и функции из него принимают в качестве параметра структуру, о которой до некоторого момента я ничего не знаю, но по её имени могу определить. При этом есть два варианта: UF>1. Я про неё узнаю до момента компиляции (определяю в коде); UF>2. Я про неё узнаю после сборки проекта (пользователь вводит имя). UF>После определения имени структуры я могу определить количество её членов, их тип и названия (хотя название особого смысла не несёт). Так вот каким образом я могу сгенерить эту структуру для передачи в функцию.
UF>Заранее благодарю, за ответы.
Каким образом вы узнаете кол-во членов структуры и их типы?
Re[2]: Каким образом можно динамически определить структуру?
Здравствуйте, Sm0ke, Вы писали: S>Каким образом вы узнаете кол-во членов структуры и их типы?
Дело в том, что структура, которую мне надо сгенерить — это описание таблицы, а ещё есть такая сущность как словарь, он по своей сути тоже является таблицей, но хранит данные о других таблицах, ключах и т.п..
Re[4]: Каким образом можно динамически определить структуру?
Здравствуйте, Аноним, Вы писали:
А>А что с этими структурами делать Вы собираетесь? Вариантов может быть и сотни, а кирпичиков раз-два и обчелся: А>- целое число А>- число с плавающей точкой А>- время А>- деньги А>- контейнер этих структур
На данный момент есть:
BTI_LONG;
BTI_ULONG
BTI_SINT;
BTI_WORD;
BTI_INT;
BTI_CHAR;
BTI_BYTE;
BTI_VOID;
+
структуры MONEY_STRUCT,DATE_STRUCT
Но это не исчерпывающий список
Re: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>Здравствуйте, Sm0ke, Вы писали: S>>Каким образом вы узнаете кол-во членов структуры и их типы?
UF>Дело в том, что структура, которую мне надо сгенерить — это описание таблицы, а ещё есть такая сущность как словарь, он по своей сути тоже является таблицей, но хранит данные о других таблицах, ключах и т.п..
Приведите минимальный код.
А то очень расплывчато получается...
Re[3]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
06.04.07 09:16
Оценка:
Здравствуйте, UncleFox, Вы писали:
UF>Здравствуйте, Аноним, Вы писали:
А>>Динамические деревья. А>>Данные в XML формате. А>>Сериализация данных в общем...
UF>Всёравно не понятно каким образом дерево или хмл станет Struct {...}; UF>Или я просто чего — то не догоняю?
Ты слишком зациклен на статическом определении данных.
Твоя задача вообще говоря довольно стандартна.
Тебе надо передать данные с динамической структурой,
а не struct {...};
Способов как это сделать — вагон.
Например с помощью односвязных списков:
enum MyListType
{
IntType,
DoubleType,
StringType,
};
struct MyList
{
void *pData; // указатель на элемент данных, хранимый в жанном узле
MyListType dataType; // идентификатор типа
MyBinTree *pNext; // указатель на следующий элемент списка.
}
С помощью такой нехитрой структуры ты сможешь передавать упорядоченные коллекции данных
произвольного типа...
Принимающей стороне надо будет просто научиться работать с данными в таком формате.
Понятно, что это всего лишь схема, но таким образом твою задачу решить можно.
Re[4]: Каким образом можно динамически определить структуру?
<skipped>
А>Ты слишком зациклен на статическом определении данных. А>Твоя задача вообще говоря довольно стандартна. А>Тебе надо передать данные с динамической структурой, А>а не struct {...}; А>Способов как это сделать — вагон. А>Например с помощью односвязных списков: А>
А>enum MyListType
А>{
А> IntType,
А> DoubleType,
А> StringType,
А>};
А>struct MyList
А>{
А> void *pData; // указатель на элемент данных, хранимый в жанном узле
А> MyListType dataType; // идентификатор типа
А> MyBinTree *pNext; // указатель на следующий элемент списка.
А> }
А>
А>С помощью такой нехитрой структуры ты сможешь передавать упорядоченные коллекции данных А>произвольного типа...
А>Принимающей стороне надо будет просто научиться работать с данными в таком формате. А>Понятно, что это всего лишь схема, но таким образом твою задачу решить можно.
тогда может уж лучше boost::tuple использовать?
Re[5]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
06.04.07 09:27
Оценка:
Здравствуйте, sc, Вы писали:
sc>тогда может уж лучше boost::tuple использовать?
Дак это уже детали...
Я просто привел схему, чтобы автор топика понял идею.
Re[5]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
06.04.07 09:29
Оценка:
Здравствуйте, UncleFox, Вы писали:
UF>На данный момент есть: UF>BTI_LONG; UF>BTI_ULONG UF>BTI_SINT; UF>BTI_WORD; UF>BTI_INT; UF>BTI_CHAR; UF>BTI_BYTE; UF>BTI_VOID; UF>+ UF>структуры MONEY_STRUCT,DATE_STRUCT UF>Но это не исчерпывающий список
Это явно не сотня. При этом боьшую часть этого дела можно зашаблонить.
Re[4]: Каким образом можно динамически определить структуру?
Я, конечно, попробую, но IMHO никакая динамика не прокатит, дело в том что на принимающую сторону никак не могу повлиять, это lib производителя. Притом, к принимаемой структуре он весьма чувствителен, если даже поменять два элемента в структуре местами, то он уже кричит и рухает .
Re[5]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
06.04.07 09:40
Оценка:
Здравствуйте, UncleFox, Вы писали:
UF>Я, конечно, попробую, но IMHO никакая динамика не прокатит, дело в том что на принимающую сторону никак не могу повлиять, это lib производителя. Притом, к принимаемой структуре он весьма чувствителен, если даже поменять два элемента в структуре местами, то он уже кричит и рухает .
Ну в этом случае у тебя нету вариантов.
Если ты пользуешься уже готовой библиотекой, то ты можешь ее использовать
только так, как предусмотрели разработчики.
Нету предмета для обсуждений...
Re[3]: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>Здравствуйте, Sm0ke, Вы писали: S>>Каким образом вы узнаете кол-во членов структуры и их типы?
UF>Дело в том, что структура, которую мне надо сгенерить — это описание таблицы, а ещё есть такая сущность как словарь, он по своей сути тоже является таблицей, но хранит данные о других таблицах, ключах и т.п..
Все равно ничего не понятно из того, что нужно получить. Хотя бы знать, в каком виде библиотека принимает данные и как их обрабатывает. Должен быть хоть какой-то намек на алгоритм, содержание и т. д.
А так можно рекордсет создать и писать туда все, что угодно.
Re[6]: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>У меня есть lib – файл, поставляемый разработчиком, и функции из него принимают в качестве параметра структуру, о которой до некоторого момента я ничего не знаю, но по её имени могу определить. При этом есть два варианта: UF>1. Я про неё узнаю до момента компиляции (определяю в коде); UF>2. Я про неё узнаю после сборки проекта (пользователь вводит имя). UF>После определения имени структуры я могу определить количество её членов, их тип и названия (хотя название особого смысла не несёт). Так вот каким образом я могу сгенерить эту структуру для передачи в функцию.
Может быть, так.
Создаёшь сущность "описание структуры", отвечающую (в рантайме) на вопросы:
— размер структуры в байтах
— количество полей
— смещения, типы, имена полей
На основе её можно сделать функции создания и доступа к массиву байтов как к произвольной структуре.
Что-то в таком роде
struct FieldInfo
{
string name;
int offset;
VAR_TYPE type; // набор констант VT_..., думаю, неплохо справится с этой рольюint const bytesize() const { /* функция от type */ }
// трактует массив байтов как число, со смещением offsetint get_int(char const* bytes) const { /* в зависимости от type - 1-, 2-, 4-байтное целое */ }
double get_double(char const* bytes) const { /* --"-- 4- или 8-байтное плавающее */ }
void set_int(char const* bytes, int value);
void set_double(char const* bytes, double value);
// и т.п.
};
struct StructInfo
{
int bytesize;
vector<FieldInfo> fields; // или multi_index, упорядоченный по name и по offsetvoid add(FieldInfo fi)
{
fi.offset = bytesize;
bytesize += fi.bytesize();
fields.push_back(fi);
}
};
class RuntimeStruct
{
shared_ptr<StructInfo const> m_si;
vector<char> m_bytes;
public:
explicit RuntimeStruct(shared_ptr<StructInfo const> si) : m_si(si), m_bytes(si->bytesize) {}
char const* bytes() const { return &m_bytes[0]); }
char * bytes() { return &m_bytes[0]); }
FieldInfo const& field(string name) const { /* поиск в m_si->fields по name; исключение, если не найдено */ }
int get_int(string name) const
{
return field(name).get_int(bytes());
}
double get_double(string name) const
{
return field(name).get_double(bytes());
}
.....
};
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: Каким образом можно динамически определить структуру?
Эта структура передаётся в качестве параметра в ф-ию из lib-а, но дело в том, что таких возможных структур более сотни, но по названию структуры, как я говорил, могу узнать и количество её членов, и тип, и названия. Так вот мне и надо сформировать структуру для передачи по ходу дела.
Re[5]: Каким образом можно динамически определить структуру?
От:
Аноним
Дата:
06.04.07 11:15
Оценка:
Здравствуйте, UncleFox, Вы писали:
UF>Вот пример одной из структур, которую правда пришлось пробить руками.
Тебе не на форуме надо стпрашивать, а документацию к библиотеке внимательно читать.
Еще можно прямо у разработчиков спросить.
Никто тут тебе не поможет решить твою проблему с помощью неизвестной библиотеки.
Если это известная библиотека, то надо именно про нее спрашивать.
Re[6]: Каким образом можно динамически определить структуру?
А>Тебе не на форуме надо стпрашивать, а документацию к библиотеке внимательно читать. А>Еще можно прямо у разработчиков спросить. А>Никто тут тебе не поможет решить твою проблему с помощью неизвестной библиотеки.
А>Если это известная библиотека, то надо именно про нее спрашивать.
Вопрос не о библиотеке, а о структуре и как её получить. И в названии написано: "Каким образом можно динамически определить структуру?". Разработчик сказал: в качестве параметра ф-ия получает структуру, и чего тут с ним обсуждать. А вот каким образом кодер это сделает, его (разработчика) не касается. Вот я и спросил о возможных вариантах. Я точно знаю, что такое есть, так как видел, как это работает в компании ... (нет места рекламе), но они само собой не откроют своих секретов.
Я не гуру в кодинге, вот и думаю, может, кто подскажет.
Re[7]: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
UF>Эта структура передаётся в качестве параметра в ф-ию из lib-а, но дело в том, что таких возможных структур более сотни, но по названию структуры, как я говорил, могу узнать и количество её членов, и тип, и названия. Так вот мне и надо сформировать структуру для передачи по ходу дела.
И в чем смысл формировать ее в рантайме?
Не лучше ли определить все структуры как положено в компайлтайме?
Re[7]: Каким образом можно динамически определить структуру?
Здравствуйте, UncleFox, Вы писали:
А>>Тебе не на форуме надо стпрашивать, а документацию к библиотеке внимательно читать. А>>Еще можно прямо у разработчиков спросить. А>>Никто тут тебе не поможет решить твою проблему с помощью неизвестной библиотеки.
А>>Если это известная библиотека, то надо именно про нее спрашивать.
UF>Вопрос не о библиотеке, а о структуре и как её получить. И в названии написано: "Каким образом можно динамически определить структуру?". Разработчик сказал: в качестве параметра ф-ия получает структуру, и чего тут с ним обсуждать. А вот каким образом кодер это сделает, его (разработчика) не касается. Вот я и спросил о возможных вариантах. Я точно знаю, что такое есть, так как видел, как это работает в компании ... (нет места рекламе), но они само собой не откроют своих секретов. UF>Я не гуру в кодинге, вот и думаю, может, кто подскажет.
Вопрос в том, что вы потом собираетесь делать с этими структурами. Ведь раз их 100 штук, то наверняка функция просто умеет делать 100 разных действий с разным набором аргументов. Я не знаю, почему разработчик решил сделать 1 функцию с таким вот полиморфным параметром, но прежде чем учиться генерировать эти структуры, вы должны четко представлять, чем вы их будете заполнять и как интерпетировать результаты работы функции.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.