alex_lip
alex_lip27 вересня 2017 р. 06: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 р. 07:23

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

    alex_lip
    • 27 вересня 2017 р. 07: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 р. 04: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 р. 05: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 р. 05:17

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

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

                Коментарі

                Only authorized users can post comments.
                Please, Log in or Sign up
                AD

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

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

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

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

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

                • Результат:20бали,
                • Рейтинг балів-10
                Останні коментарі
                ИМ
                Игорь Максимов22 листопада 2024 р. 11:51
                Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                Evgenii Legotckoi
                Evgenii Legotckoi31 жовтня 2024 р. 14:37
                Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                A
                ALO1ZE19 жовтня 2024 р. 08:19
                Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь Максимов05 жовтня 2024 р. 07:51
                Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas505 липня 2024 р. 11:02
                QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                Тепер обговоріть на форумі
                Evgenii Legotckoi
                Evgenii Legotckoi24 червня 2024 р. 15:11
                добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                t
                tonypeachey115 листопада 2024 р. 06:04
                google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                NSProject
                NSProject04 червня 2022 р. 03:49
                Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                9
                9Anonim25 жовтня 2024 р. 09:10
                Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                Слідкуйте за нами в соціальних мережах