Anzeige:
Ergebnis 1 bis 6 von 6

Thema: [Qt4] Speicherbelegungs Prbleme bei QByteArray

  1. #1
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255

    [Qt4] Speicherbelegungs Prbleme bei QByteArray

    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.
    PHP-Code:
    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 ( 
    0nodes.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?

    PHP-Code:
    QHash<QStringQByteArrayhjcmsxml::ServerConnectionDataQStringList fields, const QString &attr )
    {
      
    int i;
      
    QString find(attr);
      
    QHash<QStringQByteArrayretval;
      
    QDomElement Element findDomElementByAttr(find);
      if ( !
    Element.hasAttribute("name") )
        return 
    retval;

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

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

      return 
    retval;
    }
      
    /* Lese Daten in QHash */
      
    QHash<QStringQByteArraydata;
      
    data m_hjcmsxml->ServerConnectionDataoptionsact );

      
    /* 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(); 
    Geändert von undefined (01-02-2008 um 15:21 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Zitat Zitat von anda_skoa Beitrag anzeigen
    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?
    Code:
    # nodes.item(i).firstChild().QString().QByteArray().char *
    nodes.item(i).firstChild().nodeValue().toLocal8Bit().data()
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    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.
    Geändert von undefined (05-02-2008 um 21:54 Uhr)
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Vielleicht benutzt du den char* nicht sofort, bzw. hast das strcpy/strncpy vergessen.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •