Frage zum Code



  • Da fehlt der namespace in sysinfo.cpp


  • Mod

    Deine Funktionsdefinitionen müssen im gleichen namespace sein, wie die Klassendefinition. Aber eigentlich hätte dann schon das übersetzen der sysinfo.cpp schiefgehen müssen. Da passt irgendetwas nicht zusammen. Ist das wirklich 1:1 der Code, der nicht funktioniert und die exakten Fehlermeldungen zu eben diesem Code? Und welcher der Codeschnippsel gehört zu welchem Dateinamen?

    Beachte bitte auch die Anmerkungen von daddy_felix, die sind wichtig. Das sind schwere Designmängel in deinem Code, die dich noch verfolgen werden, selbst wenn es erst einmal läuft.



  • Hab grade Hilfe hier im Betrieb bekommen! Tja und da heute der Ausbilder nicht da ist hab ich nu erstmal frei und da der es verbockt hat darf er es morgen richten 😃
    Laut des Azubi ausm 2ten liegt das an einem linker Problem.

    Danke trotzdem!



  • Enno schrieb:

    Laut des Azubi ausm 2ten liegt das an einem linker Problem.

    wir haben dir doch das Problem schon genannt? es fehlt der namespace. Der Fehler fällt dann dem Linker auf.

    Liest du unsere Antworten überhaupt?



  • Doch!
    namespace wurde eingesetzt hat aber nciht geklappt



  • na gut ich habs aus spaß noch einmal versucht nun läuft es 😕

    falls es euch interessiert so sieht es nun aus

    #include <iostream>
    #include <cstdio>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/reboot.h>
    #include <sys/sysinfo.h>
    #include <sys/utsname.h>
    #include "../sysinfo.h"
    
    int main(){
    
      exsystem::SYSInfo *a = new exsystem::SYSInfo();  
      std::cout << "Ram: " << a->getTotalram() << std::endl;
      delete a;
      return 0;
    }
    
    #include <cstdio>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/reboot.h>
    #include <sys/sysinfo.h>
    #include <sys/utsname.h>
    
    #include "sysinfo.h"
    
    //#ifdef POSIX
    
    namespace exsystem {
    int SYSInfo::getTotalram(){
      return Totalram;
    }
    
    const char* SYSInfo::getSysname(){
      return SysnameInfo.c_str();
    }
    
    const char* SYSInfo::getRelease(){
      return ReleaseInfo.c_str();
    }
    
    const char* SYSInfo::getNodename(){
      return NodenameInfo.c_str();
    }
    
    const char* SYSInfo::getMaschine(){
      return MachineInfo.c_str();
    }
    
    SYSInfo::SYSInfo(){
      struct sysinfo *mysys = new struct sysinfo;
      struct utsname myInfo;
      if(sysinfo(mysys)!=-1){
        Totalram=mysys->totalram/1024;
      }
      if (uname(&myInfo) != -1) {
        SysnameInfo=myInfo.sysname;
        ReleaseInfo=myInfo.release;
        NodenameInfo=myInfo.nodename;
        MachineInfo=myInfo.machine;
      }
    }
    
    SYSInfo::~SYSInfo(){
    }
    }
    
    //#endif
    
    #include <iostream>
    
    #ifndef SYSINFO_H
    #define SYSINFO_H
    
    namespace exsystem {
    class SYSInfo {
    public:
      void systemreboot();
      SYSInfo();
      ~SYSInfo();
      int getTotalram();
      const char* getSysname();
      const char* getRelease();
      const char* getNodename();
      const char* getMaschine();
    private:
      int Totalram;
      std::string SysnameInfo;
      std::string ReleaseInfo;
      std::string NodenameInfo;
      std::string MachineInfo;
    };
    }
    
    #endif
    

    ausgabe:

    Ram: 3973944
    


  • schön, dass es läuft. Und weiterhin viel Spaß mit deinem Speicherloch...

    edit: in der main.cpp sind auch noch ein paar Header zuviel eingebunden. Zu den cahr*-Pointern hatte ich mich ja schon geäußert.



  • ehm ... ja so gut kenne ich mich nicht aus aber ich arbeite dran!
    darfst mir auch gerne einen Tip dazu geben!

    lg Enno



  • konkrete Tipps dazu:

    * Rückgabewert der Getter-Methoden: const std::string& anstelle von const char*
    * nach Möglichkeit kein new . Und wenn, dann nur in Verwendung mit einem Smartpointer. Bei dir sehe ich jetzt keinen Grund, Pointer zu verwenden.
    * in der main.cpp benätigst du nur #include "../sysinfo.h" .



  • habe alles so weit geänder nun steht in der konsole das hier:

    Warnung: Referenz auf temporären Wert wird zurückgegeben [standardmäßig aktiviert]
    

    ich mein es läuft aber kannst du mir sagen was das bedeutet?



  • das kann ich dir nur sagen, wenn du mir die entsprechende Codezeile zeigst.

    edit: meine Glaskugel vermutet, dass du in den Gettern immernoch return xyz.c_str() stehen hast. Das [c].c_str()[/] muss natürlich auch weg. An der Stelle wird der char-Pointer implizit in einen std::string umgewandelt. Eine Referenz auf diesen String wird zurückgegeben. Der String geht aber sofort danach out of scope, so dass die Referenz nicht mehr verwendbar ist.


  • Mod

    Lass das .c_str() weg. Was das bedeutet: Na, steht doch da, du gibst eine Referenz auf einen temporären Wert zurück, da der string den du in deiner return-Anweisung konstruierst nach verlassen der Funktion nicht mehr exisitert. Und das ist gar nicht gut. Dass es trotzdem funktioniert ist pures Pech, denn dadurch fällt der Fehler nicht sofort auf.



  • ist irgentwie nur einmal gekommen ... komisch

    naja allerdings klappt da etwas nicht und es kommt das hier raus wenn ich das mit std::string& mache in der konsole:

    System name: 8��ؓ�����ؓ `�ؓ�ؓ �ؓ�ؓSpeicherzugriffsfehler (Speicherabzug geschrieben)

    #include <iostream>
    
    #ifndef SYSINFO_H
    #define SYSINFO_H
    
    namespace exsystem {
    class SYSInfo {
    public:
      void systemreboot();
      SYSInfo();
      ~SYSInfo();
      int getTotalram();
      const std::string& getSysname();
      const std::string& getRelease();
      const std::string& getNodename();
      const std::string& getMaschine();
    private:
      int Totalram;
      std::string SysnameInfo;
      std::string ReleaseInfo;
      std::string NodenameInfo;
      std::string MachineInfo;
    };
    }
    
    #endif
    
    #include <cstdio>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/reboot.h>
    #include <sys/sysinfo.h>
    #include <sys/utsname.h>
    
    #include "sysinfo.h"
    
    //#ifdef POSIX
    
    namespace exsystem {
    int SYSInfo::getTotalram(){
      return Totalram;
    }
    
    const std::string&  SYSInfo::getSysname(){
      return SysnameInfo.c_str();
    }
    
    const std::string& SYSInfo::getRelease(){
      return ReleaseInfo.c_str();
    }
    
    const std::string& SYSInfo::getNodename(){
      return NodenameInfo.c_str();
    }
    
    const std::string& SYSInfo::getMaschine(){
      return MachineInfo.c_str();
    }
    
    SYSInfo::SYSInfo(){
      struct sysinfo *mysys = new struct sysinfo;
      struct utsname myInfo;
      if(sysinfo(mysys)!=-1){
        Totalram=mysys->totalram/1024;
      }
      if (uname(&myInfo) != -1) {
        SysnameInfo=myInfo.sysname;
        ReleaseInfo=myInfo.release;
        NodenameInfo=myInfo.nodename;
        MachineInfo=myInfo.machine;
      }
    }
    
    SYSInfo::~SYSInfo(){
    }
    }
    
    //#endif
    
    #include "../sysinfo.h"
    
    int main(){
      exsystem::SYSInfo a; 
      std::cout << "Ram: " << a.getTotalram() << std::endl;
      std::cout << "System name: " << a.getSysname() << std::endl;
      std::cout << "Release: " << a.getRelease() << std::endl;  
      std::cout << "Nodename: " << a.getNodename() << std::endl;  
      std::cout << "Maschine: " << a.getMaschine() << std::endl;    
      return 0;
    }
    

  • Mod

    daddy_felix schrieb:

    Liest du unsere Antworten überhaupt?

    Offensichtlich nicht.

    Tja, da habe ich besseres zu tun, als hier weiter zu helfen…



  • Hallo schau mal hier:

    #include <iostream>
    using namespace std;
    
    void foo ( string & str )
    {
       cout<<str;
    }
    
    int main ()
    {
    
    //foo ( "hallo" ); // Erzeugt --->  [C++ Warnung] Unit1.cpp(12): W8030 Temporäre Größe für Parameter 'str' in Aufruf von 'foo(string &)' verwendet
    
    string blup = "hallo";
    foo ( blup );   // Alles wieder gut^^
    
    return 0;
    }
    


  • hab den edit und seppj's post nicht gesehen tut mir leid war zu schnell!

    na so klappts dann ... und ihr seit aber auch immer ein wenig negativ 😕

    EDIT: Oh! man ihr seit echt die besten 😃 da hat der Azubi echt doof geguckt nach dem ich ihm die Verbesserung durch euch gezeigt hab!!! <3<3<3<3



  • Kannst deinem Kollegen ja mal von dem Forum hier erzählen vielleicht kennt er es noch nicht. (Bestes C++ Forum überhaupt meiner Meinung nach.)



  • Werd ich und ja du hast recht! alleine schon wie geduldig und schnell hier geholfen wird 🙂 (Y)


Anmelden zum Antworten