Russian Qt Forum

Qt => Вопросы новичков => Тема начата: shadow от Февраль 12, 2016, 16:53



Название: QMap и масив
Отправлено: shadow от Февраль 12, 2016, 16:53
Доброго времени суток!

Подскажите пожалуйста можно реализовать добавление двумерного массива переменной длинны в словарь?
Пробую так:
Код:
float **Val = new float*[Size];
for (int i = 0; i < Size i++)
     Val[i]  = new float [Size];

   QMap<QString,float**> map;
   for (int i = 0; i < NumSost i++){

      for (int j = 0; j < Size j++)       
           Val[i][j]=....;
       
       map.insert(tr("%1").arg(i),Val)
   }

Не получается (наверное потому что Val указатель)

Подскажите пожалуйста решение?

Спасибо.

 
 


Название: Re: QMap и масив
Отправлено: Igors от Февраль 12, 2016, 17:30
Код
C++ (Qt)
QMap<QString, float *> map;
for (int i = 0; i < NumSost; i++) {
 
     for (int j = 0; j < Size; j++)      
          Val[i][j]=....;
 
      map.insert(tr("%1").arg(i), Val[i]);
}


Название: Re: QMap и масив
Отправлено: shadow от Февраль 12, 2016, 22:41
Код
C++ (Qt)
QMap<QString, float *> map;
for (int i = 0; i < NumSost; i++) {
 
     for (int j = 0; j < Size; j++)      
          Val[i][j]=....;
 
      map.insert(tr("%1").arg(i), Val[i]);
}
Возможно, но я же хочу по ключу получить весь масив Val?


Название: Re: QMap и масив
Отправлено: kambala от Февраль 12, 2016, 22:58
так а смысл делать insert внутри цикла?


Название: Re: QMap и масив
Отправлено: Racheengel от Февраль 12, 2016, 23:20
QMap <QString, QVector <QVector <float>>> my_map

 Но это оцтой, лучше вектора отдельно,  а в мапу указатели на них.


Название: Re: QMap и масив
Отправлено: Igors от Февраль 13, 2016, 07:35
Возможно, но я же хочу по ключу получить весь масив Val?
Тогда как было у Вас, только insert вне цикла. Не получится - выкладывайте пример (в zip файле)


Название: Re: QMap и масив
Отправлено: shadow от Февраль 13, 2016, 10:16
так а смысл делать insert внутри цикла?
Может пример не очень удачный...
Смысл в том что в цикле заполняется масив Val[][], а потом добавляется в словарь.
Потом я хочу по ключу получить Val...


Название: Re: QMap и масив
Отправлено: Igors от Февраль 13, 2016, 12:38
Потом я хочу по ключу получить Val...
Допустим все построено, приведите строку как Вы хотите использовать


Название: Re: QMap и масив
Отправлено: kambala от Февраль 13, 2016, 16:47
так а смысл делать insert внутри цикла?
Может пример не очень удачный...
Смысл в том что в цикле заполняется масив Val[][], а потом добавляется в словарь.
Потом я хочу по ключу получить Val...
просто insert надо вне цикла сделать и все


Название: Re: QMap и масив
Отправлено: shadow от Февраль 15, 2016, 15:48
так а смысл делать insert внутри цикла?
Может пример не очень удачный...
Смысл в том что в цикле заполняется масив Val[][], а потом добавляется в словарь.
Потом я хочу по ключу получить Val...
просто insert надо вне цикла сделать и все
Да если одно состояние то это работает(insert вне цикла), но у меня NumSost много (ключей ~30) и для каждого свой массив заполняется.
Может тогда принципиально мне подскажите как реализовать лучше...
У меня была прога на С
в которой для сохранения массивов значений использовалась структура
Код:
struct Values
{
val[200][200];
val1[200][200];
..
}
и вместо insert записывалась на диск (в bdb) для каждого состояния;
Но в структуре массивы статические и я захотел все это дело поправить и перевести на С++...
Я думал что засовывая массив в словарь туда записывается вся память выделена под массива, а туда записывается только указатель на массив :(....

Спасибо!

 


Название: Re: QMap и масив
Отправлено: shadow от Февраль 15, 2016, 20:02
Потом я хочу по ключу получить Val...
Допустим все построено, приведите строку как Вы хотите использовать

Код:
Val = map.find(sost).values(0);
Val2= map.find(sost+1).values(0);
...
      res = Val[][] - Val2[][]
....


Название: Re: QMap и масив
Отправлено: Igors от Февраль 16, 2016, 08:18
Но в структуре массивы статические и я захотел все это дело поправить и перевести на С++...
Правильно, от такого старья нужно избавляться

Допустим все построено, приведите строку как Вы хотите использовать
Код:
Val = map.find(sost).values(0);
Val2= map.find(sost+1).values(0);
...
      res = Val[][] - Val2[][]
....
Такое использование просто ужасно, так Val и Val2 будут КОПИРОВАТЬСЯ. Задачка не так уж проста (если делать по уму). Я подумаю как лучше.

Уточните: вот этот размер 200x200 - он фиксирован/необходим или просто "забивается по максимуму"? Напр реально там эл-тов всего 10x10, остальное неиспользуемые нули (значение по умолчанию)


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 08:53
Цитировать
Уточните: вот этот размер 200x200 - он фиксирован/необходим или просто "забивается по максимуму"? Напр реально там эл-тов всего 10x10, остальное неиспользуемые нули (значение по умолчанию)
У меня есть бинарные файлы данных, при открытии бинарника я узнаю размер массива, так что 200х200 может изменятся, это должен быть динамический массив.


Название: Re: QMap и масив
Отправлено: Old от Февраль 16, 2016, 09:04
У меня есть бинарные файлы данных, при открытии бинарника я узнаю размер массива, так что 200х200 может изменятся, это должен быть динамический массив.
Лучше сделать отдельный класс для хранения данных файла, например, FileData. В нем будут храниться размерность данных и сами данные, а также методы их сравнения и модификации. А вот объекты этого класса можно уже класть в QMap.


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 09:22
У меня есть бинарные файлы данных, при открытии бинарника я узнаю размер массива, так что 200х200 может изменятся, это должен быть динамический массив.
Лучше сделать отдельный класс для хранения данных файла, например, FileData. В нем будут храниться размерность данных и сами данные, а также методы их сравнения и модификации. А вот объекты этого класса можно уже класть в QMap.
Я только читаю данные с бинарников ничего туда не пишу.
Или я Вас неправильно понял?


Название: Re: QMap и масив
Отправлено: Old от Февраль 16, 2016, 10:27
Я только читаю данные с бинарников ничего туда не пишу.
Или я Вас неправильно понял?
Пожалуйста, а как это соотносится с хранением данных?
Вы пытаетесь засунуть их в обычный массив, этот массив в map, а где будете хранить размерности массивов?
А я предлагаю это объединить в отдельную сущность с удобными методами их использования.


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 11:37
Я только читаю данные с бинарников ничего туда не пишу.
Или я Вас неправильно понял?
Пожалуйста, а как это соотносится с хранением данных?
Вы пытаетесь засунуть их в обычный массив, этот массив в map, а где будете хранить размерности массивов?
А я предлагаю это объединить в отдельную сущность с удобными методами их использования.
Ну размеры массивов я знаю перед добавлением в словарь.
А вообще получилось спасибо!

Код:
class FileData
{
public:   
    FileData();
    void LoadKvdopData(float **arr,int Row,int Col);   
    void RetKvdopData(float **arr,int Row,int Col); 
    ~FileData();
private:
    bool isKvdopExist;
    float **Kvdop;
};
filedata.cpp
Код:
#include <QDebug>
#include "filedata.h"
FileData::FileData()
{
isKvdopExist=false;
}
void FileData::LoadKvdopData(float **arr,int Row,int Col)
{
    Kvdop = new float*[Row];
    for (int i = 0; i < Row; i++)
        Kvdop[i]  = new float [Col];

    for (int i = 0; i < Row; i++)
        for (int j = 0; j < Col; j++)
            Kvdop[i][j]=arr[i][j];
    //memcpy(Kvdop,arr,Row*Col);
    isKvdopExist=true;
}
void FileData::RetKvdopData(float **arr,int Row,int Col)
{
    if (isKvdopExist){
    for (int i = 0; i < Row; i++)
        for (int j = 0; j < Col; j++)
            arr[i][j]=Kvdop[i][j];
    //memcpy(arr,Kvdop,Row*Col);
    }else
     qDebug()<<"Массив не создан!";
}

Хочу вместо цикла использовать memcpy но программа вываливается... в чем может быть проблема?
Или по производительности это будет то-же самое?


Название: Re: QMap и масив
Отправлено: Igors от Февраль 16, 2016, 12:08
Хочу вместо цикла использовать memcpy но программа вываливается... в чем может быть проблема?
У Вас каждая строка распределена отдельно, поэтому memcpy не прокатит.

Вы сделали "косметический ремонт", старые си-шные массивы-то остались, Вы будете продолжать разбивать о них ноги (массив создан! Ах нет, не создан). Вот Вам заготовочка в аттаче. Если я где ошибся - подправите. Также избегайте всяких QMap::value() и др методов возвращающих ПО ЗНАЧЕНИЮ (не слушайте если будут рассказывать что, мол, в Qt так можно и.т.п.)




Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 12:26
Цитировать
У Вас каждая строка распределена отдельно, поэтому memcpy не прокатит.
Не понял, там и там указатель, память выделена.

Цитировать
Вы сделали "косметический ремонт" , старые си-шные массивы-то остались
Но массивы теперь динамические?

Аттач посмотрел...
Ну мне чтобы это понять еще надо подтянуть матчасть....


Название: Re: QMap и масив
Отправлено: __Heaven__ от Февраль 16, 2016, 12:38
Не понял, там и там указатель, память выделена.
Указатель на что (тип) ?


Название: Re: QMap и масив
Отправлено: kambala от Февраль 16, 2016, 13:14
Также избегайте всяких QMap::value() и др методов возвращающих ПО ЗНАЧЕНИЮ (не слушайте если будут рассказывать что, мол, в Qt так можно и.т.п.)
если в словарь складывать указатели, то можно и value()


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 13:36
Не понял, там и там указатель, память выделена.
Указатель на что (тип) ?
На float.


Название: Re: QMap и масив
Отправлено: __Heaven__ от Февраль 16, 2016, 13:56
На float.
А если повнимательнее :) на какой тип указывает Kvdop?


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 15:38
На float.
А если повнимательнее :) на какой тип указывает Kvdop?
На  указатель? Указатель на указатель.


Название: Re: QMap и масив
Отправлено: __Heaven__ от Февраль 16, 2016, 16:26
Да. Давайте для упрощения будем называть Kvdop массивом указателей (на float).
Теперь смотрите на memcpy. Эта функция копирует информацию из массива А в массив Б.
Как мы видим, в массиве Kvdop хранятся указатели. Значит что мы копируем? Верно, указатели вместо желаемых float.

Но это полбеды. Вы в memcpy передаёте количество элементов, которое хотите скопировать, а на самом деле она ожидает количество байт подлежащие копированию.


Функция memcpy, конечно же, мощная, но она потенциально опасная. Поэтому, если у вас нет острой необходимости в повышении скорости, то от неё лучше отказаться.
Очень советую обратить внимание на замечания Old.
Если бы передо мной стояла такая задача, то я бы написал класс матрицы, либо воспользовался готовым извне.


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 16:31
Да. Давайте для упрощения будем называть Kvdop массивом указателей (на float).
Теперь смотрите на memcpy. Эта функция копирует информацию из массива А в массив Б.
Как мы видим, в массиве Kvdop хранятся указатели. Значит что мы копируем? Верно, указатели вместо желаемых float.

Но это полбеды. Вы в memcpy передаёте количество элементов, которое хотите скопировать, а на самом деле она ожидает количество байт подлежащие копированию.


Функция memcpy, конечно же, мощная, но она потенциально опасная. Поэтому, если у вас нет острой необходимости в повышении скорости, то от неё лучше отказаться.
Очень советую обратить внимание на замечания Old.
Если бы передо мной стояла такая задача, то я бы написал класс матрицы, либо воспользовался готовым извне.

Спасибо за совет надо подумать...


Название: Re: QMap и масив
Отправлено: __Heaven__ от Февраль 16, 2016, 16:34
Я, кстати, так и не понял, почему вы QMap используете. В чём выгода?


Название: Re: QMap и масив
Отправлено: Igors от Февраль 16, 2016, 16:37
Я, кстати, так и не понял, почему вы QMap используете. В чём выгода?
Нормально если каких-то массивов может не оказаться (напр не загрузились)


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 17:36
Я, кстати, так и не понял, почему вы QMap используете. В чём выгода?
Ну я новичок. Может поэтому...Выгода в простоте для меня. QMap первым попался, может QVector лучше я пока не знаю. А вообще я выше писал, что раньше я писал структуру на диск... это напряжно и я захотел от этого избавится...обратился за помощью к джедаям..:)



Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 17:38
Я, кстати, так и не понял, почему вы QMap используете. В чём выгода?
Нормально если каких-то массивов может не оказаться (напр не загрузились)

Ненормально конечно.


Название: Re: QMap и масив
Отправлено: __Heaven__ от Февраль 16, 2016, 17:40
Да, скорее всего, вектор и нужен. QVector<Matrix>
С map слишком мудрёно получается, тем более, переводя порядковый номер в QString


Название: Re: QMap и масив
Отправлено: Igors от Февраль 16, 2016, 17:52
Ненормально конечно.
Я не о том. Мапа имеет смысл если Вы хотите избежать множества переменных (для каждого массива). Насколько я понял, в этом и был Ваш замысел. Конечно то же самое можно с вектором массивов, но менее удобно. Напр если какого-то массива может и не быть - с вектором довольно муторно. Но все это уже вопрос "как организовать/хранить набор массивов". Сначала надо иметь нормальный класс массива вместо старых огрызков.

Ну мне чтобы это понять еще надо подтянуть матчасть....
А Вам и так и так ее подтягивать если связались с Qt, а там классы куда сложнее


Название: Re: QMap и масив
Отправлено: poru от Февраль 16, 2016, 18:38
То что вы хотели в самом начале делается через линейный динамический массив и приведение типа указателей к многомерному массиву.
Код
C++ (Qt)
float *data = new float[row * col];
float **pdata = (float**) &data;
 
for (int r = 0; r < row; r++) {
   for (int c = 0; c < col; c++)
       pdata[r][c] = r + c;
}
 
QMap<QString, float**> map;
map["mydata"] = pdata;
 
float **ppdata = map["mydata"];
 
// memcpy(..., data, ...)
 

PS:
Цитировать
Я думал что засовывая массив в словарь туда записывается вся память выделена под массива, а туда записывается только указатель на массив
не доглядел про это условие


Название: Re: QMap и масив
Отправлено: shadow от Февраль 16, 2016, 20:47
Цитировать
Я не о том. Мапа имеет смысл если Вы хотите избежать множества переменных (для каждого массива). Насколько я понял, в этом и был Ваш замысел.
да именно ето я и хотел

Ну мне чтобы это понять еще надо подтянуть матчасть....
Цитировать
А Вам и так и так ее подтягивать если связались с Qt, а там классы куда сложнее
Да, конечно...