Kommt nur murks raus
-
Hey ich mal wieder

Folgendes Problem:
Bei mir kommt bei der Ausgabe (auf der Konsole) so ein komischer kram raus und ich versteh nicht wieso?Update Networkstat: 0x7fff740ce1a0sysinfo.h
#include <iostream> #ifndef SYSINFO_H #define SYSINFO_H namespace exsystem { class SYSInfo { public: void systemreboot(); SYSInfo(); ~SYSInfo(); int getTotalram(); void *getUpdateNetworkstat(); const char *getSysname(); const char *getRelease(); const char *getNodename(); const char *getMaschine(); private: int Totalram; std::string UpdateNetworkstat; std::string SysnameInfo; std::string ReleaseInfo; std::string NodenameInfo; std::string MachineInfo; }; } #endifsysinfo.cpp
#include <cstdio> #include <unistd.h> #include <sys/types.h> #include <sys/reboot.h> #include <sys/sysinfo.h> #include <sys/utsname.h> #include <fstream> #include <string> #include "sysinfo.h" //#ifdef POSIX namespace exsystem { int SYSInfo::getTotalram(){ return Totalram; } void *SYSInfo::getUpdateNetworkstat(){ std::ifstream UpdateNetworkstat("/proc/net/dev"); return UpdateNetworkstat; } 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(){ } } //#endifsysinfo.cpp
#include "../sysinfo.h" int main(){ exsystem::SYSInfo a; std::cout << "Ram: " << a.getTotalram() << std::endl; std::cout << "Update Networkstat: " << a.getUpdateNetworkstat() << 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; }
-
enno schrieb:
Bei mir kommt bei der Ausgabe (auf der Konsole) so ein komischer kram raus und ich versteh nicht wieso?
Weil Du einen Zeiger (auf ein zu dem Zeitpunkt nicht mehr existierendes Objekt) ausgibst. Das ist eine Adresse.
Was glaubst z.B. hier zu tun?
void *SYSInfo::getUpdateNetworkstat(){ std::ifstream UpdateNetworkstat("/proc/net/dev"); return UpdateNetworkstat; }
-
Das ist ja immer noch derselbe Müll wie gestern. Schau in den anderen Thread, was ich dir zu std::string gesagt habe. Und das mit dem Speicherloch gilt weiterhin!
-
@daddy
tut mir leid ich weiß was du meinst und habes ja auch geändert ... allerdings soll ich das nicht ändern das wird hier so gemacht frag mich nicht warum ich hab kein plan!!@Tachyon
Ich wollte den kram den in dem Verzeichnis "/proc/net/dev" zurück geben ... geht das so nicht?
-
Enno schrieb:
[cpp]
const char *getMaschine();
[...]
std::string MachineInfo;[/cpp]So ein Mischmasch solltest du prinzipiell meiden. Kann in komplexeren Projekten nur schiefgehen.
Und mit dem "Kram" meinst du Ordner und Dateien? Dann iteriere über alle Objekte und gib jedes einzeln aus/zurück/was-auch-immer.
-
Enno schrieb:
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; } } void *SYSInfo::getUpdateNetworkstat(){ std::ifstream UpdateNetworkstat("/proc/net/dev"); return UpdateNetworkstat; }Wie heisst eure Anwendung? Glücksrad für Linux?^^
Machs doch so in der Art: (Fehlerabfragen müsste man noch einbauen)
#include <iostream> #include <fstream> #include <vector> using namespace std; class EineKlasse { private: vector<char>Data; public: void getUpdateNetworkstat ( string filename ); void PrintNetworkstat(); }; void EineKlasse :: getUpdateNetworkstat ( string filename ) { ifstream file( filename.c_str() ); file.seekg(0,ios::end); long size = file.tellg(); file.seekg(0,ios::beg); Data.resize( size + 1); file.read(&Data[0],size ); Data[size]='\x00'; // Nullterminator anhängen, sonst gibt cout lustige ASCII Zeichen mit aus } void EineKlasse :: PrintNetworkstat () { cout<<&Data[0]<<endl; } int main() { EineKlasse abc; abc.getUpdateNetworkstat( "test.txt" ); abc.PrintNetworkstat(); return 0; }
-
Korrigiere wenn ich mich irre, aber damit bist du im ungültigen Bereich:
Data[size]='\x00';Daher
Data.resize(size+1)
-
Oops ja stimmt, mein Fehler habs oben korrigiert.
-
Enno schrieb:
@Tachyon
Ich wollte den kram den in dem Verzeichnis "/proc/net/dev" zurück geben ... geht das so nicht?/proc/net/dev ist unter Linux aber kein Verzeichnis. Bitte informiere dich doch einfach erstmal, bevor du wild irgendeinen Unsinn durch den Compiler jagst. Mit proc(5) (einfach "man 5 proc" auf der Konsole eingeben) könntest du anfangen.
Ein Buch über C++ und Unix/Linux wäre aber auch nicht verkehrt. "The Linux Programming Interface" von Michael Kerrisk ist hier ein recht umfassendes und dennoch aktuelles Buch von ordentlicher Qualität.
-
also wenn ich bei mir cat /proc/net/dev eingebe zeigt der mir das hier an:
Inter-| Receive | Transmit face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed lo: 78345 251 0 0 0 0 0 0 78345 251 0 0 0 0 0 0 wlan0: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 eth0: 6131451 9365 0 0 0 0 0 2522 552388 4420 0 0 0 0 0 0d.h. doch dann wohl das das ein verzeichnis ist was ich auslesen kann? oder verstehe ich da etwas kommplett falsch?
/proc/net/dev The dev pseudo-file contains network device status information. This gives the number of received and sent pack‐ ets, the number of errors and collisions and other basic statistics. These are used by the ifconfig(8) program to report device status.
-
Wie viele Verzeichnisse kennst du, die man mit cat ausgeben kann und die auf der zugehörigen Manpage "pseudo-file" genannt werden?
Ich glaube, HepSepp hat vollkommen recht. Wie viel sollen wir dir eigentlich noch helfen, wenn du die Antworten wegen mangelndem Hintergrundwissen doch nicht verstehst? Zumal dir in schon mehreren Threads Quasi-Komplettlösungen gegeben wurden, die du nicht als solche erkannt hast (siehe vorherige Bemerkung über Verstehen der Antworten).
-
Bassmaster schrieb:
Enno schrieb:
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; } } void *SYSInfo::getUpdateNetworkstat(){ std::ifstream UpdateNetworkstat("/proc/net/dev"); return UpdateNetworkstat; }Wie heisst eure Anwendung? Glücksrad für Linux?^^
Machs doch so in der Art: (Fehlerabfragen müsste man noch einbauen)
#include <iostream> #include <fstream> #include <vector> using namespace std; class EineKlasse { private: vector<char>Data; public: void getUpdateNetworkstat ( string filename ); void PrintNetworkstat(); }; void EineKlasse :: getUpdateNetworkstat ( string filename ) { ifstream file( filename.c_str() ); file.seekg(0,ios::end); long size = file.tellg(); file.seekg(0,ios::beg); Data.resize( size + 1); file.read(&Data[0],size ); Data[size]='\x00'; // Nullterminator anhängen, sonst gibt cout lustige ASCII Zeichen mit aus } void EineKlasse :: PrintNetworkstat () { cout<<&Data[0]<<endl; } int main() { EineKlasse abc; abc.getUpdateNetworkstat( "test.txt" ); abc.PrintNetworkstat(); return 0; }wenn ich das nun einbaue bekomme ich diesen fehler:
43:8: Fehler: »class std::vector<char>« hat kein Element namens »resized«@sepp
tut mir leid ich hab nicht alles in diesem thread vorhin gelesen ...
dazu hab ich wirklich kein plan und hab deswegen ja auch in meinem post gefragt ob ich das falsch verstanden habe.
wenigstens versuche ich das alles hier zu lernen udn bin über jede hilfe dankbar wenns dich jedoch nervt dann weiß ich nicht lies es nicht oder lösche das?
-
Wenn du lernen willst, versuch doch mal den Fehler mit dem resized selber zu lösen. Wie würdest du anfangen, wenn du einen solchen Fehler hast? Tipp: Compiler haben immer Recht, es gibt tatsächlich keine Methode "resized" in std::vector.
-
Enno schrieb:
43:8: Fehler: »class std::vector<char>« hat kein Element namens »resized«resized? Gute Guete, du wirst das doch hoffentlich nicht abgetippt haben, oder?

-
SeppJ schrieb:
Wenn du lernen willst, versuch doch mal den Fehler mit dem resized selber zu lösen. Wie würdest du anfangen, wenn du einen solchen Fehler hast? Tipp: Compiler haben immer Recht, es gibt tatsächlich keine Methode "resized" in std::vector.
edit: fail
habs nun erst ganz raus gemacht und dann dort nachgelesen wies heißt
-
Meinst du das eigentlich ernst? Das ist ein Nachbau von vector für C und hat mit std::vector herzlich wenig am Hut. Die richtige Referenz ist hier:
http://www.cplusplus.com/reference/stl/vector/
-
nu bekomm ich halt immer diesen fehler:
Speicherzugriffsfehler (Speicherabzug geschrieben)
-
Das liegt daran, dass du etwas falsch gemacht hast.
Ernsthaft: benutze den Debugger (valgrind oder auch gdb) und finde heraus, in welcher Zeile das passiert.
-
ah danke
-
Da hast du wohl murks gebaut.