vector durchlaufen
-
Guten Morgen.
Ich wollte meinen vector durchlaufen der so ausieht:lo: 167027 548 0 0 0 0 0 0 167027 548 0 0 0 0 0 0 wlan0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth0: 39072289 41342 0 0 0 0 0 3348 4363113 28697 0 0 0 0 0 0d.h. von lo gibt es einmal die ganzen Daten dann von wlan0 und so weiter. Nun kann es aber auch sein das es nur 2 gibt oder auch 4. D.h. ich hab mir eine Funktion nextNet gebaut allerdings klappt die nicht so ganz.
bool SYSInfo::nextNet(){ if(dev.empty()) return false; if(dev < 0){ dev=dev.at(0); read_dev(); return true; } std::vector<face>::iterator it; int i = 0; for ( it=dev.begin(); it < dev.end(); it++ ) { if(*it==dev && i + 1 < (int)dev.size()){ dev=dev.at(i + 1); read_dev; return true; } i++; } return false; }-wenn dev leer = false
-wenn dev kleiner als 0
-dev auf die postion N ( in diesem fall 0)
-read_dev funktion
-gebe true zurück-(it auf begin setzen / wenn it kleiner ist als dev.end / it soll um einen erhöht werden
-wenn it auf dev zeigt (false) i + 1 (true) kleiner als anzahl der elemente in dev
-setze dev auf position N (i + 1)
- read_dev funktion
-gebe true zurück-i um 1 erhöhen
(hab mir gedacht so seht ihr ob ich es verstanden hab oder ob ich da was falsch eingebaut hab.)
so sieht mein vector aus:
struct face{ std::string name; unsigned int bytes_received; unsigned int packets_received; unsigned int errs_received; unsigned int drop_received; unsigned int fifo_received; unsigned int frame_received; unsigned int compressed_received; unsigned int multicast_received; unsigned int bytes_transmitted; unsigned int packets_transmitted; unsigned int errs_transmitted; unsigned int drop_transmitted; unsigned int fifo_transmitted; unsigned int colls_transmitted; unsigned int carrier_transmitted; unsigned int compressed_transmitted; }; class .... .... private: std::vector<face> dev;read_dev:
void SYSInfo::read_dev(){ std::ifstream file("/proc/net/dev"); file >> skip_line; // Überspringe erste Zeile. file >> skip_line; // Überspringe zweite Zeile. for(face f; file>>f; dev.push_back(f)); }Der Fehler ist das er meine Operatoren nicht anerkennt. Ich denke das passiert durch meine Operatoren überladung oben:
std::istream& skip_line(std::istream& in){ return in.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); } std::istream& operator>>(std::istream& in, face& f){ return in >> f.name >> f.bytes_received >> f.packets_received >> f.errs_received >> f.drop_received >> f.fifo_received >> f.frame_received >> f.compressed_received >> f. multicast_received >> f.bytes_transmitted >> f.packets_transmitted >> f.errs_transmitted >> f.drop_transmitted >> f.fifo_transmitted >> f.colls_transmitted >> f.carrier_transmitted >> f.compressed_transmitted; } std::ostream& operator<<(std::ostream& out, const face& f){ return out << f.name << "Bytes: " << f.bytes_received << " Packets: " << f.packets_received << " Errs: " << f.errs_received << " Drop: " << f.drop_received << " Fifo: " << f.fifo_received << " Frame: " << f.frame_received << " Compressed: " << f.compressed_received << " Multicast: " << f. multicast_received << " Bytes: " << f.bytes_transmitted << " Packets: " << f.packets_transmitted << " Errs: " << f.errs_transmitted << " Drop: " << f.drop_transmitted << " Fifo: " << f.fifo_transmitted << " Coll: " << f.colls_transmitted << " Carrier: " << f.carrier_transmitted << " Compressed: " << f.compressed_transmitted; }Muss ich mir jetzt für jeden Operator etwas schreiben? oder kann man das irgendwie umgehen? Hier noch die Fehlermeldung:
131:12: Fehler: keine Übereinstimmung für »operator<« in »((exsystem::SYSInfo*)this)->exsystem::SYSInfo::dev < 0«Ihr dürft mich nun in der Luft zerreißen.

-
Dein Compiler kann mit
dev < 0nichts anfangen. Was soll das denn tun?
-
MFK schrieb:
Dein Compiler kann mit
dev < 0nichts anfangen. Was soll das denn tun?
Wenn dev kleiner als 0 ist soll er dev von vorne lesen. Da es doch dev[0],dev[1] und dev[2] (beliebig mehr oder auch weniger) gibt. D.h. in diesem Beispiel sollte er dann die Daten von lo ausgeben.
EDIT: So hab ich zumindest gedacht das er es tut.
EDIT2: Er kommt btw mit keinem Operator klar in der Funktion.
-
Enno schrieb:
Wenn dev kleiner als 0
dev ist ein vector. Keine Zahl.
Vector kann genausowenig wie der string in deiner anderen Frage gleich, kleiner oder größer als 0 sein. Tu dir und uns den Gefallen und lies dir im Einsteigerbuch deiner Wahl nochmal den Teil zu Datentypen durch.
-
Enno schrieb:
Wenn dev kleiner als 0 ist soll er dev von vorne lesen.
Wie kann ein Vektor kleiner als eine Zahl sein? Meinst du, dass die Länge kleiner als 0 sein soll? Das würde man
dev.size() < 0schreiben, aber das ist Blödsinn, weil eine negative Länge erstens keinen Sinn ergibt und zweitens size hier sowieso einen unsigned-Typ zurückgibt.
-
Bashar schrieb:
Wie kann ein Vektor kleiner als eine Zahl sein? Meinst du, dass die Länge kleiner als 0 sein soll? Das würde man
dev.size() < 0schreiben, aber das ist Blödsinn, weil eine negative Länge erstens keinen Sinn ergibt und zweitens size hier sowieso einen unsigned-Typ zurückgibt.Ich wollte prüfen ob ich am Anfang des vectors bin. D.h. ich könnte das vllcht mit front machen?
EDIT: Mhm ... mist das dann auch wieder Quark da ich dann niemals bis zum for komme oder?
-
Lies dir bitte erstmal die Grundlagen zum Thema "vector" durch. Bspw. http://www.cplusplus.com/reference/stl/vector/.
Und komm jetzt bitte nicht wieder mit der Ausrede, du seist auf Arbeit. Wenn du die Zeit hast, stundenlang deine Anfängerprobleme hier im Forum zu diskutieren, hast du auch die Zeit, dir kurz das entsprechende Grundlagenwissen anzueignen. Geht vermutlich sogar wesentlich schneller.
Sorry, wenn das jetz ein wenig direkt war, aber so langsam gehen mir deine Fragen und Probleme ziemlich auf die Nerven.
-
daddy_felix schrieb:
Lies dir bitte erstmal die Grundlagen zum Thema "vector" durch. Bspw. http://www.cplusplus.com/reference/stl/vector/.
Und komm jetzt bitte nicht wieder mit der Ausrede, du seist auf Arbeit. Wenn du die Zeit hast, stundenlang deine Anfängerprobleme hier im Forum zu diskutieren, hast du auch die Zeit, dir kurz das entsprechende Grundlagenwissen anzueignen. Geht vermutlich sogar wesentlich schneller.
Sorry, wenn das jetz ein wenig direkt war, aber so langsam gehen mir deine Fragen und Probleme ziemlich auf die Nerven.
Link bin ich schon lange drauf ... und ja see ya!
-
Was soll nextNet genau erreichen? Die Funktion macht so wie du sie konzipiert hast keinen wirklichen Sinn...
-
pumuckl schrieb:
Was soll nextNet genau erreichen? Die Funktion macht so wie du sie konzipiert hast keinen wirklichen Sinn...
Ich wollte eine Funktion mit der ich alle werte aus dev ausgeben kann ohne das ich wie hier:
unsigned int SYSInfo::getBytesr(){ return dev[0].bytes_received; }die Zahl hinter dev ändern muss.
-
Enno schrieb:
Ich wollte eine Funktion mit der ich alle werte aus dev ausgeben kann ohne das ich wie hier: [...] die Zahl hinter dev ändern muss.
"Die Zahl hinter dev" nennt sich Array-Index. Als Index kannst du statt der Konstanten auch eine Variable benutzen (=> Grundlagenbuch), und um die Variable hochzuzählen typischerweise eine Schleife (=> Grundlagenbuch):
//alle Werte aus dev ausgeben: for (unsigned i = 0; i < dev.size(); ++i) { cout << dev[i] << ' '; }Mal davon abgesehen, dass dein nextNet garnichts ausgibt.
-
pumuckl schrieb:
Enno schrieb:
Ich wollte eine Funktion mit der ich alle werte aus dev ausgeben kann ohne das ich wie hier: [...] die Zahl hinter dev ändern muss.
"Die Zahl hinter dev" nennt sich Array-Index. Als Index kannst du statt der Konstanten auch eine Variable benutzen (=> Grundlagenbuch), und um die Variable hochzuzählen typischerweise eine Schleife (=> Grundlagenbuch):
//alle Werte aus dev ausgeben: for (unsigned i = 0; i < dev.size(); ++i) { cout << dev[i] << ' '; }Mal davon abgesehen, dass dein nextNet garnichts ausgibt.
wäre es mal so leicht

Ich muss auf jedes Element einzelnt mit einer getFunktion zugreifen können meine next Funktion soll nun meinen index ändern. Wahrscheinlich der größte müll den ich mal wieder rede.
-
meinst du sowas:
for(std::vector<face>::const_iterator it = dev.begin(); it != dev.end(); ++it) { it->getXYZ(); it->getName(); }
-
Enno schrieb:
wäre es mal so leicht

Das ist das, was du beschrieben hast. Leider wird man aus deinem ersten Post nicht so recht schlau. Was willst du erreichen?
Ich muss auf jedes Element einzelnt mit einer getFunktion zugreifen können meine next Funktion soll nun meinen index ändern.
Dann greif doch innerhalb einer Schleife mit dem Getter auf die Elemente zu - den index abzuändern übernimmt der Schleifenkopf doch.
-
pumuckl schrieb:
//alle Werte aus dev ausgeben: for (unsigned i = 0; i < dev.size(); ++i) { cout << dev[i] << ' '; }Das Problem für mich hier ist, dass die schleife alle teile ausgibt und nicht nur den ersten "block" aus [0](oder halt [1] ...).
Von der theorie noch mal eben her:
setFunktion die den gewünschten Index setzt, nextFunktion die in den Index geht und getFunktion die den teil ausgibt.Würde das so gehen ?
daddy_felix schrieb:
meinst du sowas:
for(std::vector<face>::const_iterator it = dev.begin(); it != dev.end(); ++it) { it->getXYZ(); it->getName(); }Wäre das nicht nur eine Schleife die alle getFunktionen bestückt?
-
Enno schrieb:
Von der theorie noch mal eben her:
setFunktion die den gewünschten Index setzt, nextFunktion die in den Index geht und getFunktion die den teil ausgibt.Würde das so gehen ?
Du willst doch über alle Elemente laufen? Zumindest hast du das vorhin noch geschrieben. Dann musst du keinen Index setzen.
daddy_felix schrieb:
meinst du sowas:
for(std::vector<face>::const_iterator it = dev.begin(); it != dev.end(); ++it) { it->getXYZ(); it->getName(); }Wäre das nicht nur eine Schleife die alle getFunktionen bestückt?[/quote]
das ist ein BEISPIEL. wie du den vector komplett durchläufst. Wenn du nur eine bestimmtes Eigenschft benötigst, dann greifst du eben nur auf diese zu:
cout << it->getVeryImportantWhatever() << " ";
-
daddy_felix schrieb:
Du willst doch über alle Elemente laufen? Zumindest hast du das vorhin noch geschrieben. Dann musst du keinen Index setzen.
meinst du sowas:
for(std::vector<face>::const_iterator it = dev.begin(); it != dev.end(); ++it) { it->getXYZ(); it->getName(); }Wäre das nicht nur eine Schleife die alle getFunktionen bestückt?[/quote]
das ist ein BEISPIEL. wie du den vector komplett durchläufst. Wenn du nur ein bestimmtes Elemen benötigst, dann greifst du eben nur auf dieses Element zu:
cout << it->getVeryImportantElement() << " ";[/quote]
Ja weiß ich also "bestückt" die schleife die getVeryImportantElemnt() mit einem wert.
Einfacher gehtz ja so:
unsigned int SYSInfo::getFifot(){ return dev[0].fifo_transmitted; }So bekomm ich die ja nun einzelnt. Ich will nun aber den ganzen "block" von index [n].
-
Enno schrieb:
Das Problem für mich hier ist, dass die schleife alle teile ausgibt und nicht nur den ersten "block" aus [0](oder halt [1] ...).
Was verstehst du unter dem ersten Block? Meinst du sowas:
for( unsigne i = 0; i < dev.size(); ++i) { cout << dev[i].bytes_received << '\n'; }pumuckl schrieb:
Was willst du erreichen?
-
pumuckl schrieb:
Enno schrieb:
Das Problem für mich hier ist, dass die schleife alle teile ausgibt und nicht nur den ersten "block" aus [0](oder halt [1] ...).
Was verstehst du unter dem ersten Block? Meinst du sowas:
for( unsigne i = 0; i < dev.size(); ++i) { cout << dev[i].bytes_received << '\n'; }pumuckl schrieb:
Was willst du erreichen?
In diesem fall der vector:
lo: 167027 548 0 0 0 0 0 0 167027 548 0 0 0 0 0 0 wlan0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth0: 39072289 41342 0 0 0 0 0 3348 4363113 28697 0 0 0 0 0 0Meine vorstellung von "block" oder auch halt dem index[0] in diesem fall:
lo: 167027 548 0 0 0 0 0 0 167027 548 0 0 0 0 0 0
-
Wir haben dir nun gezeigt, wie du über alle Elemente des vectors iterierst. Innerhalb des Schleifenrumpfes kannst du nun auf eine Instanz von "face" zugreifen. Dort holst du dir die Informationen, die du ausgeben willst, und gibst diese aus. Welche Getter du dafür konkret aufrufen musst, können wir dir nicht sagen.
Achso, du willst also anscheinend alle Elemente von "face" ausgeben. In diesem Fall machst du entweder
cout << it->getName() << " " << it->getPacketsReceived() << " " << ...oder, falls du dir noch mehr fortgeschrittenen Techniken ansehen willst: du kannst den Ausgabeoperator << für deinen Typ "face" überladen (-> Grundlagenbuch).
dann kannst du das einfach so schreiben:
cout << *it;
-
Enno schrieb:
In diesem fall der vector:
lo: 167027 548 0 0 0 0 0 0 167027 548 0 0 0 0 0 0 wlan0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth0: 39072289 41342 0 0 0 0 0 3348 4363113 28697 0 0 0 0 0 0Meine vorstellung von "block" oder auch halt dem index[0] in diesem fall:
lo: 167027 548 0 0 0 0 0 0 167027 548 0 0 0 0 0 0Du willst also einfach nur den ersten Eintrag im vector ausgeben? Falls nicht, sag uns doch bitte, was du erreichen willst!