wo ist der fehler?
-
hi!
bin grad dabei c++ zu lernen. hab da ma so mit müh und not was zusammgebastelt und es funktioniert nicht. aber ihr könnt mir bestimmt helfen. also das programm soll bloß dazu dienen zu messen wie lang der computer braucht um bis 10000 zu zählen. das kann man dazu verwenden um verschiedene computer auf ihre geschwindigkeit zu vergleichen
aber irgendwie funzt das nich
kann es auch einfach nur am compiler liegen? hab es mit dem bei dev-c++ und mit dem "microsoft visual c++ toolkit 2003" ausprobiert. wo ist der fehler? oder is die ganze sache villeicht nur ein einziger fehler?#include <iostream.h> #include <sys/time.h> using namespace std; main() { int i; timeval start, end; gettimeofday(&start, 0); for(i=0; i<10000; i++) { cout << i << endl; } gettimeofday(&end, 0); cout << start.tv_sec << ":" << start.rv_usec << endl; cout << end.tv_sec << ":" << end.tv_usec << endl; system("pause"); }
hoffe auf nützliche antworten,
-
1. Du bist im falschen Forum, das hier ist das C-Forum und du willst eins runter ins C++-Forum. Ich behandle das jetzt mal so als wärst du im C++-Forum
#include <iostream> // Kein .h, sonst hast du veraltete Header-Dateien #include <ctime> // Auch hier neue Header-Datei einsetzen using namespace std; int main() // int als rückgabetyp { // es gehört sich nicht in c++ variablen anzulegen bevor man sie benötigt // int i; weg damit also timeval start; //, end; end brauche nwir auch noch nicht gettimeofday(&start, 0); for(int i=0; i<10000; i++) // erst hier legen wir i an { cout << i << endl; // info zur programmlogik: du testest nicht wie lange das zählen dauert, sondern wie lange die ausgabe dauert - dieser befehl hier wird mit abstand die längste ausführungsdauer haben } timeval end; // erst hier end anlegen gettimeofday(&end, 0); cout << start.tv_sec << ":" << start.rv_usec << endl; cout << end.tv_sec << ":" << end.tv_usec << endl; system("pause"); // naja am anfang darfst du, aber später das bitte durch bessere mittel ersetzen (sobald du dich etwas auskennst in der FAQ nachsehen) return 0; // main hat auch einen rückgabewert }
Sollte jetzt besser sein
MfG SideWinder
-
ach und das
using namespace std;
is noch weil ich die ganze geschichte mit dem "microsoft visual c++ toolkit 2003" ausprobiert hab und man das irgendwie da immer brauch (glaub ich jedenfalls, ohne hat er bei allem immer nur fehlermeldungen ausgegeben, weiß auch nich warum
)
-
Das "using namespace std;" benötigst du wenn du richtigerweise die neuen Header-Dateien verwendest - also immer
MfG SideWinder
-
aha!
danke erstmal, aber ich bekomm trotzdem nur fehlermeldungen raus. in den zeilengettimeofday(&start, 0);
(`gettimeofday')
und
cout << start.tv_sec << ":" << start.rv_usec << endl;
('struct)
was kann das sein?
-
es muss <sys/time.h> sein
dann hast du einmal .rv_usec stehen
-
hab ich doch!
fehler in zeile: gettimeofday(&start, 0);
fehlermeldung:`gettimeofday'
fehler in zeile: cout << start.tv_sec << ":" << start.rv_usec << endl;
fehlermeldung: 'struct
-
Compileren von Sidewinders Code führt bei MSVC 6.0
E:\test\auflös\auflös.cpp(10) : error C2065: 'timeval' : nichtdeklarierter Bezeichner
E:\test\auflös\auflös.cpp(10) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'start'
E:\test\auflös\auflös.cpp(10) : error C2065: 'start' : nichtdeklarierter Bezeichner
E:\test\auflös\auflös.cpp(11) : error C2065: 'gettimeofday' : nichtdeklarierter Bezeichner
E:\test\auflös\auflös.cpp(19) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'end'
E:\test\auflös\auflös.cpp(19) : error C2065: 'end' : nichtdeklarierter Bezeichner
E:\test\auflös\auflös.cpp(21) : error C2228: Der linke Teil von '.tv_sec' muss eine Klasse/Struktur/Union sein
E:\test\auflös\auflös.cpp(21) : error C2228: Der linke Teil von '.rv_usec' muss eine Klasse/Struktur/Union sein
E:\test\auflös\auflös.cpp(22) : error C2228: Der linke Teil von '.tv_sec' muss eine Klasse/Struktur/Union sein
E:\test\auflös\auflös.cpp(22) : error C2228: Der linke Teil von '.tv_usec' muss eine Klasse/Struktur/Union sein
Fehler beim Ausführen von cl.exe.Die Funktion getTimeOfDay führt in der MSDN zu Time.getTimeOfDay sonst gibt es keinen eintrag
timeval führt in der MSDN zum Platform SDK: Windows Sockets
The timeval structure is used to specify time values. It is associated with the Berkeley Software Distribution (BSD) file Time.h.// Sind in der Windows Welt nicht eher diese Strukturen time_t aclock; SYSTEMTIME SystemTime; struct _timeb tstruct; struct tm *newtime; // und diese Funktionen GetLocalTime(&SystemTime); time( &aclock ); // Get time in seconds _ftime( &tstruct ); // sinnvoll
Und zum präzisen Timen bietet sich
LARGE_INTEGER start; double frq; LARGE_INTEGER f; LARGE_INTEGER end; QueryPerformanceFrequency(&f); frq=1.00L/(double)f.QuadPart; QueryPerformanceCounter(&start); ..... QueryPerformanceCounter(&end); return (((double)(end.QuadPart-start.QuadPart))*frq);
Und da wir uns hier im C-Forum befinden darf ich die Variablen am Anfang des Blockes deklarieren
-
Ah sys/time.h scheint dann komplett UnixOnly zu sein, dann kann das unter Windows natürlich nicht funktionieren. Du michst da etwas
Machs dann so wie PAD für Windows
MfG SideWinder
-
Schau mal in diesen Beitrag, da ist eine Funktion dies das timen nach dieser Methode übernimmt
http://www.c-plusplus.net/forum/viewtopic-var-p-is-816068-and-highlight-is-.html#816068
-
SideWinder schrieb:
Ah sys/time.h scheint dann komplett UnixOnly zu sein, dann kann das unter Windows natürlich nicht funktionieren. Du michst da etwas
Machs dann so wie PAD für Windows
MfG SideWinder
Ich mag es überlesen haben, aber wo hat er gesagt, er will für Windows programmieren??
-
kann es auch einfach nur am compiler liegen? hab es mit dem bei dev-c++ und mit dem "microsoft visual c++ toolkit 2003" ausprobiert.
Der Compiler lässt auf eine Windows-Umgebung schließen
Edit: Und auch sonst logisch, der User hat die Buildnummer seiner Distri nicht gepostet. Lässt auf Non-Unix schließen
MfG SideWinder
-
hab es mit dem bei dev-c++ und mit dem "microsoft visual c++ toolkit 2003" ausprobiert. wo ist
-
danke für die demonstration meiner dummheit *g*
-
du hast danach gefragt
Ja, Ja das Leben ist hart und ungerecht.
Gute Nacht
-
danke für die antworten aber kann bitte mal jemand posten wie das programm dann fertig aussieht? krieg das nähmlich nich gebacken...
hab linux un windows, das hier war aber eigentlich für windows gedachthoffe es macht sich jemand nochmal die mühe,
-
Das wird etwas problematisch.
Die beiden Betriebssysteme haben untershiedliche Aufrufe für solche Timingfunktionen.
Die einfachste Idee wäre definier dir eine eigene Funktion in einem eigenen File. Überall in deinen Programmen in denen
du timings messen möchtest rufst du diese Funktion auf. Die Funktion myTiming ist in einem eigenen C-Filedouble myTiming(int flag) { ... }
Unter Windows füllst du dann die Funktion myTiming mit
double myTiming(int flag) { return PerformanceTime(flag); }
Unter Unix füllst du dann die Funktion myTiming mit
einer Funktion die dir dort diese Funktionalität zur Verfügung steht, da kann ich jetzt
leider nicht helfen ich kenne mich dazu zu wenig in Unix aus, aber da waren ja die Vorschläge von SidewinderJe nach dem in welchem Betriebssystem du arbeitetest bindest du beim linken den richtigen C-Code hinzu.
Man kann diese Sachen noch verfeineren, in dem man sich zum Beispiel eine Library mit solchen Kompatibilitätsroutinen schreibt,
oder in dem man mit conditionaler Compilierung (#ifdef)aus einem Source je nach Betriebssystem die entsprechenden Funktionen zusammenstellt. Das ist aber etwas aufwendigerViel Spaß
@c.rackwitz Eigentlich ist alles noch viel schlimmer nicht Windoof oder sondern Windoof und Unix