Grundlegendes Anfängerproblem mit Struct und QByteArray

Alles rund um die Programmierung mit Qt
Antworten
prinzenrolle
Beiträge: 25
Registriert: 4. August 2010 18:38

Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag von Christian81 »

1. Warum das QByteArray mit new anlegen?
2. minimales, kompilierbares Beispiel
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
prinzenrolle
Beiträge: 25
Registriert: 4. August 2010 18:38

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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....
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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 ? :-)
prinzenrolle
Beiträge: 25
Registriert: 4. August 2010 18:38

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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 ..
prinzenrolle
Beiträge: 25
Registriert: 4. August 2010 18:38

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag von prinzenrolle »

Hallo,

vielen dank für die Antwort.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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 ...
prinzenrolle
Beiträge: 25
Registriert: 4. August 2010 18:38

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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!
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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 ...
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Re: Grundlegendes Anfängerproblem mit Struct und QByteArray

Beitrag 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
Antworten