Dynamisches Feld und User Interface



  • Hallo,

    ich möchte das dynamische Feld pAnzahl erzeugen.
    Es soll die Größe iAnzahl haben.

    Bei einem Konsolenprogramm ist das kein Problem:
    int *pAnzahl;
    int iAnzahl;
    pAnzahl = new int [iAnzahl];

    Bei einer Qt-Widgets-Anwendung jedoch schon.
    An der stelle, wo das Feld erzeugt werden soll,
    also bei:
    pAnzahl = new int [iAnzahl];
    erscheinen diese Fehlermeldungen:
    -C++ requires a type specifier for all declarations
    -duplicate member 'pAnzahl'

    In der mainwindow.ui Datei habe ich 3 Elemente:
    -lineEdit um iAnzahl einzulesen.
    -pushButton um iAnzahl über lineEdit einzulesen und label auszugeben.
    -label um iAnzahl anzuzeigen.

    Die mainwindow.h Datei:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QMainWindow>

    namespace Ui {
    class MainWindow;
    }

    class MainWindow : public QMainWindow
    {
    Q_OBJECT

    public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    private:
    Ui::MainWindow *ui;
    int iAnzahl;

    int *pAnzahl;
    pAnzahl = new int [iAnzahl];     //Hier liegt das Problem (pAnzahl ist rot unterstrichen)
                                     //Diese Zeile führt auch zu Fehlermeldungen in der mainwindow.cpp Datei
    

    private slots:
    void pushButtonClicked();

    };

    #endif // MAINWINDOW_H

    Die mainwindow.cpp Datei:

    #include "mainwindow.h"
    #include "ui_mainwindow.h"

    MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
    {
    ui->setupUi(this);
    connect(ui -> pushButton, SIGNAL(clicked()), SLOT(pushButtonClicked()));
    }

    MainWindow::~MainWindow()
    {
    delete ui;
    }

    void MainWindow::pushButtonClicked()
    {
    iAnzahl = ui -> lineEdit -> text().toInt(); //iAnzahl über das Eingabefeld definieren
    ui -> label -> setNum(iAnzahl); //iAnzahl wird in label Angezeigt (sowite funktioniert es)
    }



  • Das Problem hat nichts mit Qt oder Widgets zu tun, sondern mit Klassen. Bevor du mit Fenstern spielst solltest du Klassen verstanden haben.

    Benutze std::vector, nicht new[].



  • Du müßtest den Code pAnzahl = new int [iAnzahl]; in den Konstruktor packen.
    Die Frage ist jedoch, wie iAnzahl initialisiert wird???

    Verwende besser std::vector<> oder aber die Qt-spezifische Klasse QVector.

    PS: Packe mal deinen Code in C++-Tags, damit man ihn besser lesen kann (über das 3-Punkte-Menü kannst du "Bearbeiten" auswählen).



  • iAnzahl wird hier initialisiert:

    void MainWindow::pushButtonClicked()
    {
        iAnzahl = ui -> lineEdit -> text().toInt();  //iAnzahl wird initialisiert
        ui -> label -> setNum(iAnzahl);
    }
    

    Den Code

    pAnzahl = new int [iAnzahl];
    

    habe ich jetzt im Konstruktor. Jetzt kommt ein Debug Error ohne beschreibung des Problems.
    abort() has been called



  • iAnzahl ist auch noch nicht initialisiert.
    Im moment sieht dein Programmablauf so aus:

    Baue MainWindow (Constructor)
    -> erstelle pAnzahl der Größe iAnzahl
    -> Wenn der Button geklickt wird: setze einen Wert für iAnzahl

    Offensichtlich etwas falsche Reihenfolge 🙂

    Ich schließe mich auch den anderen an, bitte vermeide Arrays, die sind viel zu unsicher. Benutz einfach einen std::vector oder QVector

    Dein Code dafür wäre:
    Klasse:

    #include <vector>
    
    class MainWindow ...
    {
    ...
    
    private:
    std::vector<int> pAnzahl;
    };
    

    Constructor:

    iAnzahl = 0;  //Hier initialisiert du iAnzahl
    pAnzahl = std::vector<int>(iAnzahl); //Hier wird ein vector mit iAnzahl (also 0) Elementen erzeugt
    

    pushButtonClicked():

    iAnzahl = ui -> lineEdit -> text().toInt();  //iAnzahl wird neu gesetzt
    ui -> label -> setNum(iAnzahl);
    pAnzahl.resize(iAnzahl); //Hier setzt du den vector auf die neue Größe
    


  • Super das funktioniert. Vielen Dank! 🙂



  • Kein Problem.
    Noch ein paar Tipps von mir:

    • les nach und versuch zu verstehen, was der vector ist und was er tut (z.B. auf cppreference.com)
    • verstehe deinen Programmablauf
    • beschäftige dich mit c++ und der STL (c++ Standard Library, der vector gehört dazu, daher auch das std::)
    • beschäftige dich mit Klassen

    Nur so lernst du wirklich programmieren, vor allem die STL ist wichtig. Nur vorgekaute Lösungen wie meine bringen dich nicht weiter, du musst verstehen, was genau du da tust.
    Vor ein paar Jahren stand ich genau an dem gleichen Punkt, ich hatte ein bisschen Basis"wissen" ("Es gibt Klassen, Variablen, Funktionen und Pointer...") und kannte die STL nicht. Daher meine Tipps, damit du einen Einstiegspunkt hast...