PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Qt4] Speicherbelegungs Prbleme bei QByteArray



undefined
01-02-2008, 14:17
Wenn ich wie folgt meine Methode schreibe bekomme falsche Werte zurück.
Mein Problem hierbei ist das die Daten eine Aufbereitung für ein struct sind in dem alle Werte ein char * erwarten.


QStringList hjcmsxml::ServerConnectionData( const QString &attr )
{
int i;
QString find(attr);
QStringList retval;
QDomElement Element = findDomElementByAttr(find);
if ( !Element.hasAttribute("name") )
return retval;

QDomNodeList nodes = Element.childNodes();
for ( i = 0; i < nodes.count() ; i++ )
{
retval << nodes.item(i).firstChild().nodeValue().toLocal8Bit ().data();
}
return retval;
}


Jetzt habe ich zwei Stunden herum gebastelt bis ich zu dieser Lösung gekommen bin.
Das funktioniert wunderbar, ich frage mich aber trotzdem warum mir QByteArray oben so probleme macht?
Liegt es daran das es in einer Schleife liegt?
Und ist das ein größeres Problem was einen Bugs eintrag rechtfertigt?



QHash<QString, QByteArray> hjcmsxml::ServerConnectionData( QStringList fields, const QString &attr )
{
int i;
QString find(attr);
QHash<QString, QByteArray> retval;
QDomElement Element = findDomElementByAttr(find);
if ( !Element.hasAttribute("name") )
return retval;

if ( fields.size() < 1 )
return retval;

QDomNodeList nodes = Element.childNodes();
for ( i = 0; i < nodes.count() ; i++ )
{
foreach ( QString zeiger, fields )
{
QString cmd = nodes.item(i).nodeName().replace("server_","");
if (zeiger == cmd)
{
retval.insert( zeiger, nodes.item(i).firstChild().nodeValue().toLocal8Bit () );
}
}
}

return retval;
}
/* Lese Daten in QHash */
QHash<QString, QByteArray> data;
data = m_hjcmsxml->ServerConnectionData( options, act );

/* Starte Verbindung zum MySQL Server */
HJCMS_OPTIONS opts;
opts.host = data["host"].data();
opts.user = data["user"].data();
opts.password = data["password"].data();
opts.db = data["db"].data();
opts.port = data["port"].toUInt(&cv,10);
opts.unix_socket = data["socket"].data();

anda_skoa
03-02-2008, 23:33
Das liegt vermutlich an der doppelten Konversion UTF16->Local8Bit->UTF16, besonders am nicht spezifiziertem zweiten Schritt.

Aus welchem Grund willst du die Daten überhaupt doppelt konvertieren?
CPU Zeit verbrauchen?

Ciao,
_

undefined
04-02-2008, 13:33
Das liegt vermutlich an der doppelten Konversion UTF16->Local8Bit->UTF16, besonders am nicht spezifiziertem zweiten Schritt.

Aus welchem Grund willst du die Daten überhaupt doppelt konvertieren?
CPU Zeit verbrauchen?

Ciao,
_
Wieso doppelt Konvertieren?


# nodes.item(i).firstChild().QString().QByteArray(). char *
nodes.item(i).firstChild().nodeValue().toLocal8Bit ().data()

anda_skoa
04-02-2008, 17:36
Und dann wieder in einen QString wenn du den char* zur QStringList hinzufügst.

Konstruktor QString(const char*)

Mir ist nicht ganz klar, warum du den Rückgabewert von nodeValue() nicht direkt benutzt, sondern erst potentiell kostspielige Konvertierungen machst, nur um sie anschließend quasi "weg zu werfen". (ebenfalls potentiell kostspielig und potentiell fehlerbehaftet wenn Local8Bit nicht Latin1 ist)

Ciao,
_

undefined
05-02-2008, 20:51
Das ist auch nicht mein Original Code gewesen ich wollte im Forum kürzen und habe einen Bock reingebaut. Mein Original Code war nur QString in QStringList. In einer Späteren Methode - wo ich das struct fütterer hatte ich eine for schleife mit einer switch Anweisung wo ich nach char * gewandelt habe.
Aber egal das Problem tritt nur auf wenn ich QByteArray().data() in einer Schleife verwende. Ich werde das noch genauer unter die Lupe nehmen wenn ich mehr zeit habe.

anda_skoa
06-02-2008, 14:12
Vielleicht benutzt du den char* nicht sofort, bzw. hast das strcpy/strncpy vergessen.

Ciao,
_