PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einlesen von ini-Files



Kirsche
15-10-2005, 09:53
Hallo Leute,

ich lese aus einem .ini-File wichtige Pfade für mein Programm aus, z.B. wo bestimmte Daten liegen. Wenn diese Datei aus irgendeinem Grund fehlt, gebe ich eine Fehlermeldung aus. Anschließend stürzt mein Programm ab. :(
Vermutlich wird auf etwas zugegriffen, was es nicht gibt. Wie kann ich das verhindern? Ich habe schon versucht, dass Programm einfach wieder zu schließen, aber dadurch wird ein close-Event ausgelöst. Dabei werden Variablen abgefragt, die es noch gar nicht gibt. Also stürzt das Programm wieder ab. Am besten wäre es, wenn nur getestet wird, ob die Datei vorhanden und lesbar ist und dann das Programm gar nicht gestartet wird. Ich habe also den Test schon in main.cpp gemacht, aber auch dann stürzt es ab.

Wie und wo macht man diese Abfrage sinnvollerweise?

Schöne Grüße,

SeeksTheMoon
15-10-2005, 10:32
Du kannst es mit Exceptions abfangen.
Wenn auf noch nicht angelegten Speicher zugegriffen wird (z.B. bei Arrays, char*), dann musst Du das auch in einer Exception fangen oder den Quellcode umschreiben und ggf. mit Tests versehen.

Kirsche
15-10-2005, 11:51
Hallo SeeksTheMoon,

ich benutze C++ und Qt.

Hier der Code in main.cpp:

int main( int argc, char** argv )
{
qInstallMsgHandler( myMessageOutput );

QApplication app( argc, argv );

MainWindow mainwindow;
app.setMainWidget(&mainwindow);

mainwindow.show();

return app.exec();
}

Ich habe mir gedacht, dass ich gleich am Anfang mit Hilfe von QFileDialog teste, ob meine Datei vorhanden und lesbar ist. Ich habe es jetzt noch einmal versucht, und nun klappt es. Ich denke, der Fehler war, dass ich keine QApplication benutzt habe.

Jetzt sieht der Code so aus:

int main( int argc, char** argv )
{
qInstallMsgHandler( myMessageOutput );

QApplication app( argc, argv );

QFileInfo info( "Analyzer.txt" );

if( info.exists() == false() || info.isReadable() == false )
{
QMessageBox* messageBox = new QMessageBox( "Critical error", "Could not read \'Analyzer.txt\'!", QMessageBox::Critical, QMessageBox::Ok , QMessageBox::NoButton, QMessageBox::NoButton, 0, 0, true );

app.setMainWidget( messageBox );
messageBox->show();
return app.exec();
}

MainWindow mainwindow;
app.setMainWidget(&mainwindow);
mainwindow.show();
return app.exec();
}

So müsste es doch ok sein, oder? Es stürzt jedenfalls nicht mehr ab. Ich könnte auch noch ein "else" um den zweiten Fall schreiben.

Schöne Grüße,

anda_skoa
15-10-2005, 12:10
QMessageBox::critical()
Viel einfacher zu benutzen

In deinem Originalcode dürfte der Fehler in deiner MainWindow Klasse sein.

Häufiger Grund ist eine nicht initialisierte Variable, also wenn man zB einen Pointer nicht in der Initialisierungsliste des Konstruktors auf 0 setzt, weil man "ohnehin" im Konstruktor den echten Wert anlegt, aber dann vergißt, daß eine andere Funktion eventuell schon vorher drauf zugreift.

Die Daten scheinen ja wichtig zu sein, aber willst du wirklich beenden falls sie nicht vorhanden sind?
Kann der Benutzer nicht im Programm diese Werte eingeben/setzen?

Ciao,
_

P.S.: da du unlängst mal stilistische Fragen hattest:


if( info.exists() == false() || info.isReadable() == false )

schreibt man eigentlich nicht, der Rückgabewert der beiden Methoden ist schon vom Typ bool


if( !info.exists() || !info.isReadable() )

oder bei Vertauschung von then und else Zweig


if( info.exists() && info.isReadable() )


Ciao,
_

Kirsche
15-10-2005, 13:03
Hallo anda_skoa,

ich wollte QMessageBox::critical() benutzen, aber ich wusste nicht, wie ich diesen Fenster dann als "mainwindow" setze. Darum habe ich den umständlicheren Weg genommen.

Die Datei ist die ini-Datei, die die Pfade setzt. Ich glaube, die zukünftigen Benutzer wissen nicht, was sie machen sollen, wenn die Pfade nicht gesetzt sind. Darum starte ich das Programm gar nicht erst. Wer sich auskennt, kann die Pfade per Hand in der Textdatei setzen. Im Grunde genommen ist eh jeder selbst Schuld, der die ini-Datei löscht oder darin Änderungen vornimmt. Wenn die Datei aus einem anderen Grund nicht lesbar ist, liegt vermutlich sogar ein ernsthafteres Problem vor.

Ich benutze info.exists() == false(), weil ich finde, dass man es so leichter versteht. Ich habe auch irgendwo gelesen, dass man es so machen soll, weil dann sofort klar ist, was gemeint ist.

Schöne Grüße,

anda_skoa
15-10-2005, 15:58
ich wollte QMessageBox::critical() benutzen, aber ich wusste nicht, wie ich diesen Fenster dann als "mainwindow" setze. Darum habe ich den umständlicheren Weg genommen.

Du brauchst es nicht als mainwindow zu setzen.
Wenn critical() returned, wurde schon alles erledigt. Das ist im Grunde ein modaler mit exec() ausgeführter Dialog.



Die Datei ist die ini-Datei, die die Pfade setzt. Ich glaube, die zukünftigen Benutzer wissen nicht, was sie machen sollen, wenn die Pfade nicht gesetzt sind. Darum starte ich das Programm gar nicht erst. Wer sich auskennt, kann die Pfade per Hand in der Textdatei setzen.

Gibt es da keine Defaultpfade?



Ich benutze info.exists() == false(), weil ich finde, dass man es so leichter versteht.

Wenn du es so leichter liest, solltest du es auch so benutzen.

Wollte nur anmerken daß es nicht sehr üblich ist, weil meisten der Methodenname bereits das "Verb des Satzes" ist.
In diesem Fall "exists"

Aber wie schon im anderen Thread gesagt wurde, wichtig ist immer daß man selber gut mit dem Stil zurecht kommt.

Ciao,
_

Kirsche
15-10-2005, 16:21
Hallo anda_skoa,

es gibt keine Default-Pfade. Ich weiß ja nicht, wohin der Benutzer das Programm installiert.

Frage am Rande: Wie erstelle ich ein Installationsprogramm für mein Programm?

Schöne Grüße,

anda_skoa
15-10-2005, 16:37
es gibt keine Default-Pfade. Ich weiß ja nicht, wohin der Benutzer das Programm installiert.

QApplication:applicationDirPath() und applicatonFilePath()



Frage am Rande: Wie erstelle ich ein Installationsprogramm für mein Programm?

Mit einem Installergenerator, zum Beispiel NSIS http://nsis.sourceforge.net/

Ciao,
_

Kirsche
15-10-2005, 17:01
Hallo anda_skoa,

super, vielen Dank!

Schöne Grüße,

Kirsche
15-10-2005, 19:13
Hallo anda_skoa,

nsis ist echt genial! Das war ein toller Tipp! :D

Innerhalb kürzester Zeit habe ich mein Installationsprogramm zusammengebastelt, ohne mich wirklich auszukennen. Die Beschreibungen und Beispiele sind super. Da ich nur ein ganz einfaches Installationsprogramm brauche, geht das ohne Vorkenntnisse wirklich einfach. Wenn ich was Kompliziertes brauche, muss ich mich wohl gründlich einarbeiten, aber für meine Zwecke reicht mein (Un)Wissen momentan noch.

Schöne Grüße,