Seite 1 von 1
QT4: QString in const char* umwandeln
Verfasst: 20. Dezember 2006 12:13
von Xander77
Hallo,
ich möchte ein QString-Objekt als const char* auslesen. Wenn ich toAscii() verwende, steht in meiner Variable nur Schrott und wenn ich den Umweg über std::string mit toStdString() gehe, stürzt das Programm beim destruieren des std::string-Objektes ab!
Mache ich da etwas falsch?
Re: QT4: QString in const char* umwandeln
Verfasst: 20. Dezember 2006 13:01
von Christian81
Xander77 hat geschrieben:Mache ich da etwas falsch?
Du liest keine
DOKU. Dort würde man nämlich sehen dass toAscii() mitnichten const char* zurückliefert sondern QByteArray.
Doch, hab ich gelesen!
Verfasst: 20. Dezember 2006 13:18
von Xander77
Hab natürlich ein QByteArray gehabt und wollte aus dem dann ein char-Array machen. Aber das ist meiner Meinung nach schon ziehmlich unpraktisch. Eigentlich müsste man ja mit toStdString() ein std::string-Objekt bekommen, aus dem man dann einfach mit c_str() ein const char* machen kann. Im Prinzip funktioniert das auch, aber ich habe den Verdacht, dass da in QT ein Fehler ist!
Sobald ich irgendwo toStdString() aufrufe, stürzt am Ende des Gültigkeitsbereichs der Variable das Programm mit folgender Fehlermeldung ab:
HEAP[PrintSimu.exe]: Invalid Address specified to RtlValidateHeap( 01090000, 016B47C8 )
Laut Kontext passiert das beim delete von std::basic_string!
Verfasst: 20. Dezember 2006 13:31
von Christian81
QString:toAscii().data() ist also umständlicher als QString::toStdString().c_str(). Wow. Zumal beides die Codierung wegschmeisst und nur für Debug-Zwecke benutzbar ist.
Dein Programm stürzt ab da Du, wie im anderen Thread von mir schon angemerkt, nicht qmake benutzt. Deshalb benutzt Du die falschen Libs im Debug-Modus. Dort muss nämlich QtCored4.lib anstatt QtCore4.lib gelinkt werden. Analog dazu die anderen Qt-Libs
Was heißt nur zu Debug-Zwecken benutzbar???
Verfasst: 20. Dezember 2006 13:41
von Xander77
Man wird doch wohl aus einem QString einen char* oder ein std::string machen können! Das ging ja früher (QT 3.3.4) auch!!!
Re: Was heißt nur zu Debug-Zwecken benutzbar???
Verfasst: 20. Dezember 2006 13:43
von Christian81
Xander77 hat geschrieben:Man wird doch wohl aus einem QString einen char* oder ein std::string machen können!
Habe ich irgendwas Gegenteiliges behauptet? Steht doch alles da...
Übrigens...
Verfasst: 20. Dezember 2006 13:47
von Xander77
...ich habe die Bibliotheken entsprechend geändert, aber das Programm stürzt immernoch mit der gleichen Meldung ab!!!

Verfasst: 20. Dezember 2006 13:55
von Christian81
Nimm qmake oder sonst einen ordentlichen Makefile-Generator damit wir Fehler in den VCProj-Einstellungen ausschliessen können.
Hast du auch /MDd anstatt /MD als Compilerflag benutzt, neu kompiliert und gelinkt? Und hast Du es mal mit toAscii().data() ausprobiert? Ein kleines Besipiel wäre auch nicht schlecht.
Jetzt hat's geklappt!
Verfasst: 20. Dezember 2006 13:56
von Xander77
Ich hatte eine Bibliothek vergessen! Danke für Deine Geduld!

Re: Jetzt hat's geklappt!
Verfasst: 20. Dezember 2006 14:01
von Christian81
Xander77 hat geschrieben:Danke für Deine Geduld!

Hast sie arg strapaziert...
btw: Am Anfang fand ich die neue toAscii() - Funktion auch nicht so prickelnd. Aber wenn man es sich genau überlegt, ist es so wesentlich besser. Wie gesagt - toAscii() und toStdString() kann man eh nur zum debuggen benutzen (und da gibts dann imho auch qout & qDebug()) da bei dieser Umwandlung unweigerlich die Kodierung verloren geht.
Wie machst Du das dann sonst?
Verfasst: 20. Dezember 2006 14:08
von Xander77
Wie kriegst Du denn dann einen char* oder std::string aus einem QString-Objekt (nicht zum Debuggen)?
Re: Wie machst Du das dann sonst?
Verfasst: 20. Dezember 2006 14:11
von Christian81
Xander77 hat geschrieben:Wie kriegst Du denn dann einen char* oder std::string aus einem QString-Objekt (nicht zum Debuggen)?
Wie ich oben schon sagte - toAscii().data() - also noch ein .data() anhängen.
Danke!
Verfasst: 20. Dezember 2006 14:18
von Xander77
Naja, ich werd mich wohl erst noch an die Neuerungen in QT4 gewöhnen müssen!
Also, danke nochmals!
Verfasst: 20. Dezember 2006 14:19
von Christian81
Ach ja, es gibt auch noch qPrintable() - ist ein Wrapper für .toAscii().data().