Vorlesung Informatik I

Ähnliche Dokumente
Vorlesung Informatik I

Programmierung mit C Modularisierung von Programmen. Präprozessor-Anweisungen nutzen.

Vorlesung Informatik I

Proseminar. C-Programmierung Grundlagen und Konzepte. Der Präprozessor. von: Svenja Neef

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

FACHHOCHSCHULE MANNHEIM

Propädeutikum. Dipl.-Inf. Frank Güttler

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

8.1 Vom Quellcode zur ausführbaren Programm

C - PRÄPROZESSOR. Seminar effiziente C Programmierung WS 2012/13. Von Christian Peter

Compiler und Präprozessor (1) Erstellen eines Projektes

Propädeutikum Programmiersprache C und Mathematik 2014

C programmieren. Jürgen Wolf

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

C- Kurs 06 Übersetzung & Module

Die Programmiersprache C

Unterlagen. CPP-Uebungen-08/

Modulare Programmierung und Bibliotheken

C/C++ Programmierung

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

Grundlagen der Programmentwicklung

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Peter Prinz. Das Übungsbuch. CTestfragen und Aufgaben mit Lösungen

Der C-Präprozessor. Lukas Stabe

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

6. Grundlagen der Programmierung

Programmierung mit C Zeiger

Methoden. Gerd Bohlender. Einstieg in die Informatik mit Java, Vorlesung vom

Teil II. Literatur zur C-Programmierung:

Grundlagen der Informatik Vorlesungsskript

C-Propädeutikum Funktionen

Compiler Präprozessor Header Files

C für Java-Programmierer

Erste Schritte der Programmierung in C

Inhalt. 1 Einstieg in die Welt von C Erste Schritte in C 31. Vorwort... 15

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

Grundlagen der Informatik 12. Strukturen

C für Java- Programmierer

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Übungen zu Systemprogrammierung 1

Einführung Makros Includes Errors und Warnings Pragmas Diverses. Der C-Präprozessor. Lukas Stabe. Universität Hamburg

Funktionen. mehrfach benötigte Programmteile nur einmal zu schreiben und mehrfach aufzurufen

GI Vektoren

Übungen zu Systemprogrammierung 1 (SP1)

2. Programmierung in C

10 Die Programmiersprache C99: Zusammenfassung

Crashkurs C++ Wiederholung

Einstieg in die Informatik mit Java

2. Programmierung in C

Einführung in die Programmiersprache C

Systempraktikum im Wintersemester 2009/2010 (LMU): Vorlesung vom Foliensatz 2

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 WIng Bachelor 6. Aufgabenblatt Zeiger, verkettete Liste, Dateieingabe und -ausgabe

Compiler Präprozessor Header Files

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Martin Unold INFORMATIK. Geoinformatik und Vermessung

Die Programmiersprache C

Einführung in die C-Programmierung

Grundlagen. Kapitel 1

Übungspaket 14 Eindimensionale Arrays

ISO-SiMMlarcl. als erste Programmiersprache. Von Prof. Dr. Joachim Goll Uwe Grüner Prof. Herbert Wiese 2., durchgesehene Auflage

Globale Variablen Diverses. Globale Variablen. Globale Variablen

2. Programmierung in C

2. Programmierung in C

Vorlesung C-Kurs 9:15-10:45 Mathe 11:15-12:45 1. Woche Hörsaal 1 2. Woche Hörsaal 7

Einführung in die Programmiersprache C

Beispiel. Problem: mehrteilige Nachnamen (von Goethe, Mac Donald, Di Caprio)

Definition: Die Sprache C++ ist die Menge aller korrekter C++-Programme. Theoretischer Aspekt. // mile2km.cpp: Umwandlung von Meilen in Kilometer

Klassenvariablen, Klassenmethoden

Transkript:

Vorlesung Informatik I Universität Augsburg Wintersemester 2010/2011 Prof. Dr. Robert Lorenz Lehrprofessur für Informatik Programmieren in C Der Compilierungsprozess 1

Aufbau eines C-Programms 1. Direktiven für den Präprozessor 2. Globale Vereinbarunen a. Globale Variablen b. Funktions-Prototypen 3. main-funktion a. lokale Vereinbarungen b. Anweisungen 4. Funktions-Definitionen a. lokale Vereinbarungen b. Anweisungen 2

Aufbau eines C-Programms C-Programme sind Sammlungen von Funktionen Funktionen zerlegen Programme in kleinere, selbständige Einheiten erhöht Übersichtlichkeit und Wartbarkeit Alle benutzten Funktionen müssen zu Beginn deklariert werden 3

Aufteilung großer C-Programme Zur Modularisierung werden die Funktionen auf mehrere Quelldateien verteilt und getrennt übersetzt (genau einer der Dateien enthält die main-funktion) Jede solche Datei sollte eine sinnvoll zusammenhängende Gruppe von Vereinbarungen enthalten. Die Deklarationen der Funktionen, die in mehreren Quelldateien benötigt werden, werden in Header-Dateien zusammengefasst (werden mit #include eingebunden) Mehrfach benötigten Vereinbarungen werden nur in wenigen Dateien verwaltet 4

Compilierungsprozess - Überblick Quellcode Präprozessor (erweiterter Quellcode) Compiler Assemblercode Assembler Bibliotheken Linker Objektcode ausführbarer Code 5

Inhalt Präprozessor Compiler Assembler Linker Bibliotheksfunktionen Das Programm gcc Große Programme 6

Konstanten deklarieren Die Präprozessor-Direktive #define <Name> <Zeichenkette> veranlasst den Präprozessor, jedes Vorkommen von <Name> im folgenden Quellcode durch <Zeichenkette> zu ersetzen Ausnahme: Keine Ersetzung in Namen und Zeichenketten <Name> kann im Programm als Konstante benutzt werden, deren Wert durch <Zeichenkette> gegeben ist 7

Konstanten deklarieren Beispiele für sinnvolle eigene Deklarationen: #define PI 3.14 #define TRUE 1 #define FALSE 0 #define MAX_BUFFER 1000 Konvention: Der Name der Konstante besteht aus Großbuchstaben und wird an keiner anderen Stelle benutzt 8

Konstanten deklarieren Vordefinierte Beispiele aus Header-Dateien: Wertebereichgrenzen von Datentypen (in limits.h, float.h) LINE aktuelle Zeilennummer im Programmcode (num.) FILE Dateiname (Zeichenkette) DATE aktuelles Datum (Zeichenkette) TIME aktuelle Zeit (Zeichenkette) (u.v.m.) 9

Konstanten deklarieren Vorteile: Konstanten muss man bei Bedarf nur einmal ändern Programm ist besser lesbar Vergleich zu globalen konstanten Variablen: Keine zusätzliche Variable nötig Konfiguration mehrerer Programme durch Deklaration in Header- Datei möglich 10

Makros deklarieren Die Präprozessor-Direktive #define <Name>(<Parameternamen>) <Zeichenkette> veranlasst den Präprozessor zu folgendem: Ersetzt jedes Vorkommen von <Name>(<Argumente>) im Quellcode durch <Zeichenkette> Ersetzt jeden in <Zeichenkette> vorkommenden Namen aus <Parameternamen> durch zugehöriges Argument aus <Argumente> <Parameternamen>: Durch Komma getrennte Parameternamen <Argumente>: Durch Komma getrennte Ausdrücke <Name>(<Argumente>) kann im Programm als Aufruf einer Funktion, die durch <Zeichenkette> definiert ist, benutzt werden 11

Makros deklarieren Selbst definierte Beispiele: #define inhalt(r) PI*(r)*(r); Aufruf im Code: double inhalt = inhalt(10); #define max(a,b) ( ((a) > (b))? (a) : (b)) ); Aufruf im Code: scanf( %i,&x);int m=max(5*x,x*x); Vordefinierte Beispiele aus Headerdateien: Oft ist getchar ein Makro 12

Makros deklarieren Achtung: In <Zeichenkette> benutzte Operationszeichen können stärker binden als die Operatoren in einem für einen Parameternamen eingesetzten Ausdruck! Man muss dafür sorgen, dass der Ausdruck nach dem Einsetzen unbedingt zuerst ausgewertet wird Dazu unbedingt die in <Zeichenkette> vorkommenden Parameternamen klammern (Beispiel vorige Folie) 13

Makros deklarieren Vergleich zu Funktionen Parameter sind Datentyp-unabhängig: #define max(a,b) ( ((a) > (b))? (a) : (b)) ); Mögliche Aufrufe : int m = max(5,7); double m = max(5.0,7.5); 14

Makros deklarieren Vergleich zu Funktionen Es entsteht mehr Programmcode, da der Funktionsrumpf für alle Vorkommen des Funktionsnamens eingesetzt wird 15

Header-Dateien in den Code einfügen Die Anweisung #include <Header-Datei> veranlasst den Präprozessor, die angegebene Header-Datei in den Quellcode zu kopieren Es entsteht ein erweiterter Quellcode 16

Header-Dateien in den Code einfügen Eine Header-Datei ist eine Textdatei um Funktions-Prototypen zu deklarieren (kennen wir schon) Konstanten zu deklarieren (wie eben) Makros zu definieren (wie eben) Man kann (sollte) sich seine eigenen Header-Dateien schreiben Da die Header-Datei nur in den Quellcode kopiert wird, kann man doch alles auch gleich direkt in den Quellcode schreiben!? 17

Header-Dateien in den Code einfügen In einer Header-Dateien sammelt man Vereinbarungen und Funktionalitäten, die man immer wieder für einen bestimmten Anwendungsbereich braucht Ist beliebig oft in wiederverwendbar, ohne dass man alles in jedem Programm nochmal extra aufschreiben muss 18

Header-Dateien in den Code einfügen Beispiele: stdio.h (Standard Input Output): Unterstützung von Eingabe und Ausgabe math.h: Unterstützung mathematischer Funktionen und Konstanten string.h: Unterstützung bei der Verarbeitung von Zeichenketten 19

Header-Dateien selbst schreiben Textdatei mit Präprozessor-Direktiven schreiben Unter beliebigem Namen mit Endung.h abspeichern in: Programmverzeichnis include-verzeichnis des Compilers In Quellcode einbinden durch Anweisung: include-verzeichnis: #include <Headerdatei.h> (relative Pfadangaben erlaubt) Programmverzeichnis: #include Headerdatei.h (relative und absolute Pfadangaben erlaubt) 20

Header-Dateien selbst schreiben Achtung: Es sind verschachtelte include-anweisungen möglich Datei Header1.h enthält Direktive #include Header2.h Dadurch kann es durch mehrfaches Einbinden von Direktiven zu Syntaxfehlern kommen Programm enthält Direktiven #include Header1.h und #include Header2.h Lösung: Bedingte Aktivierung von Direktiven 21

Header-Dateien selbst schreiben Bedingte Aktivierung von Direktiven Headerdateien sollten immer die folgende Form haben: #ifndef DATEINAME_H_INCLUDED #define DATEINAME_H_INCLUDED <Deklarationen> #endif 22

Header-Dateien selbst schreiben Bedingte Aktivierung von Direktiven #define Fasst Deklarationen unter einem Namen zusammen Name = Dateiname in Großbuchstaben + _ #ifndef #ifdef...#endif Text einbinden, falls Name noch nicht exisitiert Text einbinden, falls Name schon exisitiert 23

Erstellen mehrteilger Programme 1. Zerlegung des Programms in funktionale allgemein wiederverwendbare Module 2. Für jedes Modul: Headerdatei erstellen Code-Datei erstellen mit eingebundenem Header 3. Programmdatei mit main-funktion erstellen 4. Übersetzungsprozess (später) 24

Erstellen mehrteilger Programme - Beispiel Datei format.h: #ifndef FORMAT_H_INCLUDED #define FORMAT_H_INCLUDED void vspace(int n); void hspace(int n); #endif Analog für Sammlungen mathematischer Funktionen (Fakultät) oder Eingabefunktionalitäten (Eingabestrom leeren, Eingaben vom Benutzer verarbeiten,...) 25

Erstellen mehrteilger Programme - Beispiel Datei format.c: #include format.h #include <stdio.h> void vspace(int n){ int i; for(i=1;i<=n;i++){printf("\n");} } void hspace(int n){ }... 26

Erstellen mehrteilger Programme - Beispiel Datei programm.c: #include format.h #include eingabe.h #include computations.h #include <stdio.h> int main(){... } 27

Compiler Zusammenfassung Überprüft den (erweiterten) Quellcode auf Syntaxfehler (lässt sich das Programm in Maschinensprache übersetzen?) Weist Variablen und Konstanten Speicherbereiche zu Übersetzt den Quellcode in Assemblercode (Assemblercode ist symbolischer=menschenlesbarer Maschinencode) 28

Assembler Überblick Übersetzt Assemblercode in Maschinencode Was jetzt noch fehlt? Zusammenführung von mehreren Quellcode-Dateien Integration von Bibliotheksfunktionen 29

Linker Überblick Bindet andere Dateien mit dem Hauptprogramm: Führt mehreren Quellcode-Dateien in einer Datei zusammen (man sagt, Quellcode-Dateien werden statisch (ein)gebunden) Fügt Informationen für den Zugriff auf Bibliotheksfunktionen ein (man sagt, Bibliotheksfunktionen werden dynamisch gebunden) 30

Linker Bibliotheksfunktionen werden in Header-Dateien also nur deklariert (aber nicht definiert) sind entweder vorübersetzte C-Programme oder direkt ausführbare Assembler-Programme werden mit dem Compiler installiert 31

Das Programm gcc Das Programm gcc umfasst die Ausführung von Preprozessor, Compiler, Assembler und Linker Mittels verschiedener Optionen (Kommandozeilenparameter) lassen sich diese Programme auch einzeln ausführen Mittels verschiedener Optionen lässt sich die Syntax-Kontrolle unterschiedlich detailliert ausführen 32

Das Programm gcc gcc Optionenen: Syntaxkontrolle -ansi weist den Compiler an, den C89-Standard zu verwenden. -pedantic bringt ihn weiterhin dazu, nichts außer dem C89-Standard z zuzulassen -W schaltet zusätzliche Warnungen an. -Wall schaltet alle zusätzlichen Warnungen an. -Wextra schaltet zusätzliche zusätzliche Warnungen an. -Wmain schaltet zusätzlich Warnungen über eine falsch definierte main()-funktion an. Man sollte ALLE Warnungen zum verstummen bringen, selbst wenn das Programm schon übersetzbar ist und läuft 33

Das Programm gcc gcc Optionenen: Teile ausführen -E Preprozessor wird ausgeführt (nicht Compiler, Assembler, Linker) Ausgabe in Datei <Programmname>.i -S Compiler wird ausgeführt (nicht Assembler, Linker) Ausgabe in Datei <Programmname>.S -c Compiler und Assembler werden ausgeführt (nicht Linker) Ausgabe in Datei <Programmname>.o 34

Das Programm gcc gcc Optionenen: weitere (Auswahl) -save-temps Zwischenergebnisse werden gespeichert --help Übersicht über Benutzung des Programms -o <name> Festlegung des Namens der Ausgabedatei -WI -stack <Bytes> Stackgröße erhöhen 35

Das Programm gcc Übersetzung mehrteilger Programme 1. Dateien ohne main-funktion übersetzen in Objektcode gcc -ansi -pedantic -W -Wall -Wextra -c modul1.c 2. Datei mit main-funktion übersetzen + mit Objetdateien linken gcc -ansi -pedantic -W -Wall -Wextra -Wmain modul1.o modul2.o programm.c -o Programm 36