Russian Qt Forum
Ноябрь 25, 2024, 11:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QList доступ к элементам  (Прочитано 8815 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Июль 13, 2015, 09:26 »

Есть структуры A1, A2, A3... . Есть список QList<Ax> list (x - любая цифра).
У меня есть void *v = &list; Как мне получить адреса элементов в списке? &list[0], &list[1]...

p.s. Без использования указателя - QList<*Ax>

Как во втором qDebug получить такие же значения?
Код:
    
struct X { int a, b;  QString s;
            X(int a, int b, QString s): a(a), b(b), s(s) {} }

QList<X> ls;
    ls << X(1,2,"3")<< X(1,2,"3")<< X(1,2,"3");

    QList<int> *a;
    a = (QList<int>*)(&ls);

    qDebug() << &ls[0] << &ls[1] << &ls[2];
    qDebug() << &(*a)[0] << &(*a)[1] << &(*a)[2];
« Последнее редактирование: Июль 13, 2015, 09:56 от deMax » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #1 : Июль 13, 2015, 10:51 »

Гарантирует ли QVector то что &list = &list[0]+i*itemSize ?

p.s. для чего делаю:
Код:
struct A: public Ini {
int a;
QColor c;
QVector<X> xlist;
A() {add(INT, &a, "a");
     add(CLR, &c, "c");
     add(VEC, &xlist, "xlist");} }
в коде я могу вызывать writeToIniFile, readFromIniFile - сериализация в текстовый формат



Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 13, 2015, 12:10 »

Гарантирует ли QVector то что &list = &list[0]+i*itemSize ?
Без itemSize, адресная арифметика сама помножит. Гарантируется что
Код
C++ (Qt)
&vector[i] = &vector[0] + i;
НО только до тех пор пока vector не будет изменен.

Код:
    
    QList<int> *a;
    a = (QList<int>*)(&ls);
Зачем лепить такого урода если есть штатное средство QVariant ?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Июль 13, 2015, 12:37 »

Зачем лепить такого урода если есть штатное средство QVariant ?
QVariant к произвольной структуре?
НО только до тех пор пока vector не будет изменен.
Это чтение структуры, ес-но она не изменит вектор.

работает чтение, Base* vi = (Base*)((int)&(*vec)[0] + j*size);
Сейчас думаю как запись сделать?
Как QVector<char[size]> создать?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Июль 13, 2015, 12:40 »

QVariant к произвольной структуре?
Да.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #5 : Июль 13, 2015, 12:58 »

QVariant прикольная вещь, но хотелось видеть QVector<A> alist, а не QVector<QVariant> alist;
тем более вместо QVarian указатель будет удобнее.

Можно ли как то создать QVector<char[size]> что бы тип был нужной тебе длины?
resize правильно не выполниться без этого.

Или можно ли вызвать вектору resize(itemCount*size), а потом заменить переменную size?
« Последнее редактирование: Июль 13, 2015, 14:09 от deMax » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #6 : Июль 13, 2015, 14:53 »

Походу свой вектор писать придется Злой
Может можно переопределить класс QVector, чтобы он создал в памяти массив и доступ к элементам массива. Не его дело что там за тип будет  Злой
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 13, 2015, 15:31 »

Возможно (ну это я только догадываюсь) есть набор "параметров" - значений разного типа. И вот возникла мысль хранить их адреса (или значения ?) в одном контейнере чтобы по нему пробегаться напр для загрузки/выгрузки в текстовый файл. И понеслась - адрес (указатель) надо как-то "идентифицировать", а подлые значения еще и в один контейнер не ложатся.   

Так дело было? Если нет то поясните как - а то, как всегда, трудно понять о чем Вы  Улыбающийся
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #8 : Июль 13, 2015, 15:43 »

Смысл такой, нужна сериализация, но чтобы он был читабельным(т.е. для каждой переменной прописывается ее значение).
просто сериализация делается через потоки, как то так:
Код:
template <typename T>
QDataStream& operator<<(QDataStream& out, const std::vector<T>& list)
{
    out << list.size();
    foreach (T item, list)
        out << item;
    return out;
}
// И потом запаковываем свой класс:
QDataStream& operator<<(QDataStream& out, const A& a) {
    out << a.x << a.y << a.s1 << a.s2 << a.list;
    return out; }

Я хочу сделать как то так: (точнее уже сделано, только не могу вектору на неизвестную структуру resize сделать)

Код:
struct Ini: public Base
{
    struct St {
        QString s;
        int i;
        bool b;
    } st;

    struct KA: public Base {
        QColor c;
        KA() {
            add(COLR, &c, "c"); }
    };

    QVector<KA> kas;

    QString configFile;
    QString lastLogin;

    Ini() {
        add(STRNG,  &st.s, "st.s");
        add(INT,    &st.i, "st.i");
        add(BOOL,   &st.b, "st.b");
        add(COLR,   &ka.c, "ka.c");
        add(VECT,   &kas,  "kas", sizeof(KA));
        add(STRNG,  &configFile, "configFile");
        add(STRNG,  &lastLogin,  "lastLogin"); }

};

Получаем такой текстовый файл:
Код:
configFile=conf
lastLogin=last
[ka]
c=#ff0000

[kas=0]
c=#ff0000

[kas=1]
c=#00ff00

[st]
s=zzz
i=120
b=true



Конечно можно сделать как то так:
Код:
switch(typeSize)
{
......
case 3: ((std::vector<char[3]>)pointer)->resize(itemCount); break;
......}
но придется писать много строк, и std::vector использовать. QVector<char[4]> - глотать отказывается.

« Последнее редактирование: Июль 13, 2015, 15:46 от deMax » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Июль 14, 2015, 11:26 »

Код:
        add(STRNG,  &st.s, "st.s");
        add(INT,    &st.i, "st.i");
Ну определенный смысл в этом есть, иногда это называют "дескриптор параметра". Имея такой контейнер можно перебрасывать данные напр в UI и обратно (если дескриптор связан с контролом окна). Однако

1) Если речь об ini файле - оно того не стоит. Написать "в лоб", без затей намного проще, см QSettings

2) Откуда взялась необходимость хранения данных разного типа? Вы упорно подаете указатель, ну и храните его как void * и при операциях приводите к нужному типу. Т.е. сами переменные у Вас есть и существуют всегда, они и хранят, чего еще надо?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #10 : Июль 24, 2015, 15:50 »

1) Если речь об ini файле - оно того не стоит. Написать "в лоб", без затей намного проще, см QSettings
2) Откуда взялась необходимость хранения данных разного типа? Вы упорно подаете указатель, ну и храните его как void * и при операциях приводите к нужному типу. Т.е. сами переменные у Вас есть и существуют всегда, они и хранят, чего еще надо?
1) когда класс один - проще, когда их много то лучше сделать механизм: я хочу сохранять не только настройки, но еще и состояние виджетов/классов (хотя для них возможно сделаю бинарную сериализацию).
2) каким образом я пройдусь по переменным произвольной структуры, еще и тип узнаю каждого элемента? Для каждой структуры писать load+save не интересно, лучше перечислить их в конструкторе.

p.s. вектор нельзя никак обмануть? чтобы при методе resize() sizeof(T) выдавал size который я ему укажу? Или сделать resize для byte, и заменить в заголовке вектора переменную size(адрес вектора+2*4байта что ли)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июль 24, 2015, 16:18 »

2) каким образом я пройдусь по переменным произвольной структуры, еще и тип узнаю каждого элемента?
QVariantList, хотя это без толку, все равно будете опять спрашивать свое  Улыбающийся

Для каждой структуры писать load+save не интересно, лучше перечислить их в конструкторе.
Интересно или нет - а придется, вопрос лишь когда Вы для этого созреете  Улыбающийся

p.s. вектор нельзя никак обмануть? чтобы при методе resize() sizeof(T) выдавал size который я ему укажу? Или сделать resize для byte, и заменить в заголовке вектора переменную size(адрес вектора+2*4байта что ли)
Пример: есть "сложные" полигоны которые могут ссылаться на 5 и более индексов/вертексов. Др словами каждый полигон переменной длины. Я храню их в 2 векторах
Код
C++ (Qt)
struct CExample {
size_t GetPolyNumVer( size_t polyIndex ) const
{
  int index1 = mEntry[polyIndex];
  int index2 = (polyIndex < mEntry.size() - 1) ? mEntry[polyIndex + 1] :  mEntry.size();
  return index2 - index1;
}
 
int * GetPolyIndices( size_t polyIndex )
{
  return &mIndices[mEntry[polyIndex]];
}
 
std::vector <int> mEntry;
std::vector <int> mIndices;
};
Но все это только для POD типов, для чего-то "выше травы" (напр хранимая структура имеет указатели и/или виртуалы) это работать не будет
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #12 : Июль 27, 2015, 11:35 »

QVariantList, хотя это без толку, все равно будете опять спрашивать свое  Улыбающийся
т.е. вместо struct Monstr{int heals, int attack}; писать
QMap<QString, QVariant> monstr;
monstr["heals"] = 10;

Цитировать
Но все это только для POD типов, для чего-то "выше травы" (напр хранимая структура имеет указатели и/или виртуалы) это работать не будет
На указатели и прочее тоже можно способы найти.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Июль 27, 2015, 12:06 »

т.е. вместо struct Monstr{int heals, int attack}; писать
QMap<QString, QVariant> monstr;
monstr["heals"] = 10;
Нет, самого Monstr запихнуть в QVariant. там несложно и все для этого есть

На указатели и прочее тоже можно способы найти.
Может и можно, но уже не один месяц ищете и, скорее всего, так ничем и кончится
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #14 : Июль 30, 2015, 14:59 »

Нет, самого Monstr запихнуть в QVariant. там несложно и все для этого есть
Может и можно, но уже не один месяц ищете и, скорее всего, так ничем и кончится [/quote]Можно и так, я уже сделал по другому. Хочется победить эту штуку.
Написал свой вектор, пришлось даже от оператора new отказаться(тоже тип ему подавай).

p.s. не хватает в c++ переменной типа, чтобы в функцию тип можно было передать. В шаблоне switch(type) самое то было бы...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.168 секунд. Запросов: 23.