alex_lip
alex_lip27 сентября 2017 г. 6:58

Работа с двумерным массивом

Я прочитал про использование QVector для создания двумерного массива (https://evileg.com/post/111/) но не очень понятно чем QVector лучше обычных массивов. Поэтому пытаюсь работать со стандартными массивами. Но пока не получается.

В appcore.h объявляю функцию, в которую буду передавать массив. Количество колонок у меня константа. Количество строк заранее неизвестно.

void p_avatar(QString **model_arr);
в основном модуле объявляю массив, работаю с ним - а затем вызываю функцию и передаю ей массив -

 int y=root.value("count").toInt();
       // const int z =y;
       // QString **model_arr = new QString*[6][z];
QString model_arr[y][6];

for(int i = 0; i < ja.count(); i++){ model_arr[i][0]=st1; model_arr[i][1]=st2; model_arr[i][2]=st3; model_arr[i][3]=st4; model_arr[i][4]=st5; model_arr[i][5]=st6;
}
p_avatar(model_arr);


void AppCore::p_avatar(QString **model_arr)
{
    qDebug() << model_arr;
}
пишет что все неправильно
no matching function for call to 'AppCore::p_avatar(QString [y][6])'
p_avatar(model_arr);
^

В общем не понимаю
1) Как объявить функцию с параметром двумерный массив
2) Нужно ли инициализировать элементы массива типа
int **array_generator(unsigned int dim1, unsigned int dim2) {
    int **ptrary = new int * [dim1];
    for (int i = 0; i < dim1; i++) {
        ptrary[i] = new int [dim2];
    }
    return ptrary;
}
3) как передать массив в функцию
4) Нужно ли дестроить массив после использования типа
void array_destroyer(int **ary, unsigned int dim1) {
    for (int i = 0; i < dim1; i++) {
        delete [] ary[i];
    }
    delete [] ary;
}
Прочитал массу текстов - в голове каша. Помогите please.








Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

7
BlinCT
  • 27 сентября 2017 г. 7:23

Ну я бы мог вкратце сказать чем лучше вектор. это тем что он готовый уже с нужными методами и проверками на выход за пределы, что у обычного arr отсутствует. Вектор так же имеет итераторы что очень упрощает работы с массивом данных.
Если вам интересно реализация с нормальным вектором то можно пример сделать, а вот с обычным массивом вот правда лень писать) сорян)

    alex_lip
    • 27 сентября 2017 г. 7:45
    • (ред.)

    Я не думал что пример работы с обычным двумерным массивом столь сложен для человека давно работающего с С++. Видимо вы тоже начинающий как и я.

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

    Вот хорошая статья https://code-live.ru/post/cpp-array-tutorial-part-2/ - но она от 2014 года и про С++ . Я не знаю насколько это все работает на той реализации С++, которая используется в QT

      Evgenii Legotckoi
      • 27 сентября 2017 г. 12:57
      • (ред.)
      • Ответ был помечен как решение.

      С обычными массивами геморроя много, и то что Вам ответили выше - это лишь малая часть из преимуществ контейнеров типа QVector, std::vector, std::set и т.д.. В продакшене обычные массивы практически не используют, кроме особых случаев, в частности касающихся embedded разработки. В результате всё равно запилите свой костылированный контейнер.


      Что касается ошибки, то правильно, что ругается.
      Дело в том, что QString **model_arr и QString model_arr[y][6] - это разные типы данных. Нужно всё будет инизиализировать в циклах через new , как показано в той статье, что Вы привели. Указатели будут иметь один и тот же размер, а второй вариант с явным указанием размеров фактичеки будет объектом со всеми этими элементами, который в разы превышает размер указателя указателей на объект QString. В общем - это несовместимые типы данных, или костылировать всякие касты, или инициализировать массив нужного размера через new.

      1) Как объявить функцию с параметром двумерный массив

      В закоментированной строчке вы в общем-то правильно это дело объявили. Там где с двумя указателями. Нужно только инициализацию через выделение памяти сделать в цикле.

      2) Нужно ли инициализировать элементы массива типа

      Да. Нужно.

      3) как передать массив в функцию

      Аргумент для передачи массива в функции написали правильно, только не тот объект передавали.

      4) Нужно ли дестроить массив после использования типа

      Объекты нужно дестроить всегда, чтобы не было утечек памяти. Другой вопрос в том, в какой момент это делать. Объекты должны быть уничтожены тогда, когда они больше не будут использоваться. А если они ещё где-то используются, то естественно нельзя их уничтожать, иначе получите SEGMENTATION FAULT

        alex_lip
        • 27 сентября 2017 г. 14:29

        Спасибо за столь подробный ответ. Как всегда доходчиво.

          alex_lip
          • 28 сентября 2017 г. 4:39
          • (ред.)

          Похоже с учетом того, что число колонок у меня фиксированное - вот такая элементарная конструкция получилась - одномерный массив списка строковых значений!

          #include <QCoreApplication>
          #include <QStringList>
          #include <QDebug>
          
          int main(int argc, char *argv[])
          {
              QCoreApplication a(argc, argv);
              QVector <QStringList> model_arr;
                  for (int k=0; k<6; k++)
                      {
                          model_arr.append({QString::number(k),QString::number(k+1),QString::number(k+2)});
          
                      }
              qDebug()<<"Test";
              qDebug()<<model_arr;
          qDebug()<<model_arr[5]; qDebug()<<model_arr[5][2]; return a.exec(); }
            alex_lip
            • 28 сентября 2017 г. 5:07

            Опять запутался как объявить

            QVector <QStringList> model_arr;
            в appcore.h и как его передать как параметр?
            пытаюсь объявить так
            void p_avatar( QVector <QStringList> *model_arr);
            и передать так
            p_avatar(model_arr);  - ругается
            ошибка: no matching function for call to 'AppCore::p_avatar(QVector<QStringList>&)'
            p_avatar(model_arr);
            ^
            когда передаю так
            p_avatar(*model_arr); - ругается
            ошибка: no match for 'operator*' (operand type is 'QVector<QStringList>')
            p_avatar(*model_arr);
            ^
            Я же объявляю одномерный массив - указатель(*) один должен быть?


              Evgenii Legotckoi
              • 28 сентября 2017 г. 5:17

              Здесь параметр по ссылке нужно передавать.

              Или так, если планируете делать изменения в этом объекте
              void p_avatar(QVector <QStringList>& model_arr); 
              Или как константную ссылку, что более правилньо при разработке (Ограничивать возможность изменения объектов по ссылке, без реалньой необходимости измения этих объектов)
              void p_avatar(const QVector <QStringList>& model_arr); 

                Комментарии

                Только авторизованные пользователи могут публиковать комментарии.
                Пожалуйста, авторизуйтесь или зарегистрируйтесь
                AD

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:50баллов,
                • Очки рейтинга-4
                m
                • molni99
                • 26 октября 2024 г. 1:37

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:80баллов,
                • Очки рейтинга4
                m
                • molni99
                • 26 октября 2024 г. 1:29

                C++ - Тест 004. Указатели, Массивы и Циклы

                • Результат:20баллов,
                • Очки рейтинга-10
                Последние комментарии
                i
                innorwall13 ноября 2024 г. 23:03
                Как написать игру на Qt - Урок 3. Взаимодействие с другими объектами what is priligy tablets What happens during the LASIK surgery process
                i
                innorwall13 ноября 2024 г. 20:09
                Использование переменных объявленных в CMakeLists.txt внутри C++ файлов where can i buy priligy online safely Tom Platz How about things like we read about in the magazines like roid rage and does that really
                i
                innorwall11 ноября 2024 г. 22:12
                Django - Урок 055. Как написать функционал auto populate field Freckles because of several brand names retin a, atralin buy generic priligy
                i
                innorwall11 ноября 2024 г. 18:23
                QML - Урок 035. Использование перечислений в QML без C++ priligy cvs 24 Together with antibiotics such as amphotericin B 10, griseofulvin 11 and streptomycin 12, chloramphenicol 9 is in the World Health Organisation s List of Essential Medici…
                i
                innorwall11 ноября 2024 г. 15:50
                Qt/C++ - Урок 052. Кастомизация Qt Аудио плеера в стиле AIMP It decreases stress, supports hormone balance, and regulates and increases blood flow to the reproductive organs buy priligy online safe Promising data were reported in a PDX model re…
                Сейчас обсуждают на форуме
                i
                innorwall14 ноября 2024 г. 0:39
                добавить qlineseries в функции Listen intently to what Jerry says about Conditional Acceptance because that s the bargaining chip in the song and dance you will have to engage in to protect yourself and your family from AMI S…
                i
                innorwall11 ноября 2024 г. 10:55
                Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                9
                9Anonim25 октября 2024 г. 9:10
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                ИМ
                Игорь Максимов3 октября 2024 г. 4:05
                Реализация навигации по разделам Спасибо Евгений!

                Следите за нами в социальных сетях