Russian Qt Forum

Qt => Общие вопросы => Тема начата: OKTA от Март 31, 2014, 15:36



Название: Мильён структур и типов
Отправлено: OKTA от Март 31, 2014, 15:36
Товарищи, посоветуйте, как лучше сделать.
Имею библиотеку, которая выдает структуру, в которой лежит указатель на одну из 4 структур других типов, в каждой из которых лежит несколько полей данных, которые могут быть нескольких типов(около 10 разных). Принимая такие структуры, мне надо засунуть из в таблицу, но перед этим хочу создать свой контейнер для их хранения. Но проблема в том, что я могу узнать, что лежит в каждой отдельной структуре, лишь когда ее открою и так же типы данных вижу только в самый последний момент (первым полем в каждой структуре - идентификатор типа данных остальных полей). Как лучше сделать, чтобы было удобно хранить и избавить себя от миллиона явных преобразований типов? Только через шаблоны?  ???


Название: Re: Мильён структур и типов
Отправлено: Bepec от Март 31, 2014, 16:14
Ммм... А в чем проблема? у вас есть структура. Возьмём класс, добавим ему возможности иметь неизвестное количество полей неизвестного формата (ну ваших 10 разных). И при добавлении будет инициализировать его вашими структурами. В результате получится массив указателей на классы структур. Или указатель на главную ноду.

PS вроде бы стандартный такой древовидный подход :)

PPS 1 класс для хранения и шаблонный класс для типов. Хотя хз какие у вас там типы, мб шаблон больно вычурный получится.


Название: Re: Мильён структур и типов
Отправлено: Old от Март 31, 2014, 16:56
2ОКТА А как вы эту древовидную структуру хотите в таблице отображать?


Название: Re: Мильён структур и типов
Отправлено: OKTA от Март 31, 2014, 18:02
2ОКТА А как вы эту древовидную структуру хотите в таблице отображать?


Да это не особо древовидная структура. Если грубо на словах, то опуская все тонкости имеем 4 типа контейнеров -  array/range/enumeration/one_value, в каждом из которых тип данных может быть любым из встроенных типов и еще нескольких пользовательских. Т.е. каждая строка таблицы - это один контейнер. Видимо другого пути, как и советует Верес, нет - создать шаблонный класс c вложенным шаблоном (или как это сказать по-русски - nested template) для контейнеров, проинициализировать их и засунуть в массив, не забыв еще и добавить тип контейнера и тип данных в каждом контейнере. А когда будем работать с ним в интерфейсе - открываем контейнер, смотрим на его тип и тип данных и шпарим.


Название: Re: Мильён структур и типов
Отправлено: Old от Март 31, 2014, 18:12
Покажите на примере такой шаблонный класс.

Мне вот кажется, что все это можно положить в список контейнеров:
Код
C++ (Qt)
QList<Container*> items;
 

А Container это базовый класс от которого происходят контейнеры: array, range, enumeration и one_value.


Название: Re: Мильён структур и типов
Отправлено: Johnik от Март 31, 2014, 18:54
может union ?


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 01, 2014, 10:23
Union не даст никаких преимуществ я думаю.
Начал так  - 4 структуры и класс контейнера. Ну и дальше да, в QList их.
Делать базовый класс для контейнеров пока поостерегся - у структур нет ничего общего, кроме одного поля, определяющего тип.
Приму все замечания  :)
Код:
template <class T> struct onevalue {
    //

    ushort itemType;
    T item;

};

template <class T, template <class> class P >
class Container
{
public:
    P<T> data;
};

Container <int, onevalue> testContainer;
Это пока так, заготовка, в класс еще надо добавить несколько полей..


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 01, 2014, 11:23
Ан нет, твоя правда Old..
Надо делать класс, а в нем уже все преобразования делать - в QList так просто не подсунешь шаблонный класс.


Название: Re: Мильён структур и типов
Отправлено: Old от Апрель 01, 2014, 12:33
Для отображения в таблице можно придумать универсальный интерфейс, тогда никаких преобразований вообще не понадобиться.
А если возможно использовать универсальный интерфейс и для модификации, то они вообще не понадобятся. :)


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 01, 2014, 12:41
Да, я уже иду к этому  ;D
Подумал, что чтобы не мучиться с хранением, буду использовать QVariant, а уже в таблице в зависимости от типа данных принимать решение, как их визуализировать  :)


Название: Re: Мильён структур и типов
Отправлено: Old от Апрель 01, 2014, 12:46
а уже в таблице в зависимости от типа данных принимать решение, как их визуализировать  :)
Так это же прямой путь к 100500 switch & cast. Вроде от этого хотели уйти. :)


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 01, 2014, 12:59
В любом случае придется использовать switch + cast, чтобы сохранить данные в своих контейнерах  :'(


Название: Re: Мильён структур и типов
Отправлено: Old от Апрель 01, 2014, 13:07
В любом случае придется использовать switch + cast, чтобы сохранить данные в своих контейнерах  :'(
Ну это один раз. А так switch + cast будет в каждом втором методе.


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 01, 2014, 13:11
Попробую обмозговать вашу идею  :)


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 02, 2014, 10:35
Ешкин кот, придется убить эту идею с преобразованием и хранением данных и использовать их в исходном виде.. Выяснилось, что придется еще реализовывать задачу установки новых значений, а для этого надо, чтобы данные были в тех же формтах, в каком приходят из библиотеки. Так что проще реализовать универсальную модель и универсальный интерфейс для отображения и изменения.


Название: Re: Мильён структур и типов
Отправлено: Bepec от Апрель 02, 2014, 11:39
Привели бы пару типов, я б посмотрел тоже что можно сделать. :)

PS 2 головы лучше, чем одна :)


Название: Re: Мильён структур и типов
Отправлено: OKTA от Апрель 02, 2014, 12:36
Ну Верес, сам напросился  ;D
Буду рад новым идеям))

Вот контейнеры:
Код:
typedef struct {
   TW_UINT16  ItemType;
   TW_UINT32  NumItems;    /* How many items in ItemList           */
   TW_UINT8   ItemList[1]; /* Array of ItemType values starts here */
} TW_ARRAY, FAR * pTW_ARRAY;
/* TWON_ENUMERATION. Container for a collection of values. */
typedef struct {
   TW_UINT16  ItemType;
   TW_UINT32  NumItems;     /* How many items in ItemList                 */
   TW_UINT32  CurrentIndex; /* Current value is in ItemList[CurrentIndex] */
   TW_UINT32  DefaultIndex; /* Powerup value is in ItemList[DefaultIndex] */
   TW_UINT8   ItemList[1];  /* Array of ItemType values starts here       */
} TW_ENUMERATION, FAR * pTW_ENUMERATION;
/* TWON_ONEVALUE. Container for one value. */
typedef struct {
   TW_UINT16  ItemType;
   TW_UINT32  Item;
} TW_ONEVALUE, FAR * pTW_ONEVALUE;
/* TWON_RANGE. Container for a range of values. */
typedef struct {
   TW_UINT16  ItemType;
   TW_UINT32  MinValue;     /* Starting value in the range.           */
   TW_UINT32  MaxValue;     /* Final value in the range.              */
   TW_UINT32  StepSize;     /* Increment from MinValue to MaxValue.   */
   TW_UINT32  DefaultValue; /* Power-up value.                        */
   TW_UINT32  CurrentValue; /* The value that is currently in effect. */
} TW_RANGE, FAR * pTW_RANGE;

А это возможные типы:
Код:
typedef char    TW_STR32[34],     FAR *pTW_STR32;
typedef char    TW_STR64[66],     FAR *pTW_STR64;
typedef char    TW_STR128[130],   FAR *pTW_STR128;
typedef char    TW_STR255[256],   FAR *pTW_STR255;
/* Numeric types. */
typedef char           TW_INT8,   FAR *pTW_INT8;
typedef short          TW_INT16,  FAR *pTW_INT16;
typedef long           TW_INT32,  FAR *pTW_INT32;
typedef unsigned char  TW_UINT8,  FAR *pTW_UINT8;
typedef unsigned short TW_UINT16, FAR *pTW_UINT16;
typedef unsigned long  TW_UINT32, FAR *pTW_UINT32;
typedef unsigned short TW_bool,   FAR *pTW_bool;
/* Fixed point structure type. */
typedef struct {
    TW_INT16     Whole;        /* maintains the sign */
    TW_UINT16    Frac;
} TW_FIX32,  FAR *pTW_FIX32;


Название: Re: Мильён структур и типов
Отправлено: Igors от Апрель 02, 2014, 12:53
Вот контейнеры:
Код:
typedef struct {
   TW_UINT16  ItemType;
   TW_UINT32  NumItems;    /* How many items in ItemList           */
   TW_UINT8   ItemList[1]; /* Array of ItemType values starts here */
} TW_ARRAY, FAR * pTW_ARRAY;
Можно заменить это вектором (или его наследником), а вход/выход сделать как I/O, может и через операторы >> <<