Programmabsturz bei Signalauslösung

Alles rund um die Programmierung mit Qt
Antworten
LonelyPixel
Beiträge: 23
Registriert: 5. Juli 2008 23:21

Programmabsturz bei Signalauslösung

Beitrag von LonelyPixel »

Hallo,

ich habe ein Programm, in dem aus einer Klasse heraus ein Signal eines Objekts mit einem Slot eines anderen Unterobjekts verbunden wird. Die Verbindung funktioniert noch, da gibt es keinen Fehler. Wenn das Signal dann später aber ausgelöst wird, stürzt das Programm sofort ab. Es wird weder der Code nach dem emit, noch der Code in der Slot-Methode aufgerufen. Es handelt sich hier um einen Debug-Build meines Programms, erstellt mit Qt Creator 2.0.1 und Qt 4.3.1 unter OpenSUSE 10.3 (letztere beide sind Projektanforderungen und können nicht geändert werden).

Die Verbindung sieht etwa so aus:

Code: Alles auswählen

class Objects {
public:
    static MyStaticObject s_sender;
}

QObject::connect(&Objects::s_sender, SIGNAL(statusHasChanged(unsigned int, bool*)), SLOT(onStatusHasChanged(unsigned int, bool*)));
Das Programm hält mit SIGSEGV an folgender Stelle an:

Code: Alles auswählen

// SIGNAL 0
void MyClass::statusHasChanged(unsigned int _t1, bool * _t2)
{
    void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) };
    QMetaObject::activate(this, &staticMetaObject, 0, 1, _a);
}
Dieser Code stammt aus einer generierten MOC-Datei wie moc_MyClass.cpp. Also ich hab den Code nicht verbrochen. Noch dazu ist die activate-Methode undokumentiert. Was tut die überhaupt?

Der Fehler tritt in der Zeile mit "QMetaObject" auf. Was ist da passiert? Ich kann hier keinen Fehler erkennen.

(Edit: Beitrag aktualisiert und verkürzt.)
Zuletzt geändert von LonelyPixel am 17. September 2010 16:28, insgesamt 2-mal geändert.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Ich kenn mich mit C++ zwar nur wenig aus, aber was zum Teufel tust du da?
Diese ganzen Cast sind doch ganz ganz ganz sicher nicht nötig.
Dann kontrolliere doch mal, ob in a_ irgendwas sinnvolles drin steht?

a_ ist doch ein Pointer auf ein Pointer oder? Also ein Array von Pointer.

// edit
Ach der Code ist nicht von dir. Na dann löschen und selbst schreiben ;)

(Das erklärt auch den Unterstrich nach den Variablen)
LonelyPixel
Beiträge: 23
Registriert: 5. Juli 2008 23:21

Beitrag von LonelyPixel »

Sorry, ich hab den Beitrag jetzt mehrmals aktualisiert, so wie er jetzt ist, sollte es passen. Die Funktion, in der der Fehler auftritt, wurde automatisch von Qt generiert. Sie gehört anscheinend zum Qt-Mechanismus der Signals und Slots. Die kann ich nicht löschen. Ich schätze mal, ich werde sie nur los, wenn ich keine Signals verwende. Aber dann brauch ich auch kein Qt mehr...
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Du macht ein Pointer auf ein bool? D.h. du willst in der Slot funktion die bool Variable in dem static Objekt welches das Signal aufruft verändern?

Also du machst da was falsch. Nicht von der Syntax oder Logig her. Ehr von der Art des Programmierens. Kann es nicht begründen, sagt mir mein Gefühl. Es gibt einen besseren Weg, der mehr Sinn macht und das selbe Resultat erzielt.

VErstehe von Qt leider nicht genug um die sagen zu können warum das ein Absturz gibt.
LonelyPixel
Beiträge: 23
Registriert: 5. Juli 2008 23:21

Beitrag von LonelyPixel »

Ach, wie liebe ich C++... (Ich bin auch nicht in C++ zuhause, mache eher C# oder PHP. Das hier ist ein Projekt in der Arbeit...)

Also um es kurz zu machen: Der Fehler ist verschwunden, wie er gekommen ist. Lösung: Einmal alles bereinigen und komplett neu erstellen. (Rebuild all) Danach hat es plötzlich funktioniert. Gott weiß warum. Vielleicht.
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Haha. Ja sowas passiert schonmal. Ein Projekt besteht aus mehreren Datein die natürlich nicht immer alle neu erstellt werden. Und da kann es schonmal passieren, dass irgendwo mal nicht mehr alles zusammen passt. Selten aber es kommt vor.
Antworten