Programmiersprachen Einführung in C

Ähnliche Dokumente
Propädeutikum. Dipl.-Inf. Frank Güttler

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

Dr. Monika Meiler. Inhalt

Deklarationen in C. Prof. Dr. Margarita Esponda

Moderne C-Programmierung

Inhaltsverzeichnis. Grundbegriffe der C-Programmierung Für den HI-TECH C-Compiler

Objektorientierung: Klassen und Objekte

Einführung in die C-Programmierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Objektbasierte Entwicklung

Die Programmiersprache C

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

C Grundlagen. Die Zunahme von integrierter Software innerhalb elektronischer Geräte bedingt enorme Entwicklungskosten.

Kurzeinführung in C. Johannes J. Schneider

5.4 Klassen und Objekte

Fakultät Angewandte Informatik Lehrprofessur für Informatik

Kurzeinführung in C++

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

Informatik. Studiengang Chemische Technologie. Michael Roth WS 2012/2013. Hochschule Darmstadt -Fachbereich Informatik-

Informatik: Abschnitt 4

Programmieren in C. Eigene Datentypen per typedef und Strukturen. Prof. Dr. Nikolaus Wulff

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Eine Einführung in C-Funktionen

2 Einfache Rechnungen

Dienstspezifikation nach RFC

Compiler und Präprozessor (1) Erstellen eines Projektes

Tutorium Rechnerorganisation

Programmieren in C. Die C-Standardbibliothek. Prof. Dr. Nikolaus Wulff

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Zusammenfassung des Handzettels für Programmieren in C

Informatik Repetitorium SS Volker Jaedicke

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

Programmieren in C. C Syntax Datentypen, Operatoren und Kontrollstrukturen. Prof. Dr. Nikolaus Wulff

Praktikum Betriebssysteme 1. Aufgabe (1)

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

L6. Operatoren und Ausdrücke

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Definition: Algorithmus

Algorithmische Kernsprache. Zuweisung, einfache und bedingte Anweisung, Blöcke, Schleifen, return, debugging.

Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny

Gliederung Programmiersprachen. Programmiersprachen Einführung in C. Kontrollstrukturen. Verzweigung mit IF. Beispiel: Zahlenklassifizieren

Programmierung in C. Grundlagen. Stefan Kallerhoff

Vorlesung Informatik II

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Computergrundlagen Programmieren in C

Prinzipieller Grundaufbau eines einfachen C-Programmes

Einführung in die Programmiersprache C

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Aufgaben zur C-Programmierung für die Praktikumsperiode des 1.Semesters

Modellierung und Programmierung

MIKROPROZESSOR PROGRAMMIERUNG 8. VORLESUNG. LV-Nr SS INSTITUT FÜR ELEKTRONIK BIT

C-Programming Hands-on

ATM18-Projekt Arbeiten mit CodeVisionAVR C-Compiler Teil 02 - Aufbau eines C-Projektes

FB Informatik. Fehler. Testplan

1 Polymorphie (Vielgestaltigkeit)

Ein erstes Java-Programm

Vorkurs C++ Programmierung

Grundlagen der Programmiersprache C für Studierende der Naturwissenschaften

1A05 64-bit Adressierung unter Alpha OpenVMS

1. Der Einstieg in Java. Was heißt Programmieren?

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Praktikum im Bereich Praktische Informatik Echtzeitgraphik in C++ und DirectX10. computer graphics & visualization

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

C Überlebenstraining

Embedded Software. Der C Präprozessor. Sichere objektbasierte Entwicklung dank C Präprozessor. Prof. Dr. Nikolaus Wulff

Modul 122 VBA Scribt.docx

Sebastian Houben Intensivkurs C++ 1. Intensivkurs C September 2015

Datentypen: Enum, Array, Struct, Union

Teil IV. Grundlagen der Programmierung

5.5.8 Öffentliche und private Eigenschaften

Übersicht. C Modularisierung. Präprozessor, Compiler, Linker. Präprozessor, Compiler, Linker. Präprozessor, Compiler und und Linker Linker

Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling

Einführung in die Programmierung Konstanten, dynamische Datenstrukturen. Arvid Terzibaschian

Objektorientiertes Programmieren für Ingenieure

C-Vorrangregeln. Version Web:

Grundlagen der Informatik - 6. Praktikum

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Hochschule Ravensburg-Weingarten Schriftliche Prüfung Programmieren Prof. Dr. M. Zeller

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung.

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Compiler: Vom Code zum Maschinen-Code. C Programmierung - Vorlesung 2 Hochschule Regensburg Universitätsstraße 31, Regensburg

Einführung in die Programmierung

Einführung in die Programmiersprache C und in den C166-Compiler

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Modulare Programmierung und Bibliotheken

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

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Reiner Schirm Peter Sprenger. Messen, Steuern und Regeln. mit. C-Control Pro. Praxisanwendungen, Schaltungstechnik und Programmierung

J.5 Die Java Virtual Machine

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

Von Java nach C++ Dr. Frank Weichert Lehrstuhl Informatik VII Technische Universität Dortmund

Datenbankanwendungsprogrammierung Crashkurs Java

Von Java nach C++ Frank Weichert, Heinrich Müller Informatik VII Universität Dortmund

Programmierkurs Java

Primitive Datentypen

Programmieren in C. Operatoren, Variablen und deren Sichtbarkeit. Prof. Dr. Nikolaus Wulff

Transkript:

Programmiersprachen Einführung in C 14 Vertiefung einiger Themen Prof. Dr. Gliederung Programmiersprachen 1. Von der Maschinensprache zu C 2. Die Struktur von C-Programmen 3. Variable und Datentypen in C 4. Bildschirm Ein-/Ausgabe 5. Kontrollstrukturen 6. Funktionen 7. Programmierstil, Programmierrichtlinien 8. Felder u. Zeichenketten 9. 10. Arbeiten mit Dateien 11. Strukturen, Aufzählungstypen 12. Zeiger 13. Speicherklassen 14. Vertiefung einiger Themen 15. Sicherheitsprobleme mit C 2 1

14 Vertiefung einzelner Themen dynamische Objekte/Speicheranforderung Bit-Manipulation Präprozessor Statische vs. dynamische Objekte Statische Objektdefinitionen char ch; unsigned char xx = 130; char *text = "Dies ist ein Text"; short sbuf[] = 1, 5, 10, 15; int j = 1; double *dp = &d; unsigned ui = 2000000; long list[10] = 1, -2, -5, 10, 15 ; int feld[10][20];... sind über Namen aufrufbar... kommen im Programmablauf nur einmal vor... Jede Instanz bzw. die Anzahl der Instanzen (bei Feldern) muß zur Compile-Zeit bekannt sein 4 2

malloc malloc - C-Form der Speicheranforderung void *malloc(size_t size); char *buf = malloc(1000); // 1000 Bytes werden angefordert typedef struct adresse char strasse[30]; int hausnr; tadresse; tadresse *myadr = malloc(sizeof(tadresse)); // besser: tadresse *myadr; myadr = (tadresse *) malloc(sizeof(tadresse)); // Es wird Speicher für ein Adreßobjekt angefordert Freigabe mit void free( void *memblock ); free(myadr); Benötigte Header-Dateien: #include <stdlib.h> #include <malloc.h> 5 Verwaltung dynamischer Objekte durch eine lineare Liste #define new(t) (t *) malloc(sizeof(t)) typedef struct Adr // Definition der Adreßstruktur char Name[30], Tel[20]; struct Adr *next; tadr; tadr *Anf; // Aufbauen einer linearen Liste: tadr *Laufz, *aktuell; Anf = new(tadr); // Erzeugen eines ersten Objekts strcpy(anf->name, "Schwenk" ); aktuell = new(tadr);// Erzeugen des zweiten Objekts strcpy(aktuell->name, "Meier"); aktuell->next = NULL; Anf->next = aktuell;// Verbinden von 1. und 2. Element aktuell = new(tadr);// Erzeugen des 3. usw. Objekts aktuell->next = NULL; Laufz = Anf; // Suche nach dem letzten Element while (Laufz->next)// Solange es weitere Elemente gibt: Laufz = Laufz->next; // Geh' zum nächsten Element // Sonst: Letztes Element gefunden: Laufz->next = aktuell;// dieses mit dem aktuellen // Element verbinden 47 44 1 7489 7489 7489123245678 6 3

Löschen eines Objekts der linearen Liste Aufgabe: Löschen eines Elements (Name ist angegeben) aus der linearen Liste. Der Parameter 'Anf' zeigt auf den Anfang der Liste tadr *lösche(char *ElemName, tadr *Anf) tadr *Laufz = Anf; tadr *tmp; if (strcmp(anf->name, ElemName) == 0) Anf = Anf->next; // Ist das erste Element das gesuchte? free(laufz); return Anf; while (Laufz->next && // Nach benanntem Element suchen! strcmp(laufz->next->name, ElemName)!= 0) Laufz = Laufz->next;// Wichtig! Laufz muß eins vor dem 7 47 888 7489 7489 if (Laufz->next) // gesuchten Element stehen bleiben! tmp = Laufz->next; Laufz->next = Laufz->next->next; // Element ausklinken free(tmp); return Anf; 1 748974 7 Bit-Operationen Boolesche Operationen auf der internen Bit-Repräsentation von Operanden Operationen auf den Bits eines Operanden Operationen zwischen Bits zweier Operanden Ausdruck Wert / Wirkung 1 x << y schiebe Inhalt von x um y Stellen links 1 x >> y schiebe Inhalt von x um y Stellen rechts 1 x & y bit-weise UND-Verknüpfung der Bits aus x und y 1 x y bit-weise ODER-Verknüpfung der Bits aus x und y 1 x ^ y bit-weises EXKLUSIV-ODER zwischen x u. y 1 x bit-weise Komplementbildung, Einerkompl. von x Vergleichs-Operatoren ==!= vor Bit-Operatoren Klammerung 8 4

Anwendung von Bit-Operationen Kodierung von mehreren Zuständen (Flags), die unabhängig vonein-ander auftreten können, in einer Variablen (Beispiel: Maustasten) const int LMButtonBitMap = 1; // Wichtig: Kodierung durch 2er Potenzen const int RMButtonBitMap = 2; const int... = 4; int MButton = 0; void OnLButtonDown() // Routine wird bei Drücken der linken Maustaste // aufgerufen, rechte Taste entsprechend... MButton = LMButtonBitMap; void OnLButtonUp() // Routine wird bei Loslassen der linken Maustaste // aufgerufen MButton &= ~LMButtonBitMap; int LButtonDown() // Test, ob die linke Maustaste gedrückt wurde return MButton & LMButtonBitMap; 9 Bit- Beispiel: Client-/Server Schnittstelle 1 #define POSITION (1<<0) 1 #define ENDPOSITION (1<<1) 1 #define ROTATE_FAIL (1<<2) 1 #define MOVE_FAIL (1<<3) 1 #define ALIGN_FAIL (1<<4) 1 #define EMERGENCY_STOP (1<<5) 1 #define OBSTACLE_DISTANCE (1<<6) 1 #define OBSTACLE_POS (1<<7) 1 #define SONAR_READINGS (1<<8) 1 #define JOY_STATUS (1<<9) 1 #define EOC (1<<10) 1 #define Z_POSITION (1<<11) 1 #define Z_END_POSITION (1<<12) 1 #define Z_FORCE (1<<13) 1 #define Z_EOC (1<<14) 1 #define Z_COLLISION (1<<15) 1 CSetEvents(GlPlanClient, RobServer, POSITION ENDPOSITION SONAR_READINGS EOC); 10 5

Beispiel: Auswahl beim Verteilen von Informationen an mehrere Empfänger /* CSendEvent dient dazu, von einem Server aus an alle interessierten Clients Nachrichten (Events) zu versenden. Hierzu wird abgefragt, ob in der jeweiligen EventRequests-Bitmaske das für diesen Event relevante Bit gesetzt ist */ void CSendEvent(EventType *Event) int Client; for (Client=FIRST_CLIENT; Client<LAST_CLIENT; Client++) if (EventRequests[Client] & Event->Type) // Event über Sockets versenden 11 Präprozessor: #include und #define Prä - vor ; Prozessor - Verarbeitungsphase 1 Bearbeitung des Quelltextes vor der eigentlichen Übersetzung und Codeerzeugung 1 Präprozessoranweisungen beginnen mit '#' und gelten ab dieser Zeile #include <datei.h>einbinden von datei.h aus dem include - Verzeichnis #include datei.h Einbinden von datei.h aus dem aktuellen Verzeichnis #define konstnam wert 1 Konstantendefinition: #define MAXWERT 100 1 Achtung! Kein abschließendes Semikolon! 'Wert' von MAXWERT ist der Rest der aktuellen Zeile; ein Semikolon würde daher mit zum Wert dazugehören 1 Achtung! Nur textuelle Definition der Konstante; Hier erfolgt weder Syntax- noch Typprüfung. Hier gemachte Fehler werden erst später an den verwendeten Stellen erkannt Verwendung: if (ergebnis < MAXWERT) wird ersetzt zu... if (ergebnis < 100) (nur textuelle Ersetzung) Durch Typisierung u. Syntaxprüfung in unbedingt const bevorzugen! 12 6

Parametrisierte #define-makros #define-makros können auch parametrisiert werden 1 #define max(a,b) (((a)<(b))? (b) : (a)) // a und b sind textuell verwendete Parameter Starke Klammerung sehr empfehlenswert, z.t. unbedingt notwendig! 1 #define sq(a) a*a // sq soll das Quadrat einer übergebenen Zahl bestimmen 1 #define incr(x) x+1 // incr soll die um 1 erhöhte Zahl liefern 1 : 1 x = sq(d); // noch problemlos 1 x = sq(d+1); 1 // textuelle Ersetzung: x = d+1 * d+1; 1 x = incr(d); // wieder problemlos 1 x = incr(d) * 2; 1 // textuelle Ersetzung: x = d+1 * 2; Richtig wäre: 1 #define sq(a) ((a)*(a)) 1 #define incr(a) ((a) + 1) Makros werden in C gern eingesetzt, um damit kleine Funktionen wie max zu erzeugen, ohne jedoch den Overhead zu haben, der mit jedem Funktionsaufruf einhergeht; in C++ besser: inline-funktionen 13 Bedingte Compilierung: #if, #elif, #else, #endif Anwendung: Bedingtes Setzen von Konstanten #define TEST 12 #if TEST == 10 #define MAXWERT 99 #elif TEST == 12 #define MAXWERT 101 #else #define MAXWERT 50 #endif Anwendung: Bedingtes Compilieren #if TEST == 10 printf("wert von 'ergebnis': %e\n", ergebnis); #else printf("wert von 'ergebnis': %e\n", ergebnis); printf("wert von 'zaehler': %d\n", zaehler); #endif Auswirkung 1 if (ergebnis < MAXWERT) --> (textuelle Ersetzung!) --> if (ergebnis < 101) 14 7

Bedingte Compilierung: Definition überprüfen mit #ifdef, #ifndef Anwendungsfall: Bedingte Compilierung mit nur zwei Alternativen #define DEMO... : void main() #ifdef DEMO #define VERSION 0.9 printf("progr. superduper, #else Vers.%d\n", #define VERSION 1.0 VERSION); #endif Anwendung: Einfügen von Codestücken für 'besondere' Fälle #if DEBUG printf("wert von 'ergebnis': %e\n", ergebnis); #endif // Print-Anweisung wird (nur) im 'DEBUG'-Modus eingefügt! #pragma - Compilerdirektiven, -Einstellungen 1 nicht festgelegt, compilerabhängig >>> Compiler - Handbücher #error Fehlertext 1 Ausgabe des Fehlertexts (während des Präprozessorlaufs!) und Abbruch des Compiliervorgangs (z.b. als Hinweis auf nicht mehr unterstützte Programmversionen) 15 8