Frage zu QByteArray data() [denke gelöst]

Alles rund um die Programmierung mit Qt
Antworten
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Frage zu QByteArray data() [denke gelöst]

Beitrag von speedy »

Hi

was liefert mir das genau zurück?

Code: Alles auswählen

QByteArray x = QByteArray("test");
char *cx;
cx = x.data();
In der Doku wird gesagt das QByteArray:data() ein pointer zurück gibt.
Aber ist das noch ein Zeiger der was mit dem QByteArray zu tun hat?

Macht das data() jetzt erst eine kopie in char* und gibt dann den pointer oder ist es direkt der pointer der im QByteArray ist?

Geht darum das x nur kurz in einer Funktion existiert aber das cx brauch ich dann noch.

mfg speedy
Zuletzt geändert von speedy am 20. April 2009 16:42, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Das sind direkt die ionternen Daten und existieren in der Form nur so lange, wie deine QByteArray existiert. Was spricht denn dagegen, wenn du die QByteArray weiterrecihst, anstatt nur mit den data()s?

Ansonsten musst du halt auf c-Funktionen zum Kopieren deines char-pointer zurückgreifen (glaub das Ding heißt strcpy() :)), um die Daten in ein eigenes chararray zu packen.
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag von speedy »

hmm
also ich hab jetzt noch ein wenig experimentiert.

Code: Alles auswählen

QByteArray x = QByteArray("test");
char *cx;
cx = x.data();
x.append("irgendwas");
printf("%s \n",cx);
liefert nur "test".
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

was ja auch logisch ist.. denn:
http://doc.trolltech.com/4.5/qbytearray.html#data
The pointer remains valid as long as the byte array isn't reallocated or destroyed
Mit anderen Worten: dein Pointer zeigt auf die alte (bei append() wieder freigegebene) Speicheradresse.
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag von speedy »

aha ... bei append wird das eigentlich neu erzeugt.

ok ich hab das jetzt so in der anderen klasse

Code: Alles auswählen

void empfangen::setport(QByteArray p)
{
if (ptr != NULL) delete[] ptr;
ptr = new char[(p.size()+1)];
strcpy(ptr,p.data());
printf("setPort = %s \n",ptr);
}
achso das ist ein slot in der klasse.
ptr ist global private.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

DIe Frage ist, wozu Du das brauchst ? oder "experimentierst du nur ?

unter C++ gibst zeiger auf Arrays eigentlich nur wegens kompatiblitaet zu C bzw Compilerneutralitaet zu wahren, raus.
Die sollten dann auch const sein .... bzw die allgemeine Syntax zum schreiben in Buffern von C verwenden.

Innerhalb deiner übersetzungseinheit solltest immer mit dem entsprechenden Container arbeiten können, ala QByteArray, oder std::vector<char>, oder std::string, je nach bedarf ... (als buffer fuer schreibende zugriffe auf zeichenketten ist std::string ned so geeignet, da iss std::vector<char> besser)

Ciao ...
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag von speedy »

naja liegt daran das ich teile von C mit eingebaut hab.
Das sing braucht nun mal ein *char.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ja klar, genau deswegen braucht man es auch ^^

Aber intern solltest bei c++ bleiben.

Prinzipiell solltest du dir angewöhnen, veraenderliche Daten nicht doppelt zu speichern, und davon abhaengige Konvertierungen erst zu erzeugen, wenn man sie braucht ... es sei denn du willst was cachen aus performancegruenden. Und selbst dann sollt man keine rohen arrays nehmen ....


Dein Beispiel:

Code: Alles auswählen

void empfangen::setport(QByteArray p)
{
   QByteArray myCopy(p); /// wenn schon kopieren, dann C++ machen lassen 
   printf("setPort = %s \n",myCopy.data()); /// und C-Funktionen direkt mit den zeigern befuellen
} 
Wenn du es gecasht brauchst, beziehungsweisse den Wert Länger halten musst, warum den wert dann ned als member an "empfangen" ???

Code: Alles auswählen

void empfangen::setport(QByteArray p)
{
   // Annahme: mPort ist Member vom Typ QByteArray : 
   mPort = p; // Kopie veranlassen 
   printf("setPort = %s \n",mPort.data()); 
} 
Sowas ist doch viel eleganter, als dieses komische Array oder ?

Ciao ...
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag von speedy »

hmm

joa das dürfte auch gehen.
wobei ich dann mal fragen muss.

Code: Alles auswählen

mPort = p; // Kopie veranlassen 
macht das dann wirklich eine Kopie der Daten oder werden da nur die Zeiger gleichgesetzt?

Momentan funktioniert das jetzt erstmal...
wenn ich mal zeit finde ... schreib ich es vielleicht noch um.
Kämpfe momentan mit anderen Problemen rum ... aber in meinem Programm funktioniert immer mehr ^^

Befürchte nur langsam das ich noch ein Thread brauche ... und ein Puffer bauen muss.
Meine sendefuktion kommt beim massiven daten senden mit fehlern.
Momentan lasse ich dann das Programm für 2 ms einfrieren und dann wird das noch mal gesendet.
--> nicht wirklich elegant. Aber erstmal schnell eine Lösung die funktioniert.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

macht das dann wirklich eine Kopie der Daten oder werden da nur die Zeiger gleichgesetzt?
Hier muss man die Doku lesen, wenn man genau wissen will, was das macht. Und man muss bissi unterschieden. stl::vector<char> vs. QByteArray

Bei solchen containern sind die operatoren fast immer ueberladen, also machen die meist was "komplizierteres".

In der philosophie der STL, die exceptionneutral, und threadsicher und auch datenzeiger nach aussen gibt, kannst davon ausgehen das die elemente bei nem operator = alle kopiert werden. Die STL geht von aus, das die Programmierer wissen was sie tun, wissen muessen, was die STL macht ... etc.

Die QT will "einsteigerfreundlicher" sein. Das interface iss fast das gleiche, das verhalten bissi anderes, eigentlich unvorhersehbarer. fuer 90% der anwender bei "einfacher naiver" Nutzung wird die QT bissi performanter sein, weil sie das kopieren der daten "verschiebt" (copy on write) . Im klartext das QByteArry macht die Kopie hinter den kulissen an ner seiner meinung geeigneteren Stelle. Beim multithreading muss man sich da genauer bissi informieren, damit man ned auf die Nase faellt. Bei 90% der User isses quasi transparent.

Ciao ...
speedy
Beiträge: 52
Registriert: 23. Juli 2008 03:17

Beitrag von speedy »

äh ... ok

ich hoffe ich hab den letzten beitrag verstanden. :roll:

Muss leider aber auch mal zugeben das ich die Doku nicht immer verstehe.
Liegt aber teils auch an meinen nicht so guten englisch kenntnissen... aber vielleicht auch teils weil ich da manchmal durcheinander komme und manchmal weil ich mir nicht alles durchlese :roll:

Bin ja selbst noch anfänger in QT.
Am schlimmsten finde ich aber, wenn ich was suche wo ich denke das es das gibt aber nicht weiß wie das heißt.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Hilfen und Dokus sind meist Nachschlagewerke, bzw als solche besser zu gebrauchen.

Besser ist es mit mehr Thematisch orientierter Literatur einzusteigen. Problem ist da gute zu finden, und vor allem zu erkennen, welche Literatur was bietet.

fuer die QT gibts einige Gute Einfuhrungs-Buecher. Da werden halt die Prinzipien und Ideen die hinter dem Framework stehen beleuchtet. Das hilft enorm. Dann wiederum gibts einige Werke die sind ne 1:1 uebersetzung der Hilfe, also eher als nachschlagewerk geeignet, aufgelockert mit paar simplen Beispielen (die man anderswo auch, aber besser erlaeutert findet).

Die Nachschlagewerke wirst spaeter erst viel mehr brauchen, wobei im falle der QT es sicherlich die onlinehilfe tut, wenn man englisch kann.

Ueber container wirst ned so viel und ausfuehrlich was finden, da die qt c++ voraussetzt und dazu auch die stl container gehoeren. Die qt container wiederum adaptieren die grundlegenden prinzipien und Muster der stl container und bieten gar das gleiche Interface an. Nur im verhalten und der benamsung gibts paar kleinere unterschiede.
Also als kenner der stl sollt man mit den qt-containern fast Null probleme haben.

Wenn wirklich weiterkommen willst, empfehl ich dir als erstes nen gutes QT buch, kein nachschlagewerk, um an die Ideen hinter der QT zu kommen.
und soweiso, ein umfassendes buch zu c++ inklusive stl ... also stl ist das a und o und eigentlich der einstieg ins tiefe c++. Ist man hinter die gestiegen, kommt man auch mit den alternativen (boost etc) klar.

Ciao ...
Antworten