Frage zum Code



  • 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