Seite 1 von 1

#include <vector> oder qt4 QVector die Wahl..

Verfasst: 10. April 2006 21:02
von patrik08
meine v_fieldata.size() ... ist immer leer warum?
unten im qt code..

habe ich was nicht begriffen mit dem QVector...
oder gibt es bessere beispiele als qt assistent oder die classe QSqlResultPrivate von sql qt driver?
/* Note: All the functions in this class are reentrant. */

mit php fulle ich ein multidimensionales array im nu...mit

php code

Code: Alles auswählen

$lang2 = array(
"1" => array (
"numero" => "2", 
"languagename" => "Deutsch", 
"browsername" => "de"
));
doch im c++ geht es bei mir nur mit #include <vector>
so wie http://ciz.ch/svnciz/c++guida/CAP21.LST

qt code

Code: Alles auswählen


/*  header  file  */
#include <QtCore/qvariant.h>
#include <QtCore/qvector.h>

/* Note: All the functions in this class are reentrant. */
/* vor der classe  */
template <typename T> class QVector;

class SQLFirebird
{
        bool open();
        bool close();
        ....... ecc

protected:
        QVector<QString> v_fieldname;
        QVector<QString> v_fieldata;
        QString sql_log_file;

}

/*  source file  */

SQLFirebird::SQLFirebird()
{
    v_fieldname.clear();
    v_fieldata.clear();
}

/* incomming from external callback  */
void SQLFirebird::loadResult(int argc, char **argv, char **azColName)
{ 
    int i;
    for(i=0; i<argc; i++){
      /* QString  field_data = QString( "%1__%2" ).arg(azColName[i] , argv[i] ? argv[i] : "NULL");  */
     v_fieldname.insert(i+1,azColName[i]);
     v_fieldata.insert(i+1,argv[i] ? argv[i] : "NULL");
    }
}

Verfasst: 10. April 2006 21:16
von Tarek
Ich empfehle dir mit der Problembeschreibung mal einen neuen Anlauf zu machen...
Ich persönlich versteh nur Bahnhof. :?

Verfasst: 10. April 2006 22:44
von patrik08
ich habe eine externe "callback" funktion die sollte einen
QVector in der classeA auffuellen
wie ( http://www.adp-gmbh.ch/sqlite/wrapper.html
std::vector<std::string> fields_; )

jedoch mit dem QVector ...
in der schleife von classeA sehe ich das daten hinein kommen.... sql_log
aber es werden keine daten vom QVector registriert. und der wert von
v_fieldata.size() ist immer 0 (NULL)

Re: #include <vector> oder qt4 QVector die Wahl..

Verfasst: 11. April 2006 07:34
von michams
patrik08 hat geschrieben:

Code: Alles auswählen

    for(i=0; i<argc; i++){
      /* QString  field_data = QString( "%1__%2" ).arg(azColName[i] , argv[i] ? argv[i] : "NULL");  */
     v_fieldname.insert(i+1,azColName[i]);
     v_fieldata.insert(i+1,argv[i] ? argv[i] : "NULL");
    }
Du schreibst in Elemente des Array, die es gar nicht gibt, da dein QVector ja bei der Initialisierung ge-clear-ed wurde. Insert fügt verwirrenderweise keine neuen Elemente ein, sondern überschreibt nur vorhandene! Entweder du machst vor der Schleife ein v_fieldname.resize(i) oder noch besser, du benutzt push_back statt insert.

Ob std::vector oder QVector ist prinzipiell egal. Ich benutze lieber std::vector, da man mit VC2005 dort komplett hinein debuggen kann, in den QVector eben nicht, wobei man QVector auch in einen std::vector konvertieren kann. Man sollte allerdings konsequent bei einer Methode bleiben und nicht beides mischen.

Verfasst: 11. April 2006 13:32
von patrik08
Gut.... ich habe nun den konvensionellen sdt vector verstanden....

Das Grosse dilemma ist einfach das viele sql libs solche "callback" funktionen haben ....

dieses bedeutet das man aus der Klasse raus muss....


funktion von der klasse(..,..,(void) this ,..,..) {

}


Code: Alles auswählen

static int callbacks( classname , int argc, char **argv, char **azColName) 
{
/*  die einziege moeglichkeit ist  die "void *NotUsed" um an das objekt rankommen  */
Objekt <reinterpret_cast<objekt>classname
und mit Objekt weiter zuruck zur klasse ....

}
Doch Mac bringt das <reinterpret_cast<objekt> nicht zustande auf QT4

da ich nur einen dump will habe ich es einfach so gemacht..

Code: Alles auswählen


static int callbacks( void *NotUsed , int argc, char **argv, char **azColName) {
     int i;
     QString workfile = QString( "%1/.cache/label.xml" ).arg( QDir::homePath());
     QString workdir = QString( "%1/.cache/" ).arg( QDir::homePath());
     QDir dir(workdir);
     if (dir.mkpath(workdir)) {
     /* make dir if not exist! */
     }         
     QFile f( workfile );
     QString  field , data;
     if ( f.open( QFile::Append | QFile::Text ) )
	 {
        QTextStream sw( &f );
        QString timing = QString( "bench=\"%1\" " ).arg(time( NULL ));
        sw << "<bench_unixtime " << timing << "/>\n";
        sw << "<row>\n";
        for(i=0; i<argc; i++){  /* azColName[i]  */
         data = QString( "data=\"%1\" " ).arg(argv[i] ? argv[i] : "NULL"); 
         field = QString( "field=\"%1\" " ).arg(azColName[i]);
         sw << " <rows id=\"" << i << "\" " << field << data << "/>\n ";
        }
        sw << "</row>\n";
		f.close();
	}
      return 0;
  /* genau eine sekunde fuer 1200 zeilen  */
}

und das xml cache_file in der classe aufgreifen ... einen xml root geben und fertig!
dan da ich xslt im programm habe kann ich so auf excel exportieren text ..
csv unsw.... gute Idee vom projekt http://www.nongnu.org/anarchdb/
dieses ding exportiert dbs in viele formate .... doch nun begreife ich warum es mit Wx gemacht ist und nicht mit QT..

Schade das QT die sql nur im gui zeigen und keine moeglichkeit hat fuer einen dump export oder was der gleichen.....