Seite 1 von 1

QImage Zugriffsverletzung beim Laden eines Bitmaps

Verfasst: 26. April 2010 12:04
von Gorn
Hi, versuche grade auf ein Bitmap zuzugreifen, verwende dafür QImage. Ich habe jetzt allerdings das Problem, dass er scheinbar beim auslesen der Daten Probleme hat, leider weiß ich nicht genau woran das liegt. Interessant ist, dass das Problem jeweils an einer anderen Stelle auftritt, abhängig davon ob ich eine direkte Variable oder eine Pointer verwende. Unter beiden Versionen hängt er allerdings irgendwo innerhalb der QImage Routine mit einer Zugriffsverletzung.

Hier mal der Code und die jeweilige Stelle wo er Unterbricht:

Code: Alles auswählen

QImage* displayWidget::loadBMP(QString filename){
	if(filename == "")
		return NULL;

	QFile f(filename);
	if(!f.open(QIODevice::ReadOnly))
		return NULL;

	f.close();
	QImage img;
	if(img.load(filename, "BMP"))
		return &img;
	else return NULL;
}
Unterbrechung im QImage in der Zeile:
Image_Converter converter = *converterPtr;

Code: Alles auswählen

QImage QImage::convertToFormat(Format format, Qt::ImageConversionFlags flags) const
{
    if (!d || d->format == format)
        return *this;

    if (format == Format_Invalid || d->format == Format_Invalid)
        return QImage();

    const Image_Converter *converterPtr = &converter_map[d->format][format];
    Image_Converter converter = *converterPtr;
    if (converter) {
        QImage image(d->width, d->height, format);

        QIMAGE_SANITYCHECK_MEMORY(image);

        image.setDotsPerMeterY(dotsPerMeterY());
        image.setDotsPerMeterX(dotsPerMeterX());
[...]
Bei der Version mit Pointer sieht das ganze so aus:

Code: Alles auswählen

QImage* displayWidget::loadBMP(QString filename){
	if(filename == "")
		return NULL;

	QFile f(filename);
	if(!f.open(QIODevice::ReadOnly))
		return NULL;

	f.close();
	QImage* img;
	if(img->load(filename, "BMP"))
		return img;
	else return NULL;
}
Unterbrechung im QImage in der Zeile:
d = image.d;

Code: Alles auswählen

QImage &QImage::operator=(const QImage &image)
{
    if (image.d)
        image.d->ref.ref();
    if (d && !d->ref.deref())
        delete d;
    d = image.d;
    return *this;
}
Die Datei ist vorhanden und er zeigt ja auch überall an das sie nicht leer ist, die Unterbrechungen sind die selben wenn ich das Format weglasse und den default-Wert verwende.

In beiden Fällen ist es eine Zugriffsverletzung beim Schreiben.

Verfasst: 26. April 2010 12:13
von franzf
Das hat nix zu tun mit Qt.

Code: Alles auswählen

QImage* getImg() {
    QImage img;
    return &img;
}
Du gibst eine Referenz auf ein nach dieser Funktion nicht mehr existentes Objekt zurück. Deshalb "Bumm" ;)

Code: Alles auswählen

QImage* getImg() {
    QImage* img;
    img->load(dinges);
    return img;
}
img ist NICHT INITIALISIERT! Es ist ein Pointer ins Nirvana. -> "Bumm".

Entweder die zweite Version und ordentlich initialisieren

Code: Alles auswählen

QImage* img = new QImage;
oder eine Kopie zurück geben

Code: Alles auswählen

QImage getImg() {
    QImage img;
    img.load(dings);
    return img;
}

Verfasst: 26. April 2010 13:09
von Gorn
klar, hab ich wieder den wald vor lauter bäumen nich gesehn ~

danke^^