alex_lip
alex_lip27. September 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
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

7
BlinCT
  • 27. September 2017 07:23

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

    alex_lip
    • 27. September 2017 07:45
    • (bearbeitet)

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

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

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

      Evgenii Legotckoi
      • 27. September 2017 12:57
      • (bearbeitet)
      • Die Antwort wurde als Lösung markiert.

      С обычными массивами геморроя много, и то что Вам ответили выше - это лишь малая часть из преимуществ контейнеров типа 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. September 2017 14:29

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

          alex_lip
          • 28. September 2017 04:39
          • (bearbeitet)

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

          #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. September 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. September 2017 05:17

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

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

                Kommentare

                Nur autorisierte Benutzer können Kommentare posten.
                Bitte Anmelden oder Registrieren
                Letzte Kommentare
                A
                ALO1ZE19. Oktober 2024 08:19
                Fb3-Dateileser auf Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                ИМ
                Игорь Максимов5. Oktober 2024 07:51
                Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                d
                dblas55. Juli 2024 11:02
                QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                k
                kmssr8. Februar 2024 18:43
                Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                Jetzt im Forum diskutieren
                J
                JacobFib17. Oktober 2024 03:27
                добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
                JW
                Jhon Wick1. Oktober 2024 15:52
                Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
                КГ
                Кирилл Гусарев27. September 2024 09:09
                Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
                F
                Fynjy22. Juli 2024 04:15
                при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

                Folgen Sie uns in sozialen Netzwerken