2016-11-21 14 views
0

Mit dem folgenden Code:Gebäude QString aus Zeichenfolge

QString msg; 
msg = "Datalogging Item"   + ',' + 
     QString::number(item)  + ',' + 
     "Slave Index"    + ',' + 
     QString::number(slaveIndex) + ',' + 
     "Slave Name"    + ',' + 
     slaveName     + ',' + 
     "Experiment Index"   + ',' + 
     QString::number(expIndex) + ',' + 
     "Experiment Name"   + ',' + 
     expName      + ',' + 
     "Aquisition Frequency "  + ',' + 
     "33 Hz"      + "\n"; 
qDebug() << msg; 

Ich war immer die folgende Debug-Ausgabe

"riment Index0,Slave Index,0,Slave Name,Execute 1,Experiment Index,0,Experiment Name,Read All (Barebone),Aquisition Frequency ,33 Hz\n" 

Wich nicht wirklich das, was ich erwartet wurde, zu erhalten.

Aber mit dem Code mit der Typumwandlung QString geändert:

QString msg; 
msg = QString("Datalogging Item")  + QString(',') + 
     QString::number(item)   + QString(',') + 
     QString("Slave Index")   + QString(',') + 
     QString::number(slaveIndex)  + QString(',') + 
     QString("Slave Name")   + QString(',') + 
     slaveName      + QString(',') + 
     QString("Experiment Index")  + QString(',') + 
     QString::number(expIndex)  + QString(',') + 
     QString("Experiment Name")  + QString(',') + 
     expName       + QString(',') + 
     QString("Aquisition Frequency ")+ QString(',') + 
     QString("33 Hz")    + QString("\n"); 
qDebug() << msg; 

ich bekommen, was ich bekommen zu erwarten:

"Datalogging Item,0,Slave Index,0,Slave Name,Execute 1,Experiment Index,0,Experiment Name,Read All (Barebone),Aquisition Frequency ,33 Hz\n" 

Haben Sie auf eine Ahnung, was los ist? Ich verstehe einfach nicht, was vor sich geht, und ich bin ein Neuling für QT.

Danke.

+3

Es ist unklar, was Sie fragen, fügen Sie bitte das erwartete Verhalten und das aktuelle Verhalten in einer klaren Art und Weise zu Ihrer Frage Beschreibung hinzu. – HopefullyHelpful

+0

Er fragt, warum der erste Beispielcode fehlerhafte Zeichen in der Ausgabe ausgibt. Was ich unten beantworten möchte. – selbie

+2

Sie können stattdessen QString :: arg() verwenden. Das ist was ich mache. – drescherjm

Antwort

1

Der Ausdruck

"Datalogging Item" + ',' 

hat die Art und Bedeutung der

static_cast<const char *>("Datalogging Item" + 44) 

Sie die Adresse des Beginns des Datalogging Einnahme string constant und addiere 44 dazu - es um 44 Zeichen vorrücken. Dies ist ein nicht definiertes Verhalten, da Sie einen Zeiger über das Objekt hinausbewegen, auf das er zeigt. Zufällig zeigt der Zeiger auf eine andere C-String-Konstante.

Ein kurzes Programm, das das Problem reproduziert:

#include <iostream> 
int main() { 
    std::cout << "Datalogging Item Foo Bar Baz" + '\n' << std::endl; 
} 

Ausgang:

g Item Foo Bar Baz 

Eine Möglichkeit, Ihren Ausdruck umschreiben wäre es gültig und weniger ausführlich sein, um den ARG-Substitutionsmechanismus zu verwenden, von QString:

auto msg = QStringLiteral(
    "Datalogging Item,%1,Slave Index,%2,Slave Name,%3,Experiment Index,%4," 
    "Experiment Name,%5,Acquisition Frequency,%6\n") 
    .arg(item).arg(slaveIndex).arg(slaveName).arg(expIndex) 
    .arg(expName).arg(QStringLiteral("33 Hz")); 

Wenn Sie mit Qt 4, r ersetze QStringLiteral mit QString::fromUtf8. Der QStringLiteral ist ein in Qt 5 eingeführter Mechanismus, der beim Kompilieren eine konstante QString Instanz erstellt, die zu einem kleineren Code und einer besseren Laufzeitleistung führt als die Verwendung eines QString-Konstruktors.

+0

Danke. Ich verstehe es jetzt. Sie antworteten war hilfreich! – Sebastien

3

können Sie ähnliche Ergebnisse Repro noch einfacher:

msg = "Datalogging Item" + ',' + QString::number(item); 

Und jetzt kommt es genau das, was das Problem ist. Der erste Teil dieses Ausdrucks ist einfach:

"Datalogging Item" + ',' 

In dem obigen Ausdruck, eine rohe Stringliteral der ganzzahlige Wert von 44 (für komma ASCII- val) mit aufgenommen, um es Zeigeradresse ist. Daher befinden Sie sich jetzt in einem "undefinierten" Gebiet, da die Länge von "Datalogging Item" weit weniger als 44 Zeichen beträgt. Am wahrscheinlichsten ist, dass der obige Ausdruck jetzt ein Zeiger-Ausdruck in der Mitte eines anderen String-Literals ist, das in der Nähe definiert ist.

ist die Lösung einfach das erste Element zu erklären, ein QString zu sein, so dass alle nachfolgenden „Ergänzungen“ werden die überladenen + Betreiber von QString verwenden:

msg = QString("Datalogging Item") + ',' + 
     QString::number(item)  + ',' + 
     ... 
+0

Alles, was Sie reproduzieren müssen, ist 'std :: cout <<" Datalogging Item "+ ','' :) Keine Notwendigkeit für Qt. Oder auch 'printf ("% s \ n "," Datalogging Item "+ ',');'. Keine Notwendigkeit für C++ :) –

+0

Ihre Antwort war auch hilfreich! – Sebastien