Zeitschleife im Programm

Post Reply
Message
Author
Matong

Zeitschleife im Programm

#1 Post by Matong »

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

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Zeitschleife im Programm

#2 Post by hjb »

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
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Zeitschleife im Programm

#3 Post by bakunin »

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

Niki Hammler

Re: Zeitschleife im Programm

#4 Post by Niki Hammler »

#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

Matong

Re: Zeitschleife im Programm

#5 Post by Matong »

Vielen Dank leute,
hat mir echt weiter geholfen, mit ausnahme des select befehls.

cya Matong

arni

Re: Zeitschleife im Programm

#6 Post by arni »

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">.

Post Reply