Seite 1 von 1
Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 09:35
von prinzenrolle
Hallo,
ich bekomme Daten unformatiert in ein QByteArray (über TCP)
Nun möchte ich diese Daten auswerten und in eine QList vom Typ mein Strukt speichern.
Code: Alles auswählen
class DataPackage
{
...
private:
struct Tags
{
unsigned int type;
unsigned int tagnbr;
QByteArray *data;
};
Tags temptag;
QList<struct Tags> taglist;
};
Konstruktor:
Code: Alles auswählen
DataPackage::DataPackage(void)
{
...
this->temptag.type = 0;
this->temptag.tagnbr = 0;
this->temptag.data = new QByteArray();
qDebug() << "count after init: "<< this->temptag.data->count(); //ist hier 0
}
funktion:
Code: Alles auswählen
void DataPackage::SetData(const QByteArray& data)
{
...
this->temptag.tagnbr = (unsigned int)length;
this->temptag.type = (unsigned int)length+1;
this->temptag.data->append((char)0xFE);
qDebug() << "count: "<<this->temptag.data->count(); //count ist hier rießig
//this->taglist.append(temptag);
....
}
->
Ich mache etwas grundlegendes falsch,
leider weiß ich nicht was.
Bin um jede hilfe dankbar...
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 10:26
von Christian81
1. Warum das QByteArray mit new anlegen?
2. minimales, kompilierbares Beispiel
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 10:57
von prinzenrolle
Christian81 hat geschrieben:1. Warum das QByteArray mit new anlegen?
Weil ich erst ohne new probiert habe und es auch nicht funktionierte...
Christian81 hat geschrieben:
2. minimales, kompilierbares Beispiel
ach mensch da funktioniert das ganze mit dem Struct....
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 11:11
von RHBaum
Noch generell:
Irgendwie hasst Du noch paar knoten im Kopf, was die Sprachmittel von C++ angeht.
this-> um methoden und member innerhalb der eigenen klasse aufzurufen ist unnötig, überfluessig ... etc . lass es weg !
1000 mal an die Tafel schreiben: "C-Casts sind böse! "
stattdessen verwenden wir unter c++ die c++ casts !
static_cast<>,reinterpret_cast<>,dynamic_cast<>,const_cast<>
temptag.tagnbr = static_cast<unsigned int>(length); // Sieht doch gleich viel hübscher aus oder ?

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 11:42
von prinzenrolle
RHBaum hat geschrieben:Noch generell:
Irgendwie hasst Du noch paar knoten im Kopf, was die Sprachmittel von C++ angeht.
jepp zu lange c für mikrocontroller benutzt
this-> um methoden und member innerhalb der eigenen klasse aufzurufen ist unnötig, überfluessig ... etc . lass es weg !
sind schon alle aus dem quellcode gelöscht
1000 mal an die Tafel schreiben: "C-Casts sind böse! "
for(int i=0;i<1000;i++)cout<<""C-Casts sind böse!";
da habe ich noch eine frage...
wie schreibe ich an eine bestimmte stelle in ein QByteArray?
ich habe nur diese Lösung gefunden:
Test[19] = 0xFE;
soweit ich mir die Doku angeschaut habe,
wird falls es das Element nicht gibt dieses erzeugt, ansonsten überschrieben.
Somit sind die [] nicht so böse wie in c und
ein schreiben außerhalb des Arrays nicht möglich
Richtig?
Danke noch einmal
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 13:58
von RHBaum
Somit sind die [] nicht so böse wie in c und
doch, die sind genau so boese !
Weil das QByteArray aus performancegruenden nich anderes mach, als wie das gute alte C.
Zusaetzlich bietet aber QbyteArray sicherere Versionen an:
lesend, statt [] einfach .at() verwenden. Liegt der index ausserhalb, gibts ne exception ...
schreibend: kannst du ne version von replace verwenden
Aber der gute alte index check, bevor man das ding auf nen Array loslaesst ... ist meist doch der bessere Weg. Weil du direkt drauf reagieren kannst, und nicht auf ne exception erst reagieren musst ...
den check weglassen und mit den safe methoden arbeiten solltest also nur, wenn dir fast 100% sicher bist, das dein index im range liegt, und der fall, wenn das ding wirklich ausserhalb ist, auch nen richtig fetter fehler im programm ist ...
Ciao ..
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 14:05
von prinzenrolle
Hallo,
vielen dank für die Antwort.
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 14:10
von RHBaum
nee halt vergiss es ...
If an assignment is made beyond the end of the byte array, the array is extended with resize() before the assignment takes place.
QByteArray macht nen resize bei [] wenn der index groesser ist ...
also das ist schon pseudo sicherer ^^
das ding verhaelt sich also nicht wie ein std::vector ...
Ich verwend die Teile eh nur wenn ich muss ...
Als c++ Hardliner gewinnt natürlich die stl
Ciao ...
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 5. August 2011 15:22
von prinzenrolle
Hallo,
ich habe da Projekt mal neu erzeugt und schon läuft es.
Also erst bereinigen und dann neu erstellen.
Kann das sein?
Genau das gleiche hatte ich jetzt wieder habe die QList durch QHash ersetzt
und bei dem hash.insert ist das Programm immer abgestürzt.
Nun habe ich es wieder neu erstellt und jetzt läuft es,
wie kann das sein?
Gruß und danke für die tollen Antworten!
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 9. August 2011 12:02
von RHBaum
Habe ich eher selten ...
Meist hab ich dann abhaengige projecte die nicht sauber mitneukompiliert wurden, obwohl sie auch die neuen "Header" verwendeten ...
Also meistens zeugt es von falschen Project-Abhaengigkeits-Management ....
Doof wenn man nur ein Project hat
Normal sollte er alles neu kompilieren und linken, wo sich was am Text geaendert hat ...
was verwendest Du zum bauen ?
Ciao ...
Re: Grundlegendes Anfängerproblem mit Struct und QByteArray
Verfasst: 9. August 2011 12:38
von ScyllaIllciz
Ich kenne das Verhalten nur im Zusammenhang mit "Shadow-Build". Habe ich das deaktiviert, passiert sowas nicht. Das ist ein Grund warum ich "Shadow Build" nicht verwende und lieber im *.pro File stehen habe:
Code: Alles auswählen
DESTDIR = bin
OBJECTS_DIR = .build
MOC_DIR = .build
UI_DIR = .build
RCC_DIR = .build