4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Programmieren <strong>in</strong> C<br />
Getrennte Übersetzung<br />
Programmieren <strong>in</strong> C<br />
Getrennte Übersetzung<br />
Komplettes Makefile für schalter /1<br />
1,2 Def<strong>in</strong>ition Compiler und Optionen<br />
3,4 Def<strong>in</strong>ition Programme und Quellen<br />
7 all per Konvention erstes Ziel, soll<br />
“alles” machen<br />
9 Es wird die Datei make.depend<br />
e<strong>in</strong>gelesen und als Teil des Makefiles<br />
<strong>in</strong>terpretiert<br />
11-15 : Wie wird schalter erstellt<br />
17 Die Datei make.depend wird nicht<br />
selbst erstellt, der Gnu-C Compiler<br />
kann das auf Basis der Quellen<br />
machen. Das erste Mal e<strong>in</strong>e leere<br />
Datei erstellen ($ touch<br />
make.depend), damit es los geht.<br />
Ansonsten bei Strukturänderungen<br />
#<strong>in</strong>clude im Quellcode.<br />
1 CC=gcc<br />
2 CFLAGS= -Wall -g -ansi<br />
3 PROGS=schalter<br />
4 SRC=schalter.c reset.c wechsel.c \<br />
5 zustaende.c<br />
6<br />
7 all: $(PROGS)<br />
8<br />
10<br />
9 <strong>in</strong>clude make.depend<br />
11 schalter: schalter.o wechsel.o \<br />
12 reset.o zustaende.o<br />
13 $(CC) $(CFLAGS) schalter.o \<br />
14 wechsel.o reset.o zustaende.o \<br />
15 -o schalter<br />
16<br />
17 depend:<br />
18 $(CC) -MM $(SRC) > make.depend<br />
Komplettes Makefile für schalter /2<br />
Fortsetzung Makefile<br />
1,2 E<strong>in</strong> beliebtes Ziel ist test zur<br />
Test-Automatisierung, e<strong>in</strong> anderes<br />
übliches Ziel wäre run<br />
4 clean ist ke<strong>in</strong>e Datei und muss daher<br />
immer “erstellt” werden<br />
6 clean räumt Projekt auf. Alle<br />
generierten Dateien werden gelöscht.<br />
9 Endungen von zu verarbeitenden<br />
Dateien s<strong>in</strong>d .o, .c und .h<br />
11 Generische Regel: Um e<strong>in</strong>e .o Datei<br />
aus e<strong>in</strong>er .c Datei mit gleichem<br />
Namen zu machen . . .<br />
12 $< für erste Abhängigkeit (.c-Datei),<br />
$@ für Ziel (die .o-Datei)<br />
1 test: $(PROGS)<br />
2 ./schalter<br />
3<br />
4 .PHONY: clean<br />
5<br />
6 clean:<br />
7 -/b<strong>in</strong>/rm *.o $(PROGS)<br />
8<br />
10<br />
9 .SUFFIXES: .o .c .h<br />
11 %.o : %.c<br />
12 $(CC) -c $(CFLAGS) $< -o $@<br />
13 %.o : %.c %.h<br />
14 $(CC) -c $(CFLAGS) $< -o $@<br />
13 Wenn auch von .h Datei abhängig<br />
Weitere Abhängigkeiten nicht generisch,<br />
make.depend<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 61 / 326<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 62 / 326<br />
Programmieren <strong>in</strong> C Zeiger<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 63 / 326<br />
Programmieren <strong>in</strong> C Getrennte Übersetzung<br />
1<br />
Nutzen des Makefiles<br />
$ make -f clean<br />
/b<strong>in</strong>/rm *.o schalter<br />
$ make depend<br />
gcc -MM schalter.c reset.c wechsel.c zustaende.c > make.depend<br />
$ cat make.depend<br />
schalter.o: schalter.c reset.h zustaende.h wechsel.h<br />
reset.o: reset.c reset.h zustaende.h<br />
wechsel.o: wechsel.c wechsel.h zustaende.h<br />
zustaende.o: zustaende.c zustaende.h<br />
$ make<br />
gcc -c schalter.c -o schalter.o<br />
gcc -c wechsel.c -o wechsel.o<br />
gcc -c reset.c -o reset.o<br />
gcc -c zustaende.c -o zustaende.o<br />
gcc schalter.o wechsel.o \<br />
Zeiger<br />
Arbeitsspeicher<br />
• . . . ist <strong>in</strong> Speicherzellen e<strong>in</strong>geteilt<br />
• . . . ist Byte-weise adressierbar<br />
• . . . ist Wort-weise strukturiert<br />
• Adressraum meist 2 32 oder 2 64 Bytes<br />
Zeiger<br />
• Speicherzelle, die Adresse e<strong>in</strong>er<br />
anderen Speicherzelle be<strong>in</strong>haltet<br />
• Typisiert, Anfangsadresse e<strong>in</strong>es Werts<br />
Notation Zugriff<br />
• * ptr: Wert auf den der Zeiger ptr<br />
verweist, Inhaltsoperator *<br />
reset.o zustaende.o -o schalter<br />
• &val: Adresse von Wert val,<br />
$ make test<br />
Adressoperator &<br />
./schalter<br />
0<br />
0x0A0 42<br />
0x0A4<br />
*ptr<br />
0x100 0x0A0<br />
&val<br />
Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 64 / 326