vector durchlaufen



  • 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          0
    

    Meine 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          0
    

    Meine 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
    

    Du willst also einfach nur den ersten Eintrag im vector ausgeben? Falls nicht, sag uns doch bitte, was du erreichen willst!



  • pumuckl schrieb:

    Du willst also einfach nur den ersten Eintrag im vector ausgeben? Falls nicht, sag uns doch bitte, was du erreichen willst!

    Jain ich will eine Funktion die da durchlaufen kann und den entsprechenden index den ich eingebe dann auch ausgibt. Versteht man das?



  • Enno schrieb:

    Jain ich will eine Funktion die da durchlaufen kann und den entsprechenden index den ich eingebe dann auch ausgibt. Versteht man das?

    Nein. Du willst genau einen Index eingeben und die Werte von dem Element an diesem Index ausgeben?

    void PrintElement(size_t index)
    {
      assert(index < dev.size());
      cout << dev[index].getName() << " " << dev[index].getPacketsLoss() << " " << ...;
    }
    

    so?



  • daddy_felix schrieb:

    Enno schrieb:

    Jain ich will eine Funktion die da durchlaufen kann und den entsprechenden index den ich eingebe dann auch ausgibt. Versteht man das?

    Nein. Du willst genau einen Index eingeben und die Werte von dem Element an diesem Index ausgeben?

    void PrintElement(size_t index)
    {
      assert(index < dev.size());
      cout << dev[index].getName() << " " << dev[index].getPacketsLoss() << " " << ...;
    }
    

    so?

    Mhm ... eher dachte ich an sowas:

    unsigned int SYSInfo::setIndex(){
      std::cout << "Bitte Index eingeben: " << std::endl;
      std::cin >> i;
      return i;
    }
    
    void SYSInfo::nextNet(){
      for(i; i < dev.size(); i++){
        std::cout << dev[i] << '\n';    
      }
    }
    

    Nur gibt er jetzt alles ab dem eingegebenen wert aus und nicht nur den einen Index.



  • irgendwie kommst du mit deinen Indizes durcheinander. Gibt bitte mal ein konkretes Beispiel, also bei welcher Eingabe und welchen Datensatz was genau ausgegeben werden soll.

    Es gilt:

    index 0:

    lo:  167027     548    0    0    0     0          0         0   167027     548    0    0    0     0       0          0
    

    index 1:

    wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
    

    index 2:

    eth0: 39072289   41342    0    0    0     0          0      3348  4363113   28697    0    0    0     0       0          0
    


  • daddy_felix schrieb:

    irgendwie kommst du mit deinen Indizes durcheinander. Gibt bitte mal ein konkretes Beispiel, also bei welcher Eingabe und welchen Datensatz was genau ausgegeben werden soll.

    Es gilt:

    index 0:

    lo:  167027     548    0    0    0     0          0         0   167027     548    0    0    0     0       0          0
    

    index 1:

    wlan0:       0       0    0    0    0     0          0         0        0       0    0    0    0     0       0          0
    

    index 2:

    eth0: 39072289   41342    0    0    0     0          0      3348  4363113   28697    0    0    0     0       0          0
    

    Bei meinem Code kommt für i = 1:

    wlan0:Bytes: 0 Packets: 0 Errs: 0 Drop: 0 Fifo: 0 Frame: 0 Compressed: 0 Multicast: 0 Bytes: 0 Packets: 0 Errs: 0 Drop: 0 Fifo: 0 Coll: 0 Carrier: 0 Compressed: 0
    eth0:Bytes: 51174195 Packets: 72809 Errs: 0 Drop: 0 Fifo: 0 Frame: 0 Compressed: 0 Multicast: 9927 Bytes: 7798016 Packets: 48352 Errs: 0 Drop: 0 Fifo: 0 Coll: 0 Carrier: 0 Compressed: 0
    

    Es soll aber nur:

    wlan0:Bytes: 0 Packets: 0 Errs: 0 Drop: 0 Fifo: 0 Frame: 0 Compressed: 0 Multicast: 0 Bytes: 0 Packets: 0 Errs: 0 Drop: 0 Fifo: 0 Coll: 0 Carrier: 0 Compressed: 0
    

    Das heißt ich muss dem noch irgendwie sagen das dann stop ist.



  • Enno schrieb:

    Jain ich will eine Funktion die da durchlaufen kann und den entsprechenden index den ich eingebe dann auch ausgibt. Versteht man das?

    Nein. Das ist auch nicht, was du erreichen willst, sondern ein Weg, mit dem du glaubst, es zu erreichen - was offensichtlich nicht der Fall ist, sonst gäbs diesen Thread nicht.

    Wie daddy_felix schon sagt: gib uns ein konkretes Beispiel. Keinen Code, keine Ideen, wie du es umsetzen könntest, sondern beschreibe nur Input und Output.
    Siehe auch erster Link in meiner Signatur.



  • Enno schrieb:

    Das heißt ich muss dem noch irgendwie sagen das dann stop ist.

    Dann brauchst du kleine Schleife. Ich habe dir doch schon den Code dafür geliefert...

    void PrintElement(size_t index)
    {
      assert(index < dev.size());
      cout << dev[index];
    }
    


  • daddy_felix schrieb:

    Enno schrieb:

    Das heißt ich muss dem noch irgendwie sagen das dann stop ist.

    Dann brauchst du kleine Schleife. Ich habe dir doch schon den Code dafür geliefert...

    void PrintElement(size_t index)
    {
      assert(index < dev.size());
      cout << dev[index];
    }
    

    Mhm ... kann das nicht kompelieren. versteh auch nicht recht was assert macht. assert Vllcht magst du das einmal kurz auf Deutsch sagen was das macht.

    131:8: Fehler: expected unqualified-id before »(« token
    


  • Enno schrieb:

    Vllcht magst du das einmal kurz auf Deutsch sagen was das macht.

    Es überprüft, ob das, was in den Klammern steht, stimmt. Sonst wird ein Fehler angezeigt (bzw. das Programm abgebrochen). In deinem Fall: Es hat keinen Sinn, einen Index zu nehmen, der größer/gleich der Größe des vector ist, also prüft er, dass der Index einen gültigen Wert hat.

    Damits compiliert musst du noch den header <cassert> mit einbinden (steht auch in der von dir verlinkten Doku im Grunde mit drin). Mache dich mit den wichtigsten Headern der Standardbibliothek vertraut. (=> Grundlagenbuch)



  • pumuckl schrieb:

    Enno schrieb:

    Vllcht magst du das einmal kurz auf Deutsch sagen was das macht.

    Es überprüft, ob das, was in den Klammern steht, stimmt. Sonst wird ein Fehler angezeigt (bzw. das Programm abgebrochen). In deinem Fall: Es hat keinen Sinn, einen Index zu nehmen, der größer/gleich der Größe des vector ist, also prüft er, dass der Index einen gültigen Wert hat.

    Damits compiliert musst du noch den header <cassert> mit einbinden (steht auch in der von dir verlinkten Doku im Grunde mit drin). Mache dich mit den wichtigsten Headern der Standardbibliothek vertraut. (=> Grundlagenbuch)

    Da ich es gelesen habe weiß ich das der Header mit rein muss ...



  • Enno schrieb:

    Da ich es gelesen habe weiß ich das der Header mit rein muss ...

    Dann kennt der Compiler auf jeden Fall auch das assert.

    Falls alle Stricke reißen versuch mal den Code aufs Wesentliche zu reduzieren (siehe Link in meiner Signatur)...



  • pumuckl schrieb:

    Enno schrieb:

    Da ich es gelesen habe weiß ich das der Header mit rein muss ...

    Dann kennt der Compiler auf jeden Fall auch das assert.

    Falls alle Stricke reißen versuch mal den Code aufs Wesentliche zu reduzieren (siehe Link in meiner Signatur)...

    Ich weiß ja nciht ...
    Hab das einfach stumpf abgeschrieben. fehler:

    sysinfo.cpp:137:8: Fehler: expected unqualified-id before »(« token
    sysinfo.cpp:137:8: Fehler: »dev« wurde in diesem Gültigkeitsbereich nicht definiert
    


  • Jetzt musst du uns nurnoch sagen, welche Zeile Nr 137 ist. Ich rate mal (da du uns keinen Code zeigst): du hast einfach eine freie Funktion definiert, die mit der Stelle, wo du dev definierst, nichts zu tun hat? Dann ist das auch kein Wunder - woher soll der Compiler da wissen was dev ist? Stumpf abschreiben bringt wie du siehst nicht viel. Verstehen und an deine Situation anpassen ist die Devise.



  • pumuckl schrieb:

    Jetzt musst du uns nurnoch sagen, welche Zeile Nr 137 ist. Ich rate mal (da du uns keinen Code zeigst): du hast einfach eine freie Funktion definiert, die mit der Stelle, wo du dev definierst, nichts zu tun hat? Dann ist das auch kein Wunder - woher soll der Compiler da wissen was dev ist? Stumpf abschreiben bringt wie du siehst nicht viel. Verstehen und an deine Situation anpassen ist die Devise.

    Das dev Problem ist gelöst ... aber die andere Zeile leider nicht. Halt mich nicht für ganz dumm. Das ich das ganze ding in meine Klasse einbauen muss ist klar.

    Es funktioniert einfach diese Zeile nicht:

    std::assert(i < dev.size());
    


  • Enno schrieb:

    Halt mich nicht für ganz dumm.

    Du machst es einem sehr schwer ...



  • Belli schrieb:

    Du machst es einem sehr schwer ...

    Nur für dich Belli. 🤡



  • lass mal das std:: weg. Und noch was: anstelle von assert wäre es an dieser Stelle eventuell sogar besser, eine Exception zu werfen (->Grundlagenbuch), weil kein Programmierfehler vorliegt, sondern eine falsche Eingabe des Benutzers. Aber das nur so am Rande... komm erstmal mit deinem Code klar, dann kannst du dich um sowas kümmern.

    Enno schrieb:

    Halt mich nicht für ganz dumm.

    Nun, du zeigst keinen bzw. unvollständigen Code, gehst nicht auf unsere Fragen ein, lieferst deine Aufgabenbeschreibung nur sehr bruchstückhaft, eignest dir keine Grundlagen an, liest dir die "Fragestellungs-Threads" aus pumuckels Signatur nicht durch,...

    Wir versuchen (trotzdem), dir zu helfen. Gerade bei Anfängern sind es häufig so offensichtliche Sachen wie ein vergessener Header.


Anmelden zum Antworten