Übergabe eines Objekt-Arrays an einen Slot? [Problem]

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Übergabe eines Objekt-Arrays an einen Slot? [Problem]

Beitrag von omegano »

Sinn des Programms, ich möchte das mein Programm ein Objekt-Array durchsucht und die Ergebnisse in nen Textfeld postet soweit kein Problem. Aber...

Ich hab das Problem das ich in unten genannten Code einen Segmentation Fault kriege. Ich denke mal es liegt daran das ich dem slot search() nicht das array mit übergeben habe. Ich hab auch mein Qt Buch schonmal durchgewälzt und keine Ahnung wie ich das machen soll. Ich werde wohl irgendwie einen SIGNAL schreiben müssen das den selben Parameter wie SLOT hat das habe ich schon herausgefunden. Aber wie könnte sowas hier Sinnvoll aussehen? Und was ich mich auch frage durch die Methode getDatabase(Data* myd[]) initialisiere ich ja das array myd[] mit den objekten, das funktioniert soweit auch alles ganz gut. Aber wieso muss ich überhaupt dem search slot das Objekt Array übergeben. Es ist doch ein Attribut dieser Klasse somit müsste das doch wenn es im Konstruktor initialsiert wurde, verfügbar und mit den Daten gefüllt sein.

Header Datei

Code: Alles auswählen

#ifndef MAINFORM_H
#define MAINFORM_H

#include <QtGui>
#include <QString>
#include <QFile>
#include "data.h"
#include "ui_mainwindow.h"
#define LENGTH 100000

class MForm : public QMainWindow, private Ui::MainWindow {
    Q_OBJECT
public:
    Data* myd[];
    MForm();
    ~MForm(){}
protected slots:
    void search();
    void save();

private:
    void getDatabase(Data* myd[]);
};

#endif // MAINFORM_H
Quellcode-Datei:

Ich hab den Code um die Sachen gekürzt die Funktionieren

Code: Alles auswählen

#include "mainForm.h"
#include "db.h"

MForm::MForm(){
    //Gui Initialisieren
    setupUi(this);

    //Daten
    Data* myd[LENGTH];
    for(int n=0; n<LENGTH; n++){
        myd[n] = NULL;
    }
    getDatabase(myd);


    //connects
    connect( pushButton , SIGNAL(clicked()),
             this , SLOT(search()) );
    connect( lineEdit, SIGNAL(returnPressed()),
             this , SLOT(search()) );
    connect( pushButton_2 , SIGNAL(clicked()),
             this , SLOT(save()) );
}

void MForm::search(){
    QString str = lineEdit->text();
    QString buf,temp;
    str=str.toLower();
    textEdit->clear();
    for(int i=0 ; i<LENGTH ; i++){
        if( (myd[i]->owner.toLower()).indexOf(str)!= -1 ){
            buf.clear();
            buf+=buf.setNum(myd[i]->gala)+":";
            buf+=buf.setNum(myd[i]->system)+":";
            buf+=buf.setNum(myd[i]->plani)+" / ";
            buf+="von "+myd[i]->owner+"("+ myd[i]->points +" / "+myd[i]->az+")";
            buf+=" Planetenname: "+myd[i]->name;
            buf+=" Allianz: "+myd[i]->alli+"\n";
            temp=textEdit->toPlainText();
            temp.append(buf);
            textEdit->setPlainText(temp);
        }
    }
}

}
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Übergabe eines Objekt-Arrays an einen Slot? [Problem]

Beitrag von franzf »

Du hast dir doch schon nen Member angelegt. Füll den, dann sollte doch alles passen.
omegano
Beiträge: 21
Registriert: 18. Mai 2012 18:32

Re: Übergabe eines Objekt-Arrays an einen Slot? [Problem] GE

Beitrag von omegano »

Also es lag erstmal daran das ich eine lokale Variable durch den Aufruf im Konstruktor über das Attribut gelegt habe, diese dann initialisiert habe. Somit war das was bei search durchsucht wurde katastrophaler MIST.
Desweiteren löste das if mit dem toLower den Segfault aus, weil wenn myd==NULL kann ich toLower auf ein Attribut von myd vergessen. Somit hab ich die beiden if's geschachtelt und gut ist. Falls es irgendwem nochma helfen sollte poste ich hier nochmal den Berichtigten Code.

Code: Alles auswählen

#include "mainForm.h"
#include "db.h"

MForm::MForm(){
    //Gui Initialisieren
    setupUi(this);

    //Daten
    //Data* myd[LENGTH]; <- das war die lokale variable die den mist eingeleitet hat
    for(int n=0; n<LENGTH; n++){
       myd[n] = NULL;
    }
    getDatabase(myd);


    //connects
    connect( pushButton , SIGNAL(clicked()),
             this , SLOT(search()) );
    connect( lineEdit, SIGNAL(returnPressed()),
             this , SLOT(search()) );
    connect( pushButton_2 , SIGNAL(clicked()),
             this , SLOT(save()) );
}

void MForm::search(){
    QString str = lineEdit->text();
    QString buf,temp;
    str=str.toLower();
    textEdit->clear();
    for(int i=0 ; i<LENGTH-1 ; i++){
        if(myd[i]!=NULL){
            if((myd[i]->owner.toLower()).indexOf(str)!= -1){ //führte solange es mit im ersten if stand zum segfault
                buf.clear();
                buf=buf.setNum(myd[i]->gala)+":";
                buf+=QString::number(myd[i]->system)+":";
                buf+=QString::number(myd[i]->plani)+" / ";
                buf+="von "+myd[i]->owner+"(Punkte: "+ QString::number(myd[i]->points) +" / AZ: "+QString::number(myd[i]->az)+")";
                buf+=" Planetenname: "+myd[i]->name;
                buf+=" / Allianz: "+myd[i]->alli+"\n";
                temp=textEdit->toPlainText();
                temp.append(buf);
                textEdit->setPlainText(temp);
            }
        }
    }
}

void MForm::save(){
    QString fileName = QFileDialog::getSaveFileName(this, "Bitte eine Datei auswählen",
                                                    QDir::homePath(), "Dokumente (*.txt)");
    QFile file(fileName);
    if (file.open(QIODevice::WriteOnly | QIODevice::Text)){
        file.write(textEdit->toPlainText().toUtf8());
        statusBar()->showMessage(tr("Daten wurden gespeichert!"),5000);
    }
    file.close();
}

void MForm::getDatabase(Data *myd[]){
    QString fileName = "DB.csv";
    QFile file(fileName);
    int n=0;
    
    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
        QString buf = QString::fromUtf8(file.readLine());
        while(!file.atEnd()&&n<LENGTH) {
            
            //Objekt erzeugen und Datensatz lesen
            myd[n]=new Data();
            buf = QString::fromUtf8(file.readLine());

            // Objekt zusammenbauen
            myd[n]->gala=( (buf.mid(0,( buf.indexOf(";")) ) ).toInt() );
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->system=( (buf.mid(0,( buf.indexOf(";")) ) ).toInt() );
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->plani=( (buf.mid(0,( buf.indexOf(";")) ) ).toInt() );
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->owner=buf.mid(0,( buf.indexOf(";")) ) ;
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->name=buf.mid(0,( buf.indexOf(";")) ) ;
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->points=buf.mid(0,( buf.indexOf(";")) ).toInt() ;
            buf=buf.mid(buf.indexOf(";")+1);

            myd[n]->alli=buf;
            myd[n]->setAZ();
            n++;
        }
    }
    if(file.error()) {
        QMessageBox::information(0,tr("Error Beim Filelesen!"),tr("blaaaaaaa"));
    }
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Übergabe eines Objekt-Arrays an einen Slot? [Problem]

Beitrag von Christian81 »

Mit C++ (z.B. std::vector wäre das nicht passiert...)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten