Anfängerfragen
-
SeppJ schrieb:
time_t start; // Zeiten sind vom Typ time_t time (&start); // Zeit am Anfang speichern
sadfsg schrieb:
unsigned int StartZeit = static_cast<unsigned int>(time(0));
Warum macht ihr es eigentlich immer so kompliziert? Anfänger verwirren?
time_t start = time(0); // fertig
-
[quote="LordJaxom"]
SeppJ schrieb:
time_t start = time(0); // fertig
Was macht der Code jetzt genau?
start ist die Variable vom Typ time_t?
Diese bekommt den Wert time(0), also beginnt bei Null???Und wie würde ich damit den 2. Wert messen, am Ende des Programmes?
-
Barcelona schrieb:
Was macht der Code jetzt genau?
start ist die Variable vom Typ time_t?
Diese bekommt den Wert time(0), also beginnt bei Null???Und wie würde ich damit den 2. Wert messen, am Ende des Programmes?
Lies die verlinkte Referenz. Da steht drin, was es mit der 0 auf sich hat.
Soviel zum Thema 'Anfänger verwirren'
-
jupp und was soll er mit time_t denn anfangen, ist in nem integer doch hundertmal besser für ihn.
-
Habt ihr auch einen Befehl, um das Skript (oder die Befehlsleiste, weiß nicht wie das in C++ richtig genannt wird...) schlafen zu lassen?
In Ruby macht man das mit: sleep(5) zum Beispiel
Gibt es den Befehl auch in C++?
-
Hat sich erledigt...
#include <windows.h>
Sleep(2000)
Wenn noch wer einen guten Vorschlag hat, um auch die Zehntelsekunden anzeigen zu lassen... immer raus damit
Wieso ist das Sleep eigentlich großgeschrieben? Konsonante?
-
Barcelona schrieb:
Wieso ist das Sleep eigentlich großgeschrieben? Konsonante?
Weil das nicht zu C++ gehört sondern eine spezielle Microsoft-Bibliothek. Die können ihren Kram nennen wie sie wollen.
Für Zehntelsekunden: Wie schon gesagt, clock kann dies möglicherweise leisten. Aber da sind eher weitere betriebssystemabhängige Funktionen gefragt.
-
Tim06TR schrieb:
jupp und was soll er mit time_t denn anfangen, ist in nem integer doch hundertmal besser für ihn.
Rate mal, was
time_t
mit allergrösster Wahrscheinlichkeit für ein Datentyp ist.Mit
time_t
spart er sich aber die unnötige Casterei und allfällige (unter Umständen berechtigte) Warnungen und kann direkt mit dem passenden Datentypen arbeiten.
-
:p ups
-
Nochmal eine Anfängerfrage... zu einer anderen Sache.
Hab' ein Programmbeispiel gesehen zur Speicherzuweisung, welches
checkt wieviel Speicher zur Verfügung steht.#include <iostream> using namespace std; int main() { char *p; for (int i=1; ; i++) { p = new char[10000]; // Pointer auf einen Array mit 10000 Stellen if (p==0) break; cout << "RAM zugeteilt: " << 10 * i << "kb\n"; // 10 kb pro Charakter } return 0; }
Hab dazu ein paar Fragen:
1. In der for-Schleife: Was genau kommt in so eine Schleife?
Zuerst Deklaration von Variablen? Dann Endbedingung? Dann Schritt, wenn Schleife durchlaufen wurde???2. Ist mein Kommentar zu "p" richtig?
Wenn ja, wieso findet das Programm dann bei mir zB 2 GB Ram, bei 10.000 Stellen
im Array je 10 kb, wär das nur 1 GB maximal? Oder wie ist das?Weiß da jemand weiter, danke schon einmal!
-
1. Ja, aber das hättest du auch aus einem Anfängerbuch erfahren können..
2. Ja, allerdings ist p eigentlich lediglich ein Zeiger auf ein char, aber da ein Array von char implizit in ein char Zeiger umgewandelt werden kann stimmt das so.
Den zweiten Teil verstehe ich nicht so ganz.. Du allokierst da ja in jedem Schritt 10'000 Byte. Und das geht einfach so lange, bis new fehl schlägt, was nicht bereits sein muss, wenn dein RAM voll ist. Es könnte theoretisch auch was auf die HD ausgelagert werden o.ä. So kannst du also die Grösse des RAMs nicht ausmessen.Und bitte gib den Speicher am Ende wieder frei. Auch wenn es wahrscheinlich dein OS für dich macht sollte ein Programm den Speicher, denn es allokiert wieder frei geben. (siehe delete)
-
drakon schrieb:
1. Ja, aber das hättest du auch aus einem Anfängerbuch erfahren können..
Ja, stimmt wohl. Hab auch eins Mich wunderte nur, dass man die 2. Stelle einfach leer lassen kann
drakon schrieb:
2. Ja, allerdings ist p eigentlich lediglich ein Zeiger auf ein char, aber da ein Array von char implizit in ein char Zeiger umgewandelt werden kann stimmt das so.
Den zweiten Teil verstehe ich nicht so ganz.. Du allokierst da ja in jedem Schritt 10'000 Byte. Und das geht einfach so lange, bis new fehl schlägt, was nicht bereits sein muss, wenn dein RAM voll ist. Es könnte theoretisch auch was auf die HD ausgelagert werden o.ä. So kannst du also die Grösse des RAMs nicht ausmessen.Und bitte gib den Speicher am Ende wieder frei. Auch wenn es wahrscheinlich dein OS für dich macht sollte ein Programm den Speicher, denn es allokiert wieder frei geben. (siehe delete)
Aber was sagt denn dann die 10000 in
p = new char[10000];
aus?
Und den delete Befehl... einfach
delete p
am Ende, oder?
-
Man kann alle Stellen leer lassen. (das gibt dann das pendant zu while(1))
Die 10'000 sagen aus, dass du da ein Array mit 10'000 char's anforderst. Zurückgegeben wird ein Zeiger auf das erste Element.
Nein. Das freigeben klappt in deinem Fall nicht so einfach.
1. Wenn du new hast, dann gibst du mit delete frei und wenn dunew []
hast, dann gibst du den Speicher auch wieder mitdelete[]
frei.In deinem Falle verlierst du die den Zeiger auf die Arrays, weil du sie jedes mal überschreibst. Du musst dir also die Zeiger merken und nicht jedes mal überschreiben. (z.B in einem Array, oder einem Container der Standardbibliothek, wie z.B std::vector, std::list o.ä). Dann kannst du am Ende deines Programmes den ganzen Container durchlaufen und jedes Element freigeben.
Also ich würde dir dringend raten Speicherverwaltung in C++ nochmal genau anzuschauen. Das scheint dir noch nicht ganz soo klar zu sein. (ist aber recht wichtig).
-
Ach ja, man prüft den Erfolg von
new
nicht, indem man sich den zurückgegebenen Zeiger anschaut (es sei denn, man verwendet Placement New mitstd::nothrow
). Besser mittry/catch
aufstd::bad_alloc
-Exceptions abfragen.
-
Barcelona schrieb:
Nochmal eine Anfängerfrage... zu einer anderen Sache.
Neue Frage -> neuer Thread
Barcelona schrieb:
Hab' ein Programmbeispiel gesehen zur Speicherzuweisung, welches
checkt wieviel Speicher zur Verfügung steht.Leider ist das dumm
#include <iostream> #include <new> int main() { char *p; for (int i=1; ; i++) { p = new(std::nothrow) char[1024*10]; //10*1024Byte = 10*1kB = 10kB if (p == 0) break; cout << "RAM zugeteilt: " << 10*i << "kB" << std::endl; } //schließen der konsole evtl verhindern!? }
Hab dazu ein paar Fragen:
1. In der for-Schleife: Was genau kommt in so eine Schleife?
Zuerst Deklaration von Variablen? Dann Endbedingung? Dann Schritt, wenn Schleife durchlaufen wurde???1. google bzw buch/tut deiner wahl!?
2. endbedingung stimmt allerdings nicht ganz - eher eine so-lange bedingung2. Ist mein Kommentar zu "p" richtig?
Wenn ja, wieso findet das Programm dann bei mir zB 2 GB Ram, bei 10.000 Stellen
im Array je 10 kb, wär das nur 1 GB maximal? Oder wie ist das?jopp - der zu p stimmt ausnahmsweise mal^^
kA - deine Werte haben eh alle nich gestimmt
Weiß da jemand weiter, danke schon einmal!
Jopp - ich hab dir mal nen funktionierenden Quellcode gepostet...
bb
-
Danke erstmal für alle Antworten...
hab' mich heute das erste Mal mit dem Thema beschäftigt,...#include <iostream> #include <new> int main() { char *p; for (int i=1; ; i++) { p = new(std::nothrow) char[1024*10]; //10*1024Byte = 10*1kB = 10kB if (p == 0) break; cout << "RAM zugeteilt: " << 10*i << "kB" << std::endl; } //schließen der konsole evtl verhindern!? }
Wofür brauche ich denn das
#include <new>
? Ich dachte die "new" und
"delete" Funktion für Speicherzuteilung brauchen keinen Extra-Header...Und was macht das
new(std::nothrow)
?
-
1. nimm doch bitte die schaltfläche C/C++ anstatt die mit Code beschriftete - dann kann man so gar noch was lesen...
Barcelona schrieb:
Wofür brauche ich denn das
#include <new>
?für das std::nothrow
Barcelona schrieb:
Und was macht das
new(std::nothrow)
?new wirft normalerweise eine exception, wenn nicht mehr genug speicher vorhanden ist
wenn man aber möchte, dass es 0 zurückgibt und keine exception wirft, kann man new(std::nothrow) schreiben und schon funktioniert es genau so, wie es in dem fall wohl sinn machen würde...bb
PS: Das nächste mal lies doch bitte zu erst mal in deinem Buch/Tutorial ein paar Seiten dazu und wenn dort nix steht, google bzw http://www.cplusplus.com/reference/
oben links eingeben, was du suchst:
http://www.cplusplus.com/query/search.cgi?q=nothrow
erstes ergebnis:
http://www.cplusplus.com/reference/std/new/nothrow/