Kleines Verständnisproblem mit vector <QString> und push_back
-
wrote on 29 Oct 2022, 12:35 last edited by
Hallo,
Worum es geht: ich lese eine Textdatei ein, in der Zeilenweise Befehle stehen, samt parameter.
Diese sollen nun Zeilenweise untersucht werden, um ggf. Befehle auszutauschen.Das folgende ist nicht ganz zusammenhängend, erklärt aber die Definition.
QString tokens = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; QString command = originalCommand; //used for splitting commands into component parts QVector<QString> items {}; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; index = command.indexOf("M"); if (index==0) { SuppressOutputFlag = true; } // ----- insert the required M3(pen_up) and M5(pen_down) code sequences index = command.indexOf("G"); if (index==0) { // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" items.push_back(subString.split(tokens)); //split string at each non-digit character gcode = items.at(0).toInt(); //item[0] contains the "match" value
Bei der vorletzten Zeile: items.push_back bekomme ich dann folgenden Fehler:
mainwindow.cpp:112: Fehler: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ ../GCodePostProcessor/mainwindow.cpp: In member function ‘void MainWindow::process(QTextStream&, QString)’: ../GCodePostProcessor/mainwindow.cpp:112:44: error: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ 112 | items.push_back(subString.split(tokens)); //split string at each non-digit character | ^
Irgendwie verstehe ich nicht, was da falsch läuft. Warum kann ich keinen QString in einen vector <QString> schreiben?
VG
Matze -
Hallo,
Worum es geht: ich lese eine Textdatei ein, in der Zeilenweise Befehle stehen, samt parameter.
Diese sollen nun Zeilenweise untersucht werden, um ggf. Befehle auszutauschen.Das folgende ist nicht ganz zusammenhängend, erklärt aber die Definition.
QString tokens = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; QString command = originalCommand; //used for splitting commands into component parts QVector<QString> items {}; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; index = command.indexOf("M"); if (index==0) { SuppressOutputFlag = true; } // ----- insert the required M3(pen_up) and M5(pen_down) code sequences index = command.indexOf("G"); if (index==0) { // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" items.push_back(subString.split(tokens)); //split string at each non-digit character gcode = items.at(0).toInt(); //item[0] contains the "match" value
Bei der vorletzten Zeile: items.push_back bekomme ich dann folgenden Fehler:
mainwindow.cpp:112: Fehler: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ ../GCodePostProcessor/mainwindow.cpp: In member function ‘void MainWindow::process(QTextStream&, QString)’: ../GCodePostProcessor/mainwindow.cpp:112:44: error: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ 112 | items.push_back(subString.split(tokens)); //split string at each non-digit character | ^
Irgendwie verstehe ich nicht, was da falsch läuft. Warum kann ich keinen QString in einen vector <QString> schreiben?
VG
Matzewrote on 29 Oct 2022, 14:01 last edited by@MHage said in Kleines Verständnisproblem mit vector <QString> und push_back:
Warum kann ich keinen QString in einen vector <QString> schreiben?
Weil
subString.split(tokens)
einQStringList
und keinQString
gebt.error: no matching function for call to ‘QVector<QString>::push_back(QStringList)’
push_back(QString)
erlaubt ist, aber nichtpush_back(QStringList)
. -
Hallo,
Worum es geht: ich lese eine Textdatei ein, in der Zeilenweise Befehle stehen, samt parameter.
Diese sollen nun Zeilenweise untersucht werden, um ggf. Befehle auszutauschen.Das folgende ist nicht ganz zusammenhängend, erklärt aber die Definition.
QString tokens = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; QString command = originalCommand; //used for splitting commands into component parts QVector<QString> items {}; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; index = command.indexOf("M"); if (index==0) { SuppressOutputFlag = true; } // ----- insert the required M3(pen_up) and M5(pen_down) code sequences index = command.indexOf("G"); if (index==0) { // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" items.push_back(subString.split(tokens)); //split string at each non-digit character gcode = items.at(0).toInt(); //item[0] contains the "match" value
Bei der vorletzten Zeile: items.push_back bekomme ich dann folgenden Fehler:
mainwindow.cpp:112: Fehler: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ ../GCodePostProcessor/mainwindow.cpp: In member function ‘void MainWindow::process(QTextStream&, QString)’: ../GCodePostProcessor/mainwindow.cpp:112:44: error: no matching function for call to ‘QVector<QString>::push_back(QStringList)’ 112 | items.push_back(subString.split(tokens)); //split string at each non-digit character | ^
Irgendwie verstehe ich nicht, was da falsch läuft. Warum kann ich keinen QString in einen vector <QString> schreiben?
VG
Matzewrote on 2 Nov 2022, 07:56 last edited byEs würde möglicherweise mit
append()
anstattpush_back()
funktionieren. Das würde allerdings voraussetzen, dass QStringList in QVector<QString> konvertiert werden kann. Ansonsten bleibt nur, dass du QStringList direkt füritems
verwendest.Ich möche auch darauf hinweisen, dass
subString.split(tokens)
nicht das tut, was du denkst. Denn in dieser Variante vonsplit()
sucht es nach dem Substringtokens
, d.h. einem Substring mit dem vollständigen Alphabet inklusive der Kommas, und trennt an dieser Stelle auf. Es ist nicht so, dass an beliebigen Tokens aus dem langen Tokenstring gesplittet wird. Stattdessen müssen hier Regular Expressions verwendet werden. -
Es würde möglicherweise mit
append()
anstattpush_back()
funktionieren. Das würde allerdings voraussetzen, dass QStringList in QVector<QString> konvertiert werden kann. Ansonsten bleibt nur, dass du QStringList direkt füritems
verwendest.Ich möche auch darauf hinweisen, dass
subString.split(tokens)
nicht das tut, was du denkst. Denn in dieser Variante vonsplit()
sucht es nach dem Substringtokens
, d.h. einem Substring mit dem vollständigen Alphabet inklusive der Kommas, und trennt an dieser Stelle auf. Es ist nicht so, dass an beliebigen Tokens aus dem langen Tokenstring gesplittet wird. Stattdessen müssen hier Regular Expressions verwendet werden.wrote on 2 Nov 2022, 08:28 last edited byMit dem Thema "subString.split(tokens)" bin ich auch noch nicht ganz durch. Du hast recht, es tut nicht wirklich das, was ich erwartet habe.
Im Moment sieht das bei mir so aus:
QString tokens = "A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z"; QString command = originalCommand; //used for splitting commands into component parts QStringList l; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" l = subString.split(QRegExp(tokens)); //split string at each non-digit character gcode = l.at(1).toInt(); //item[0] contains the "match" value
Das funktioniert zwar, aber nicht ganz so, wie ich es ursprünglich angedacht hatte...
-
Mit dem Thema "subString.split(tokens)" bin ich auch noch nicht ganz durch. Du hast recht, es tut nicht wirklich das, was ich erwartet habe.
Im Moment sieht das bei mir so aus:
QString tokens = "A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z"; QString command = originalCommand; //used for splitting commands into component parts QStringList l; //component parts QString subString = ""; //scratchpad int gcode = 0; int numChars; int index; // ---- identify the G-code command numChars = command.length(); subString = command.mid(index, numChars); //keep everything after the "match" l = subString.split(QRegExp(tokens)); //split string at each non-digit character gcode = l.at(1).toInt(); //item[0] contains the "match" value
Das funktioniert zwar, aber nicht ganz so, wie ich es ursprünglich angedacht hatte...
wrote on 2 Nov 2022, 08:38 last edited byEin bisschen einfacher geht es mit
QString tokens = "[A-Z]";
.
1/5