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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.