2016-11-21 1 views
0

Avec le morceau de code suivant:Building QString à chaîne

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; 

Je recevais la sortie de débogage suivant

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

Wich est pas vraiment ce que je pensais obtenir.

Mais avec le code modifié avec le transtypage QString:

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; 

-je obtenir ce que je pensais obtenir:

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

Avez-vous une idée sur ce qui se passe? Je ne comprends pas ce qui se passe et je suis un débutant à QT.

Merci.

+3

On ne sait pas ce que vous demandez, s'il vous plaît ajouter le comportement attendu et le comportement actuel d'une manière claire à la description de votre question. – HopefullyHelpful

+0

Il demande pourquoi le premier exemple de code imprime des caractères parasites dans la sortie. Ce que je tente de répondre ci-dessous. – selbie

+2

Vous pouvez utiliser QString :: arg() à la place. C'est ce que je fais. – drescherjm

Répondre

1

L'expression

"Datalogging Item" + ',' 

a le type et la signification de

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

Vous prenez l'adresse du début de la Datalogging chaîne constante et en ajoutant 44 - en l'avançant de 44 caractères. Ce comportement n'est pas défini lorsque vous déplacez un pointeur au-delà de l'objet vers lequel il pointe. Par coïncidence, le pointeur arrive à pointer vers une autre constante de chaîne C.

Un programme court qui reproduit la question:

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

Sortie:

g Item Foo Bar Baz 

Une façon de réécrire votre expression pour la rendre valide et moins serait bavard d'utiliser le mécanisme arg de substitution de 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")); 

Si vous utilisez Qt 4, r eplace QStringLiteral avec QString::fromUtf8. Le QStringLiteral est un mécanisme introduit dans Qt 5 qui construit une instance QString constante au moment de la compilation, ce qui donne un code plus petit et de meilleures performances d'exécution que l'utilisation d'un constructeur QString.

+0

Merci. Je comprends maintenant. Votre réponse a été utile! – Sebastien

3

Vous pouvez repro des résultats similaires encore plus simples:

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

Et maintenant, il se produit à être exactement ce que la question est. La première partie de cette expression est simplement:

"Datalogging Item" + ',' 

Dans l'expression ci-dessus, un littéral chaîne brute est d'avoir la valeur entière de 44 (ascii val de virgule) ajoutée à son adresse de pointeur. Par conséquent, vous êtes maintenant dans un territoire "indéfini" puisque la longueur de "Datalogging Item" est bien inférieure à 44 caractères. Le plus probable est que l'expression ci-dessus est maintenant une expression de pointeur au milieu de l'un de vos autres littéraux de chaîne définis à proximité.

La solution est tout simplement de déclarer le premier élément être un QString pour que tous les « ajouts » ultérieurs utiliseront l'opérateur + surchargé de QString:

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

Tout ce que vous avez besoin de reproduire est 'std :: cout <<" Datalogging Item "+ ','' :) Pas besoin de Qt. Ou aussi 'printf ("% s \ n "," Datalogging Item "+ ',');'. Pas besoin de C++ :) –

+0

Votre réponse a été utile aussi! – Sebastien