Hey Folks,
ich bin noch ein Newbie im Programmieren unter C und bastell gerade an Snake.
Mein Problem:
Die Bewegung wollte ich mit einer For-Schleife verlangsamen, doch das ist Müll, da das ja auch auf schnelleren rechnern läuft.
Habt ihr ne Ahnung, wie ich den Computer für eine bestimmte Zeit warten lasse???
Und noch was:
Ich hab irendwo gelesen, das man mehrere .c dateien zu einer Datei Zusammen fassen kann. D.h, in der einen steht int main, in den anderen Dateinen stehen weitere Funktionen. Anscheinend kann man die mit "extern funktion" zusammen bringen. Irgendwelche Ideen???
Cya Matong
Zeitschleife im Programm
Re: Zeitschleife im Programm
Hi,
> Habt ihr ne Ahnung, wie ich den Computer für eine bestimmte Zeit warten lasse???
die portabelste Methode ist
select(0, NULL, NULL, NULL, &tv);
mit geeignet gewähltem tv. Siehe die Manpage select(2)
Gruß,
hjb
> Habt ihr ne Ahnung, wie ich den Computer für eine bestimmte Zeit warten lasse???
die portabelste Methode ist
select(0, NULL, NULL, NULL, &tv);
mit geeignet gewähltem tv. Siehe die Manpage select(2)
Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?
Re: Zeitschleife im Programm
Hi!
> Ich hab irendwo gelesen, das man mehrere .c dateien zu einer Datei Zusammen fassen kann. D.h, in der einen steht int main, in den anderen Dateinen stehen weitere Funktionen. Anscheinend kann man die mit "extern funktion" zusammen bringen. Irgendwelche Ideen???
Das ist C-Grundwissen und sollte in jedem Buch behandelt werden. Naja, ich erklär's mal kurz für GCC:
Ok, nehmen wir an, du hast 3 Dateien: main.c, foo.c und bar.c. main.c Verwendet Funktionen aus beiden, bar.c welche aus foo.c und foo.c keine anderen.
Damit alle zu einem Programm zusammengafügt werden, musst du sie einzeln compilieren (in Objekt-Dateien, jene die Endung .o haben) und diese dann zusammen linken. Die Kommandos wären dazu:
gcc -c main.c # Erzeugt main.o
gcc -c foo.c # Erzeugt foo.o
gcc -c bar.c # Erzeugt bar.o
gcc -o programm main.o foo.o bar.o
Damit automatisiert nur das compiliert wird, was auch geändert wurde, verwendet man normalerweise ein Makefile oder am besten gleich automake, aber für den Anfang sollte es ein Shellscript tun.
Wie macht man dem Code in den einzelnen Dateien nun aber die Funktionan aus den anderen Dateien bekannt? Natürlich mit Deklarationen (wozu noch kein "extern" nötig ist). Diese schreibt man nicht in jede einzelne Datei, sondern in Header-Dateien, jene mit #include eingebunden werden.
In foo.h stünden also die Deklarationen für Funktionen, die in foo.c definiert werden. In bar.c und main.c würden wir dann einfügen:
#include "foo.h"
Außerdem bräuchten wir in main.c auch ein #include "bar.h". Im Prinzip war es das schon, nur schützt man Header-Dateien noch gegen mehrfache Inkludierung, indem man sie so aufbaut:
----- schnipp! -----
#ifndef FOO_H
#define FOO_H
/* Rest der Datei. */
#endif
----- schnapp! -----
Viel Vergnügen.
Cheers,
GNU/Wolfgang
> Ich hab irendwo gelesen, das man mehrere .c dateien zu einer Datei Zusammen fassen kann. D.h, in der einen steht int main, in den anderen Dateinen stehen weitere Funktionen. Anscheinend kann man die mit "extern funktion" zusammen bringen. Irgendwelche Ideen???
Das ist C-Grundwissen und sollte in jedem Buch behandelt werden. Naja, ich erklär's mal kurz für GCC:
Ok, nehmen wir an, du hast 3 Dateien: main.c, foo.c und bar.c. main.c Verwendet Funktionen aus beiden, bar.c welche aus foo.c und foo.c keine anderen.
Damit alle zu einem Programm zusammengafügt werden, musst du sie einzeln compilieren (in Objekt-Dateien, jene die Endung .o haben) und diese dann zusammen linken. Die Kommandos wären dazu:
gcc -c main.c # Erzeugt main.o
gcc -c foo.c # Erzeugt foo.o
gcc -c bar.c # Erzeugt bar.o
gcc -o programm main.o foo.o bar.o
Damit automatisiert nur das compiliert wird, was auch geändert wurde, verwendet man normalerweise ein Makefile oder am besten gleich automake, aber für den Anfang sollte es ein Shellscript tun.
Wie macht man dem Code in den einzelnen Dateien nun aber die Funktionan aus den anderen Dateien bekannt? Natürlich mit Deklarationen (wozu noch kein "extern" nötig ist). Diese schreibt man nicht in jede einzelne Datei, sondern in Header-Dateien, jene mit #include eingebunden werden.
In foo.h stünden also die Deklarationen für Funktionen, die in foo.c definiert werden. In bar.c und main.c würden wir dann einfügen:
#include "foo.h"
Außerdem bräuchten wir in main.c auch ein #include "bar.h". Im Prinzip war es das schon, nur schützt man Header-Dateien noch gegen mehrfache Inkludierung, indem man sie so aufbaut:
----- schnipp! -----
#ifndef FOO_H
#define FOO_H
/* Rest der Datei. */
#endif
----- schnapp! -----
Viel Vergnügen.
Cheers,
GNU/Wolfgang
Re: Zeitschleife im Programm
#include <unistd.h>
unsigned int sleep(unsigned int sekunden);
void usleep(unsigned long usec);
int nanosleep(const struct timespec *req, struct timespec *rem);
- und die oben erwähnte select Methode
unsigned int sleep(unsigned int sekunden);
void usleep(unsigned long usec);
int nanosleep(const struct timespec *req, struct timespec *rem);
- und die oben erwähnte select Methode
Re: Zeitschleife im Programm
Vielen Dank leute,
hat mir echt weiter geholfen, mit ausnahme des select befehls.
cya Matong
hat mir echt weiter geholfen, mit ausnahme des select befehls.
cya Matong
Re: Zeitschleife im Programm
sleep oder nanosleep ist nicht das geeignete für so ein Game. Das macht man üblicherweise zeitgesteuert über einen Timer. Immer wenn der Timer einen "Timerkick" generiert wird dann das nächste Element gezeichnet. Über die Einstellung des Timers kann man dann die Geschwindigkeit selbst festlegen bzw. automatisch steigen lassen ("Schwierigkeitsgrad"). Je nachdem kann man das "Warten" auch über Threadsychronisierung ("Semaphoren, Mutexe") machen (natürlich nur wenn man das Programm auch Multithreaded auslegt)
Du meinst wohl die Sichtbarkeit? Für diesen zweck gibt es ja das bereits erwähnte Wort "extern" das eine Anweisung an den Übersetzer darstellt, dass die entsprechende Funktionen/Variable in einem anderen (Objekt)Module zu finden ist. Die enstprechende Funktion muss dann natürlich auch Global sichtbar sein, darf also nicht mit "static" deklariert sein. "static" beschränkt nämlich die Sichtbarkeit auf das entsprechende Module.
Wie es aber schon Wolfgang sagte, das steht in jedem C-Buch fast auf der ersten Seite <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">.
Du meinst wohl die Sichtbarkeit? Für diesen zweck gibt es ja das bereits erwähnte Wort "extern" das eine Anweisung an den Übersetzer darstellt, dass die entsprechende Funktionen/Variable in einem anderen (Objekt)Module zu finden ist. Die enstprechende Funktion muss dann natürlich auch Global sichtbar sein, darf also nicht mit "static" deklariert sein. "static" beschränkt nämlich die Sichtbarkeit auf das entsprechende Module.
Wie es aber schon Wolfgang sagte, das steht in jedem C-Buch fast auf der ersten Seite <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">.