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]: Каким образом можно динамически определить структуру?
От: UncleFox  
Дата: 06.04.07 09:36
Оценка:
Я, конечно, попробую, но IMHO никакая динамика не прокатит, дело в том что на принимающую сторону никак не могу повлиять, это lib производителя. Притом, к принимаемой структуре он весьма чувствителен, если даже поменять два элемента в структуре местами, то он уже кричит и рухает .
Re[5]: Каким образом можно динамически определить структуру?
От: Аноним  
Дата: 06.04.07 09:40
Оценка:
Здравствуйте, UncleFox, Вы писали:

UF>Я, конечно, попробую, но IMHO никакая динамика не прокатит, дело в том что на принимающую сторону никак не могу повлиять, это lib производителя. Притом, к принимаемой структуре он весьма чувствителен, если даже поменять два элемента в структуре местами, то он уже кричит и рухает .


Ну в этом случае у тебя нету вариантов.
Если ты пользуешься уже готовой библиотекой, то ты можешь ее использовать
только так, как предусмотрели разработчики.
Нету предмета для обсуждений...
Re[3]: Каким образом можно динамически определить структуру?
От: vpavel  
Дата: 06.04.07 10:44
Оценка:
Здравствуйте, UncleFox, Вы писали:

UF>Здравствуйте, Sm0ke, Вы писали:

S>>Каким образом вы узнаете кол-во членов структуры и их типы?

UF>Дело в том, что структура, которую мне надо сгенерить — это описание таблицы, а ещё есть такая сущность как словарь, он по своей сути тоже является таблицей, но хранит данные о других таблицах, ключах и т.п..


Все равно ничего не понятно из того, что нужно получить. Хотя бы знать, в каком виде библиотека принимает данные и как их обрабатывает. Должен быть хоть какой-то намек на алгоритм, содержание и т. д.

А так можно рекордсет создать и писать туда все, что угодно.
Re[6]: Каким образом можно динамически определить структуру?
От: UncleFox  
Дата: 06.04.07 10:58
Оценка:
А>Это явно не сотня. При этом боьшую часть этого дела можно зашаблонить.

Это возможные типы полей структуры, а самих структур сотня
Re[4]: Каким образом можно динамически определить структуру?
От: UncleFox  
Дата: 06.04.07 11:03
Оценка:
Вот пример одной из структур, которую правда пришлось пробить руками.

typedef struct
{
    BTI_ULONG Lo;
    BTI_ULONG Hi;
} RS_MONEY_STRUCT;

typedef struct
{
    /*unsigned char*/BTI_BYTE day ;           /* Day of month */
    /*unsigned char*/BTI_BYTE mon ;           /* Month */
    /*unsigned short int*/BTI_WORD year ;     /* Year (4-digit) */  
} RS_DATE_STRUCT;

typedef struct
{
    BTI_LONG Referenc;               //LONG        4 Уникальный первичный идентификатор
    BTI_LONG CodClient;              //LONG        4 Код клиента
    BTI_SINT IsCur;              //INT         2 Признак валюты
    BTI_SINT FNCash;                  //INT         2 Номер кассы
    BTI_CHAR Account[26];            //STRING     26 Номер лицевого счета
    BTI_CHAR Open_Close;             //CHR         1 Флаг "Открыт-Закрыт"
    BTI_SINT Oper;                    //INT         2 Операционист
    BTI_CHAR GroupNumb[13];          //STRING     13 Группа нумерации
    BTI_CHAR Type_Account[13];       //STRING     13 Тип вклада
    BTI_LONG Number;                 //LONG        4 Порядковый номер внутри группы
    BTI_CHAR SvodAccount[26];        //STRING     26 Номер договора
    BTI_SINT Code_Currency;           //INT         2 Код валюты
    BTI_LONG NumSession;             //LONG        4 Номер сессии последней выгрузки
    BTI_BYTE Reserve0;               //UCHR        1
    RS_MONEY_STRUCT Sum_Out;         //MONEY       8 Расход
    RS_MONEY_STRUCT Sum_In;          //MONEY       8 Приход
    RS_MONEY_STRUCT Sum_Rest;        //MONEY       8 Остаток
    RS_DATE_STRUCT Final_Date;           //DATE        4 Дата последней проводки
    RS_DATE_STRUCT Open_Date;            //DATE        4 Дата открытия счета
    RS_DATE_STRUCT Close_Date;           //DATE        4 Дата закрытия счета
    BTI_SINT NCurLine;                //INT         2 Номер строки в сберкнижке
    RS_MONEY_STRUCT Limit;           //MONEY       8 Лимит
    BTI_CHAR FlagTrast;              //CHR         1 Флаг доверенности
    BTI_CHAR FlagWill;               //CHR         1 Флаг завещания
    BTI_CHAR Givebook;               //CHR         1 Флаг выдачи сберкнижки
    BTI_SINT Action;                  //INT         2 Признак посл.действия над записью
    BTI_CHAR SpecialAccess;          //CHR         1 Спецдоступ
    RS_MONEY_STRUCT SumPercOut;      //MONEY       8 Сумма % выданная по опер.выдачи %
    BTI_CHAR ConvertRec;             //CHR         1 Существуют доп. записи в auxinfo
    BTI_SINT S_NumAccounts;           //INT         2 Число счетов, входящих в неподв.
    RS_MONEY_STRUCT StaticRest;      //MONEY       8 Ост. на неподв. вкладе для данн.
    BTI_CHAR StaticPaid;             //CHR         1 Неподвижный вклад выплачен
    RS_DATE_STRUCT RenumDate;           //DATE        4 Дата последней перенумерации
    BTI_CHAR UserTypeAccount[9];     //STRING      9 Пользовательский тип счета
    BTI_CHAR PrevAccount[26];        //STRING     26 Предыдущий номер счета
    RS_DATE_STRUCT UnitPayDate;         //DATE        4 Дата выплаты объединенного
    BTI_LONG UnitPayDocNum;          //LONG        4 Номер документа о выплате объедин
    RS_DATE_STRUCT Limit_Date;          //DATE        4 Дата, до которой операции не пров
    BTI_CHAR ArhFlag;                //CHR         1 Признак выгрузки док.в файлы очис
    RS_MONEY_STRUCT ArrestedSum;     //MONEY       8 Сумма частичного ареста
    BTI_CHAR Author;                 //CHR         1 Клиент, открывший счет
    BTI_CHAR TypeOpen;               //CHR         1 Вид открытия счета
    BTI_LONG OpenClient;             //LONG        4 Клиент, открывший счет (вноситель
    BTI_CHAR BookType;               //CHR         1 Вид сберкнижки, выданной по счету
    BTI_BYTE NumberLostSBBook;       //UCHR        1 Номер потеряной сберкнижки
    BTI_LONG MainContractID;         //LONG        4 ID договора для основного счета
    BTI_LONG MainParrentRef;         //LONG        4 AK категории, по которой открыт с
    BTI_CHAR Reserved[100];          //STRING    100 РЕЗЕРВ
} RS_DEPOSITR_STRUCT;
Re[5]: Каким образом можно динамически определить структуру?
От: vpavel  
Дата: 06.04.07 11:09
Оценка:
Здравствуйте, UncleFox, Вы писали:

UF>Вот пример одной из структур, которую правда пришлось пробить руками.


UF>
UF>


И как это все используется?
Re: Каким образом можно динамически определить структуру?
От: Кодт Россия  
Дата: 06.04.07 11:12
Оценка:
Здравствуйте, UncleFox, Вы писали:

UF>У меня есть lib – файл, поставляемый разработчиком, и функции из него принимают в качестве параметра структуру, о которой до некоторого момента я ничего не знаю, но по её имени могу определить. При этом есть два варианта:

UF>1. Я про неё узнаю до момента компиляции (определяю в коде);
UF>2. Я про неё узнаю после сборки проекта (пользователь вводит имя).
UF>После определения имени структуры я могу определить количество её членов, их тип и названия (хотя название особого смысла не несёт). Так вот каким образом я могу сгенерить эту структуру для передачи в функцию.

Может быть, так.
Создаёшь сущность "описание структуры", отвечающую (в рантайме) на вопросы:
— размер структуры в байтах
— количество полей
— смещения, типы, имена полей
На основе её можно сделать функции создания и доступа к массиву байтов как к произвольной структуре.

Что-то в таком роде
struct FieldInfo
{
    string name;
    int offset;
    VAR_TYPE type; // набор констант VT_..., думаю, неплохо справится с этой ролью
    
    int const bytesize() const { /* функция от type */ }
    
    // трактует массив байтов как число, со смещением offset
    int 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 и по offset
    
    void 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]: Каким образом можно динамически определить структуру?
От: UncleFox  
Дата: 06.04.07 11:15
Оценка:
Эта структура передаётся в качестве параметра в ф-ию из lib-а, но дело в том, что таких возможных структур более сотни, но по названию структуры, как я говорил, могу узнать и количество её членов, и тип, и названия. Так вот мне и надо сформировать структуру для передачи по ходу дела.
Re[5]: Каким образом можно динамически определить структуру?
От: Аноним  
Дата: 06.04.07 11:15
Оценка:
Здравствуйте, UncleFox, Вы писали:

UF>Вот пример одной из структур, которую правда пришлось пробить руками.


Тебе не на форуме надо стпрашивать, а документацию к библиотеке внимательно читать.
Еще можно прямо у разработчиков спросить.
Никто тут тебе не поможет решить твою проблему с помощью неизвестной библиотеки.

Если это известная библиотека, то надо именно про нее спрашивать.
Re[6]: Каким образом можно динамически определить структуру?
От: UncleFox  
Дата: 06.04.07 11:18
Оценка:
А>Нету предмета для обсуждений...

Так вопрос и был, как получить нужную структуру по ходу
Re[6]: Каким образом можно динамически определить структуру?
От: UncleFox  
Дата: 06.04.07 11:29
Оценка:
А>Тебе не на форуме надо стпрашивать, а документацию к библиотеке внимательно читать.
А>Еще можно прямо у разработчиков спросить.
А>Никто тут тебе не поможет решить твою проблему с помощью неизвестной библиотеки.

А>Если это известная библиотека, то надо именно про нее спрашивать.


Вопрос не о библиотеке, а о структуре и как её получить. И в названии написано: "Каким образом можно динамически определить структуру?". Разработчик сказал: в качестве параметра ф-ия получает структуру, и чего тут с ним обсуждать. А вот каким образом кодер это сделает, его (разработчика) не касается. Вот я и спросил о возможных вариантах. Я точно знаю, что такое есть, так как видел, как это работает в компании ... (нет места рекламе), но они само собой не откроют своих секретов.
Я не гуру в кодинге, вот и думаю, может, кто подскажет.
Re[7]: Каким образом можно динамически определить структуру?
От: sc Россия  
Дата: 06.04.07 15:07
Оценка: 1 (1)
Здравствуйте, UncleFox, Вы писали:

UF>Эта структура передаётся в качестве параметра в ф-ию из lib-а, но дело в том, что таких возможных структур более сотни, но по названию структуры, как я говорил, могу узнать и количество её членов, и тип, и названия. Так вот мне и надо сформировать структуру для передачи по ходу дела.


И в чем смысл формировать ее в рантайме?
Не лучше ли определить все структуры как положено в компайлтайме?
Re[7]: Каким образом можно динамически определить структуру?
От: Sergey Россия  
Дата: 06.04.07 15:27
Оценка:
Здравствуйте, UncleFox, Вы писали:

А>>Тебе не на форуме надо стпрашивать, а документацию к библиотеке внимательно читать.

А>>Еще можно прямо у разработчиков спросить.
А>>Никто тут тебе не поможет решить твою проблему с помощью неизвестной библиотеки.

А>>Если это известная библиотека, то надо именно про нее спрашивать.


UF>Вопрос не о библиотеке, а о структуре и как её получить. И в названии написано: "Каким образом можно динамически определить структуру?". Разработчик сказал: в качестве параметра ф-ия получает структуру, и чего тут с ним обсуждать. А вот каким образом кодер это сделает, его (разработчика) не касается. Вот я и спросил о возможных вариантах. Я точно знаю, что такое есть, так как видел, как это работает в компании ... (нет места рекламе), но они само собой не откроют своих секретов.

UF>Я не гуру в кодинге, вот и думаю, может, кто подскажет.

Вопрос в том, что вы потом собираетесь делать с этими структурами. Ведь раз их 100 штук, то наверняка функция просто умеет делать 100 разных действий с разным набором аргументов. Я не знаю, почему разработчик решил сделать 1 функцию с таким вот полиморфным параметром, но прежде чем учиться генерировать эти структуры, вы должны четко представлять, чем вы их будете заполнять и как интерпетировать результаты работы функции.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.