Fehler in Anwendung 0xc0000005

Meiosch

Cadet 2nd Year
Registriert
Dez. 2003
Beiträge
21
Hallo zusammen,

ich arbeite unter Windows Vista. Als IDE verwende ich Eclipse 3.4 mit einer integrierten
QT 4.4.1 und MinGW 3.4.2 . Dazu verwende ich die Bibliothek Qwt 5.1.1 .
Mein Problem ist die Fehlermeldung im Threadtitel. Nach einigem Hin und Her ist es mir gelungen, die Bibliothek Qwt für mich verwendbar zu machen.
Allerdings erhalte ich jetzt beim Starten der Programme die Fehlermeldung:
Die Anwendung konnte nicht richtig initialisiert werden(0xc0000005).

Ich kann es nicht nachvollziehen. Es funktionieren sogar die Beispiele, die zu dieser Bibliothek mitgeliefert wurden.
Hier seht ihr den doch recht schlichten Programmcode ..

Die main.cpp in der das Widget erzeugt und per show() angezeigt wird lasse ich weg. Diese wurde ncht verändert.

ok, plotwidget.cpp :
Code:
#include "Plot.h"
#include "plotwidget.h"

PlotWidget::PlotWidget(QWidget *parent)
    : QWidget(parent)
{
	plot = new MyPlot(this);

	ui.setupUi(this);
}

PlotWidget::~PlotWidget()
{

}

die dazugehörige plotwidget.h
Code:
#ifndef PLOTWIDGET_H
#define PLOTWIDGET_H

#include <QtGui/QWidget>
#include "ui_plotwidget.h"

class MyPlot;

class PlotWidget : public QWidget
{
    Q_OBJECT

public:
    PlotWidget(QWidget *parent = 0);
    ~PlotWidget();

private:
	MyPlot *plot;
    Ui::PlotWidgetClass ui;
};

#endif // PLOTWIDGET_H

Nun die Plot.cpp
Code:
#include "Plot.h"

MyPlot::MyPlot(QWidget *parent):
	QwtPlot(parent)
{

}

MyPlot::~MyPlot()
{

}

und der Header dazu Plot.h
Code:
#ifndef PLOT_H_
#define PLOT_H_
#include <qwt_plot.h>

class MyPlot: public QwtPlot
{
	Q_OBJECT

public:
	MyPlot(QWidget* parent);
	~MyPlot();
};
#endif /* PLOT_H_ */

Über Hilfe wäre ich dankbar.


mfg Meiosch
 
Für mich sieht das alles ganz gut.
Mit dem Debugger bist du aber hoffentlich schon ran?

Dein Code ist angenehm minimalistisch, dass ich fast vermute, der Fehler liegt im Konstruktor von QwtPlot. Aber auch unwahrscheinlich. Sonst hätten das die Schreiberlinge von Qwt schon längst bemerkt.

Schon mal versucht einen QwtPlot direkt, also ohne den Umweg über MyPlot in dein PlotWidget zu pflanzen?
 
0xc0000005 = Access violation = Zugriffsverletzung

Du greifst auf einen Speicherbereich zu, der Dir (also Deiner Anwendung) nicht gehört. Ursache sind nicht initialisierte Zeiger oder Zeiger, die aus einem Speicherbereich lesen oder in einen schreiben, der Deiner Anwendung nicht zugewiesen ist.
 
Boron schrieb:
Für mich sieht das alles ganz gut.
Mit dem Debugger bist du aber hoffentlich schon ran?

Dein Code ist angenehm minimalistisch, dass ich fast vermute, der Fehler liegt im Konstruktor von QwtPlot. Aber auch unwahrscheinlich. Sonst hätten das die Schreiberlinge von Qwt schon längst bemerkt.

Schon mal versucht einen QwtPlot direkt, also ohne den Umweg über MyPlot in dein PlotWidget zu pflanzen?

Ja, ich habe das mal ausprobiert ohne die Extra-Klasse zu verwenden, da bekomme ich die gleiche Fehlermeldung.
Das mit dem Debugger ist so eine Sache muss ich zugeben, habs noch nicht getestet.
Und wenn ich ehrlich bin, wüsst ich aus dem Stehgreif grad nicht wie ich das machen soll :D.
Ich bin von Natur aus kein Programmierer. Aber durch mein Praxissemester bin mehr oder weniger zum Programmierer geworden :)

Edit: Ja die Anwendung ist so minimalistisch, da ich das Ganze erstmal allgemein zum Laufen bringen möchte. Ich bin "froh" endlich soweit zu sein, dass fehlerfrei kompiliert und sogar die
Bibliothek gefunden wird. :)
 
Zuletzt bearbeitet:
PlotWidget::PlotWidget(QWidget *parent)
: QWidget(parent)
{
plot = new MyPlot(this);

ui.setupUi(this);
}

Hier würde ich mal ansetzen. Du erstellst ein neues Objekt und gehst einfach davon aus, dass dieses auch erstellt wird. Auch der Aufruf mit ui.setupUi() könnte den Fehler hervorrufen. Für das erste Problem sollte irgendetwas in der Form

plot = new MyPlot(this);
if (!plot)
Reaktion auf Fehler (z.B. throw ExceptionPlot)

gemacht werden.

Bei der zweiten Sachen bin mir jetzt selbst auch nicht so sicher, da ich mit Qt nicht soviel zu tun habe. Aber müsste sich ui.setupUI() auf Fensterobjekte beziehen und nicht auf die Fensterelemente? Wenn der this-Zeiger nur QObject erwartet, erhält man keinen Fehler beim kompilieren. Beide Klassen (QWidget und QMainWindow) werden schließlich von der selben Basis abgeleitet.
 
Microarchitekt schrieb:
Hier würde ich mal ansetzen. Du erstellst ein neues Objekt und gehst einfach davon aus, dass dieses auch erstellt wird. [...]

plot = new MyPlot(this);
if (!plot)
Reaktion auf Fehler (z.B. throw ExceptionPlot)

Das ist typischer "unreachable Code". new muss (!) erfolgreich sein oder eine bad_alloc-Exception werfen oder aber der Konstruktor eine Exception, wenn er fehlschlägt. Anders geht's nur mit new (std::nothrow) MyPlot(this).
 
Ich würde mich da auf die Konformität des Compilers zum Standard nicht so bedingungslos verlassen. Es gab und gibt immer noch Compiler, die sich nicht komplett an den ISO Standard halten. Daher würde ich dazu raten aus Sicherheitsgründen noch selbst auf Erfolg der Speicheranforderung zu prüfen.

Ich habe auch mal nach dem Fehler ein wenig gesucht. Dieser Fehlercode tritt wohl auch auf, wenn eine DLL nicht gefunden wird bzw. nicht richtig angesprochen werden kann. Könnte es daher sein, dass zwischen den Beispielprojekten und diesem Projekt bei den Projekteinstellungen etwas anders ist? Daher sollten vielleicht auch mal die Pfadeinstellungen und die Linkeroption für einzubindende Bibliotheken im Projekt kontrolliert werden.
 
Ok, also ich habe das Problem nun halbwegs lösen können. Zwar ist das Ganze nur über die Kommandozeile lauffähig. Es ist aber ein Anfang. :)

Was habe ich gemacht?
Ich habe mir über den Autmated MinGW Installer 5.1.4 gezogen und alles installiert was ich brauche. Dazu passend hab ich noch den gdb 6.8 draufgepackt.

Dann habe ich mir den QT 4.4.2 Sourcecode heruntergeladen und mit MinGW gebaut.
QWT hab ich auch nochmal mit MinGW gebaut. Dabei habe ich dieses mal in der qwtconfig.pri die option "config += build_all" aktiviert. (So schlau war ich vorher nicht)

Hm ja was noch .. die Pfade waren ja gesetzt (include, lib usw), allerdings habe ich noch
äquivalent zum QTDIR ein QWTDIR hinzugefügt.
Naja und dann habe ich getestet obs klappt. In Eclipse geht es nicht, selbst das Debuggen haut nicht richtig hin, da mir Vista dazwischen funkt.
Also bin ich einfach mal in die Kommandozeile gegangen und hab die im Debug-Ordner erzeugte *.exe ausgeführt .. und hah es geht.

Falls jetzt jemand noch nen Tipp hat, wie das ganze dann auch unter Eclipse lauffähig wird, dann wär ich dankbar. Wenn ich selbst drauf komme, wirds hier bald stehen.

Danke für eure Ideen und Lösungsansätze
 
Zurück
Oben