Kommt nur murks raus



  • Das versteh ich nun nicht ganz.
    Ich hab also meine 3 Dateien: .h .cpp .cpp
    Jetzt soll ich mir für operator<< operator>> und skip_line noch eine extra .h schreiben + extra .cpp?
    Muss die dann in meine .cpp(nicht main) mit #include "operator.h" rein oder wo inculdieren?



  • Enno schrieb:

    Das versteh ich nun nicht ganz.
    Ich hab also meine 3 Dateien: .h .cpp .cpp
    Jetzt soll ich mir für operator<< operator>> und skip_line noch eine extra .h schreiben + extra .cpp?
    Muss die dann in meine .cpp(nicht main) mit #include "operator.h" rein oder wo inculdieren?

    Ich würde das irgendwie so machen:

    1. Du erstellst eine Klasse class manage_dev { ..... }; . Dann hast du eine manage_dev.cpp und eine manage_dev.h
    2. Dann hast du die Input/Output Funktionen. Dafür erstellst du eine io.h und eine io.cpp .
    3. In der io.cpp inkludierst du dann manage_dev.h und in der io.h reicht eine Forwärtsdeklaration class manage_dev;
    4. In der main.cpp inkludierst du dann manage_dev.h und io.h .

    Ich hoffe, ich hab jetzt auf die Schnelle nichts durcheinander gebracht.



  • Oh je ...
    Also ich bin grade am basteln und es scheint fast fertig.
    Jedoch weiß ich nicht ob die io.h und io.cpp so richtig sind:

    .cpp

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector> 
    #include <iterator> 
    #include <limits>
    #include <utility>
    
    #include "sysinfo.h"
    
    std::istream& SYSInfo::skip_line(std::istream& in){ 
      return in.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); 
    }
    
    std::istream& SYSInfo::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& SYSInfo::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; 
    }
    

    Also die .h ist sicher falsch denke ich 😞

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector> 
    #include <iterator> 
    #include <limits>
    #include <utility>
    
    #ifndef OH_H
    #define OH_H
    
    std::istream& skip_line(std::istream& in);
    
    std::istream& operator>>(std::istream& in, face& f);
    
    std::ostream& operator<<(std::ostream& out, const face& f);
    
    #endif
    

    Ich denke das hier ist auch noch wichtig aus der sysinfo.cpp:

    #include <fstream>
    #include <string>
    #include <iostream>
    #include <vector> 
    #include <iterator> 
    #include <limits>
    #include <utility>
    
    #include "sysinfo.h"
    
    //#ifdef POSIX
    
    using namespace exsystem; 
    using namespace std;
    
    void SYSInfo::read_dev(vector<face>& dev){ 
      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)); 
    } 
    
    void SYSInfo::table(vector<face>& dev){ 
      for(vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it) 
        cout << '\n' << *it << '\n'; 
    } 
    
    unsigned SYSInfo::getPackets(vector<face>& dev){
      return dev[2].packets_received;  
    }
    
    vector<pair<string,unsigned> > SYSInfo::packets_received_all(const vector<face>& dev){
      vector<pair<string,unsigned> > packets_received; 
      for(vector<face>::const_iterator it=dev.begin(); it!=dev.end(); ++it) 
        packets_received.push_back( make_pair(it->name,it->packets_received) ); 
      return packets_received;
    }
    

    Meine Compiler Fehler dazu:

    sysinfo.h:56:8: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »read_dev« [-fpermissive]
    sysinfo.h:57:8: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »table« [-fpermissive]
    sysinfo.h:58:12: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »getPackets« [-fpermissive]
    sysinfo.cpp: In Elementfunktion »void exsystem::SYSInfo::read_dev(std::vector<exsystem::SYSInfo::face>&)«:
    sysinfo.cpp:41:11: Fehler: »skip_line« wurde in diesem Gültigkeitsbereich nicht definiert
    sysinfo.cpp:43:21: Fehler: keine Übereinstimmung für »operator>>« in »file >> f«
    sysinfo.cpp:43:21: Anmerkung: Kandidaten sind:
    

    Warum zusätzliche Qualifizierung und was ist auf einmal mit skip_line los?

    LG Enno



  • Hä?
    Ich hab mir so etwas vorgestellt:

    io.h

    #pragma once // Das brauchst du nicht, ist nur ein VS Bug.
    #ifndef IO_H
    #define IO_H
    
    #include <iostream>
    struct face;
    
    std::istream& skip_line(std::istream& in);
    std::istream& operator>>(std::istream& in, face& f);
    std::ostream& operator<<(std::ostream& out, const face& f);
    
    #endif
    

    io.cpp

    #include "io.h"
    #include "Test.h"
    #include <limits>
    
    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;
    }
    

    sysinfo.h

    #pragma once // Das brauchst du nicht, ist nur ein VS Bug.
    #ifndef SYSInfo_H
    #define SYSInfo_H
    
    #include <string>
    #include <utility>
    #include <vector>
    
    struct face
    {
        std::string name;
    
        unsigned bytes_received;
        unsigned packets_received;
        unsigned errs_received;
        unsigned drop_received;
        unsigned fifo_received;
        unsigned frame_received;
        unsigned compressed_received;
        unsigned multicast_received;
    
        unsigned bytes_transmitted;
        unsigned packets_transmitted;
        unsigned errs_transmitted;
        unsigned drop_transmitted;
        unsigned fifo_transmitted;
        unsigned colls_transmitted;
        unsigned carrier_transmitted;
        unsigned compressed_transmitted;
    };
    
    class SYSInfo
    {
    	private:
    		std::vector<face> dev;
    	public:
    		void read_dev();
    		void table();
    		unsigned getPacket();
    		std::vector< std::pair<std::string,unsigned> > packets_received_all();
    };
    
    #endif
    

    sysinfo.cpp

    #include "sysinfo.h"
    #include "io.h"
    #include <fstream>
    #include <iterator>
    
    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));
    }
    
    void SYSInfo::table(){
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		std::cout << '\n' << *it << '\n';
    }
    
    unsigned SYSInfo::getPacket(){
    	return dev[2].packets_received;  
    }
    
    std::vector< std::pair<std::string,unsigned> > SYSInfo::packets_received_all(){
    	  std::vector< std::pair<std::string,unsigned> > packets_received;
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		packets_received.push_back( make_pair(it->name,it->packets_received) );
    	  return packets_received;
    }
    

    main.cpp

    #include "sysinfo.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	SYSInfo sys_info;
    
        sys_info.read_dev();
        sys_info.table();
        vector<pair<string,unsigned>> packets_received = sys_info.packets_received_all();
    
        cout << endl << packets_received[0].first << ' ' << packets_received[0].second;
        cout << endl << packets_received[2].first << ' ' << packets_received[2].second;
    
    	cout << endl << sys_info.getPacket();
    }
    


  • Im Prinzip hatte ich es ja so nur die includes waren nicht richtig

    out schrieb:

    io.cpp

    #include "io.h"
    #include "Test.h" // ich denke ich brauch die nicht oder? ansonst was ist das?
    #include <limits>
    
    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;
    }
    

    Die beiden .h kommen sich wohl irgendwie in die quere?

    out schrieb:

    sysinfo.cpp

    #include "sysinfo.h"
    #include "io.h" // wenn ich diese rein mache bei mir kennt der alles was ich in sysinfo.h deklariert hab nicht mehr
    #include <fstream>
    #include <iterator>
    
    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));
    }
    
    void SYSInfo::table(){
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		std::cout << '\n' << *it << '\n';
    }
    
    unsigned SYSInfo::getPacket(){
    	return dev[2].packets_received;  
    }
    
    std::vector< std::pair<std::string,unsigned> > SYSInfo::packets_received_all(){
    	  std::vector< std::pair<std::string,unsigned> > packets_received;
    	  for(std::vector<face>::iterator it=dev.begin(); it!=dev.end(); ++it)
    		packets_received.push_back( make_pair(it->name,it->packets_received) );
    	  return packets_received;
    }
    

    Dieser Fehler ist immer noch da.

    sysinfo.h:52:8: Fehler: zusätzliche Qualifizierung »exsystem::SYSInfo::« an Element »read_dev« [-fpermissive]
    


  • 🤡 Ersetzte #include "Test.h" durch #include "sysinfo.h"

    Keine Ahnung was exsystem:: sein soll. Die Qualifizierung brauchst du nicht, ich weiß auch nicht, wieso du das dazugeschrieben hast. :p



  • out schrieb:

    🤡 Ersetzte #include "Test.h" durch #include "sysinfo.h"

    Keine Ahnung was exsystem:: sein soll. Die Qualifizierung brauchst du nicht, ich weiß auch nicht, wieso du das dazugeschrieben hast. :p

    Ehm läuft das bei dir? Weil bei mir klappt es immer noch nicht! In der sysinfo.cpp ist nichts mehr deklariert. Meinst du es hilft das exsystem:: weg zu machen?



  • Ich kopiere alles, was ich vorhin gepostet habe, ersetzte #include "Test.h" durch #include "sysinfo.h" . Und es funktioniert. Mach einfach mal ein neues Projekt.



  • AHHHHH ..... dummer Fehler ^^ guck dir meine sysinfo.h an die ich oben gepostet hab.

    So weit so gut^^ ...

    sysinfo.cpp: In Funktion »int main()«:
    sysinfo.cpp:9:14: Fehler: keine passende Funktion für Aufruf von »SYSInfo::read_dev()«
    sysinfo.cpp:9:14: Anmerkung: Kandidat ist:
    ../sysinfo.h:52:8: Anmerkung: void SYSInfo::read_dev(std::vector<face>&)
    ../sysinfo.h:52:8: Anmerkung:   Kandidat erwartet 1 Argument, 0 angegeben
    sysinfo.cpp:10:11: Fehler: keine passende Funktion für Aufruf von »SYSInfo::table()
    

    main.cpp:

    #include <iostream> 
    
    #include "../sysinfo.h"
    
    using namespace std;
    
    int main(){ 
      SYSInfo a;
      a.read_dev(); 
      a.table(); 
      vector<pair<string,unsigned> > packets_received = a.packets_received_all();
      cout << "Packets recevied:" << endl;
      cout  << packets_received[0].first << ' ' << packets_received[0].second << endl;
      cout  << packets_received[1].first << ' ' << packets_received[1].second << endl;  
      cout  << packets_received[2].first << ' ' << packets_received[2].second << endl;
    }
    


  • Da stimmt etwas mit deinem Verzeichnis nicht. Wieso liegen sysinfo.h und sysinfo.cpp in unterschiedlichen Verzeichnissen?...

    sysinfo.cpp:9:14: Anmerkung: Kandidat ist:
    ../sysinfo.h:52:8: Anmerkung: void SYSInfo::read_dev(std::vector<face>&)



  • out schrieb:

    Da stimmt etwas mit deinem Verzeichnis nicht. Wieso liegen sysinfo.h und sysinfo.cpp in unterschiedlichen Verzeichnissen?...

    sysinfo.cpp:9:14: Anmerkung: Kandidat ist:
    ../sysinfo.h:52:8: Anmerkung: void SYSInfo::read_dev(std::vector<face>&)

    Das ist doch wurst solange ich das richtig inculde oben? liegt halt ein Ordner vorher.

    Nur ist jetzt irgendwo irgendwas nicht richtig verlinkt -.-:

    libexsystem.so: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, face const&)'
    libexsystem.so: undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, face&)'
    libexsystem.so: undefined reference to `skip_line(std::basic_istream<char, std::char_traits<char> >&)'
    collect2: ld gab 1 als Ende-Status zurück
    


  • Enno schrieb:

    out schrieb:

    Da stimmt etwas mit deinem Verzeichnis nicht. Wieso liegen sysinfo.h und sysinfo.cpp in unterschiedlichen Verzeichnissen?...

    sysinfo.cpp:9:14: Anmerkung: Kandidat ist:
    ../sysinfo.h:52:8: Anmerkung: void SYSInfo::read_dev(std::vector<face>&)

    Das ist doch wurst solange ich das richtig inculde oben? liegt halt ein Ordner vorher.

    Auf jeden Fall gibt es die Funktion SYSInfo::read_dev(std::vector<face>&) nicht. Meine Funktion hat keinen Parameter. Du hast entweder falsch kopiert oder die Verzeichnisse stimmen nicht.

    Enno schrieb:

    Nur ist jetzt irgendwo irgendwas nicht richtig verlinkt -.-:

    libexsystem.so: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, face const&)'
    libexsystem.so: undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, face&)'
    libexsystem.so: undefined reference to `skip_line(std::basic_istream<char, std::char_traits<char> >&)'
    collect2: ld gab 1 als Ende-Status zurück
    

    Keine Ahnung. :p



  • out schrieb:

    Keine Ahnung. :p

    Na komm, gib Dir mal ein bisschen Mühe.



  • out schrieb:

    Enno schrieb:

    out schrieb:

    Da stimmt etwas mit deinem Verzeichnis nicht. Wieso liegen sysinfo.h und sysinfo.cpp in unterschiedlichen Verzeichnissen?...

    sysinfo.cpp:9:14: Anmerkung: Kandidat ist:
    ../sysinfo.h:52:8: Anmerkung: void SYSInfo::read_dev(std::vector<face>&)

    Das ist doch wurst solange ich das richtig inculde oben? liegt halt ein Ordner vorher.

    Auf jeden Fall gibt es die Funktion SYSInfo::read_dev(std::vector<face>&) nicht. Meine Funktion hat keinen Parameter. Du hast entweder falsch kopiert oder die Verzeichnisse stimmen nicht.

    Enno schrieb:

    Nur ist jetzt irgendwo irgendwas nicht richtig verlinkt -.-:

    libexsystem.so: undefined reference to `operator<<(std::basic_ostream<char, std::char_traits<char> >&, face const&)'
    libexsystem.so: undefined reference to `operator>>(std::basic_istream<char, std::char_traits<char> >&, face&)'
    libexsystem.so: undefined reference to `skip_line(std::basic_istream<char, std::char_traits<char> >&)'
    collect2: ld gab 1 als Ende-Status zurück
    

    Keine Ahnung. :p

    Tja ... ich kopiere nicht! Das mit dem Parameter ist mir auch aufgefallen! Ich lerne durch abschreiben mehr da ich Fehler mache! Wichtig!
    Naja w/e jetzt NUR noch das linking Problem lösen und es dürfte laufen! ^^ :p



  • Enno schrieb:

    Ich lerne durch abschreiben mehr da ich Fehler mache! Wichtig!

    Genau, der Lernfortschritt ist ja auch unübersehbar ...



  • Belli schrieb:

    Enno schrieb:

    Ich lerne durch abschreiben mehr da ich Fehler mache! Wichtig!

    Genau, der Lernfortschritt ist ja auch unübersehbar ...

    jaja Hass mich ruhig



  • Enno schrieb:

    Tja ... ich kopiere nicht! Das mit dem Parameter ist mir auch aufgefallen! Ich lerne durch abschreiben mehr da ich Fehler mache! Wichtig!
    Naja w/e jetzt NUR noch das linking Problem lösen und es dürfte laufen! ^^ :p

    Achso ist das:D Der Linkerfehler kommt, wenn etwas Deklariert aber nicht Definiert ist. Musst du mal schauen.



  • Enno schrieb:

    jaja Hass mich ruhig

    Warum sollte ich? Ich amüsier mich hier köstlich.



  • Belli schrieb:

    Enno schrieb:

    jaja Hass mich ruhig

    Warum sollte ich? Ich amüsier mich hier köstlich.

    @Belli
    Dann ist ja gut! 😃 Du weißt wahrscheinlich genau was es ist und es ist bestimmt etwas mega dummes!

    Ich hab auch gar kein Plan warum. -.- Hab alle Dateien in einen Ordner gemacht hab alles eben noch mal Kopiert von dir out aber hilft nichts.



  • Wie kompilierst du denn das Zeug. Hast du eine IDE?


Anmelden zum Antworten