vector durchlaufen



  • 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          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)...


Anmelden zum Antworten