43
embedded C und C++ S. Arlt/K. Pahnke Fakult¨ at EI Fachbereich Elektronische Schaltungen und Systeme emsys GmbH Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 1

embedded C und C++ · Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 9 1. Entstehung von C † Bell-LABs Entwicklung der Sprache B aus BCPL † 1972: Kernighan/Ritchie Sprache C 2. Eigenschaften

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • embedded C und C++

    S. Arlt/K. Pahnke

    Fakultät EI

    Fachbereich Elektronische Schaltungen und Systeme

    emsys GmbH

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 1

    1

  • '

    &

    $

    %

    '

    &

    $

    %

    Inhalt I

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 2

    Teil I Programmiersprache C

    1. Grundlagen

    • Einführung• Syntax• Programmstruktur• Konstanten, Variablen (Basistypen, abgeleitet)• Operatoren• Ablaufsteuerung• Arbeit mit Zeigern

    2. Funktionen der ANSI-C Library

    • Ein–/Ausgabe, Filearbeit• String–Funktionen• Arbeit mit dem Freispeicher

    3. Werkzeuge

    • make• ctags, etags• compiler, linker, assembler

    2

  • '

    &

    $

    %

    '

    &

    $

    %

    Inhalt II

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 3

    Teil II Praktische Algorithmen in C

    1. Einführung

    2. Elementare Datenstrukturen

    • verkettete Listen (einfach / doppelt)• Stapel (Stack)• Schlangen (Queue)• dynamische Felder (Arrays)

    3. Bäume

    • binäre Bäume• allgemeine Bäume• ausgeglichene Bäume• Traversierung mittels Rekursion

    4. Suchalgorithmen und gestreute Speicherung

    • elementare Suchverfahren (Binärsuche)• Hashing• assoziative Speicherung (Dictionaries)

    3

  • '

    &

    $

    %

    '

    &

    $

    %

    Inhalt III

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 4

    Teil III Object Oriented Programming

    1. C++ Basics

    • Data Abstraction• Inheritance

    2. Object Oriented Programming for Embedded Systems

    • C++ as better C• Embedded C++• Embedded C++ Library

    4

  • '

    &

    $

    %

    '

    &

    $

    %

    Inhalt IV

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 5

    Teil IV Accessing and Modelling Hardware in C/C++

    1. C++ Basics

    • Basics of Hardware Manipulation using C/C++• Common Techniques for Controlling Devices written in ANSI-C/C++• Portability• Blinking LED in C• Blinking LED in C++

    2. Programming EVA Board LPCEB2000

    • Hardware• Software• Program Samples

    5

  • '

    &

    $

    %

    '

    &

    $

    %

    Inhalt V

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 6

    Teil V Embedded OS

    1. Basic Concepts of Embedded (RT)OS

    • Tasks as basic blocks• Task synchronisation (Mutex/Semaphore)• Task communication (Message Queue)

    6

  • '

    &

    $

    %

    '

    &

    $

    %

    Literatur

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 7

    Einsteiger:

    Lowes/Paulik”Programmieren mit C“, Teubner Stuttgart, 1992

    Kernighan, B.; Ritchie, D.”The C Programming Language“

    Wollenstein; Florian”C++ Programmierung für Anfänger“, Books on Demand GmbH

    2004

    Fortgeschrittene:

    Clauß/Fischer”Programmieren mit C“ Reihe Technische Informatik, Verlag Technik GmbH

    Berlin 1988

    Stroustrup; Bjarne”Die C++ Programmiersprache“, Addison-Wesley

    Barr; Michael”Programming Embedded Systems“, O‘Reiley 1999

    7

  • '

    &

    $

    %

    '

    &

    $

    %

    Einführung I

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 8

    “I think there is a world market for maybe five computers”

    Thomas Watson, Chairman of IBM, 1943

    “There is no reason anyone would want a computer in their home”

    Ken Olsen, President of Digital Equipment Corporation, 1977

    Begriff:

    Bei Embedded Systems handelt es sich um einen oder mehrere durch Software kontrollier-

    te(n) Computer oder Mikrocontroller, die Teil eines größeren Systems sind und deren primäre

    Funktionen, meist steuerungstechnischer Art, für definierte Aufgaben fixiert sind. Anwen-

    dungen finden sich z.B. im Automobilbau (Motorsteuerung, Navigation, ABS, Bedienung),

    im Haushalt (Waschmaschine, Heizung, Mikrowelle, Hausbus, ...) und in peripheren einheiten

    der Computer (Festplatte, Netzwerkkarte, CD, ...)

    8

  • '

    &

    $

    %

    '

    &

    $

    %

    Einführung II

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 9

    1. Entstehung von C

    • Bell-LABs Entwicklung der Sprache B aus BCPL• 1972: Kernighan/Ritchie Sprache C

    2. Eigenschaften

    • Hochsprache, für maschinennahe Arbeit geeignet• leistungsfähig und effizient• kurz, für ,,schreibfaule” Programmierer• keine E/A-Konstrukte und dadurch portabel

    3. Verbreitung

    • Betriebssystem UNIX in C geschrieben• neben COBOL und FORTRAN ein Industriestandard

    4. Weiterentwicklung

    • ANSI–Standard• Objektorientierte Programmierung C++

    9

  • '

    &

    $

    %

    '

    &

    $

    %

    Programmstruktur

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 10

    C–Programm := Menge von Funktionen

    Die verschiedenen Funktionen können auf mehrere Dateien verteilt sein. Funk-

    tionen dürfen nicht verschachtelt sein (vgl. PASCAL).

    Die Abarbeitung eines Programms beginnt in der Funktion main().

    int main(void) /* Ausgabe: Mein erstes C-Programm */

    {printf(’’Mein erstes C-Programm \n ’’);return 0;

    }

    int main(void) /* Ausgabe: Mein erstes C-Programm */

    {printf(’’Mein erstes’’);

    printf(’’C-Programm\n ’’);return 0;

    }

    10

  • '

    &

    $

    %

    '

    &

    $

    %

    Aufbau einer Funktion

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 11

    • Funktionsnamemuß mit Buchstaben oder beginnen

    • Parameterlistein runde Klammern eingeschlossen, kann leer sein

    • Anweisungsblockin geschweifte Klammern eingeschlossen, kann leer sein

    Beispiel des einfachsten Programms:

    main() { }

    Beispiel einer Funktion:

    int max(int a, int b) /* Kopf mit formalen Parametern */

    { /* Anweisungsblock */if( a > b )

    return a;

    else

    return b;

    }

    11

  • '

    &

    $

    %

    '

    &

    $

    %

    Schlüsselworte in C

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 12

    auto default for short union

    assert do goto signed unsigned

    break double if sizeof void

    case enum int static volatile

    char extern long struct while

    const else register switch

    continue float return typedef

    Trennzeichen:

    • Leerzeichen

    • Tabulator

    • Newline

    • Kommentar /* Text... */

    Es sind keine geschachtelten Kommentare zugelassen !

    12

  • '

    &

    $

    %

    '

    &

    $

    %

    Grunddatentypen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 13

    Speicherplatzbedarf:

    Typ 16 Bit 32 Bit Wertevorrat Beispiel

    char 8 8 −27...27 − 1 char c, *cptr;int 16 32 min.−215...215 − 1 int i, *iptr;short 16 16 −215...215 − 1 short s, *sptr;long 32 32 −231...231 − 1 long l, *lptr;unsigned 16 32 min.0...216 − 1 unsigned u, *uptr;float 32 32 float f, *fptr;

    double 64 64 double d, *dptr;

    Achtung:

    unsigned steht für unsigned int,

    und ist weiterhin kombinierbar mit

    unsigned short

    unsigned long

    unsigned char

    long double (nur ANSI–C–Compiler)

    13

  • '

    &

    $

    %

    '

    &

    $

    %

    Konstanten

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 14

    1. Integer

    • dezimal123,

    123L, 123456 /* long */

    • hexadezimal0x0f3,

    0xffe3f /* long */,

    • oktal017,

    017L /* long */

    2. Real

    12., 1E+12, 1.0E+12, 0.23, .23

    Achtung:

    alle Real-Konstanten sind grundsätzlich vom Typ double.

    14

  • '

    &

    $

    %

    '

    &

    $

    %

    Zeichenkonstanten

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 15

    Eine Zeichenkonstante wird in Apostrophe eingeschlossen.

    Ihr Wert entspricht dem verwendeten Zeichensatz (z.Bsp. ASCII).

    Buchstaben und Zeichen:

    ’A’ /* Buchstabe A, Wert=65 */

    ’0’ /* Ziffer 0, Wert=48 */

    ’@’ /* Zeichen @, Wert=64 */

    Ersatzdarstellungen nicht darstellbarer Zeichen:

    ’\a’ /* bell */’\n’ /* Newline */’\r’ /* Carrige return */’\t’ /* Tabulator */’\b’ /* Backspace */’\v’ /* Vertikaltabulator */’\\’ /* Backslash */’\0’ /* (ASCII)0 */’\377’ /* Bitmuster oktal */

    15

  • '

    &

    $

    %

    '

    &

    $

    %

    Zeichenkettenkonstanten

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 16

    Zeichenketten werden in Quoten (” ”) eingeschlossen.

    Beispiel:

    ”Mein erstes C–Programm”

    Jede Zeichenkette ist durch eine (ASCII)Null abgeschlossen, die bei der Re-

    präsentation berücksichtigt werden muß!

    Somit ist die Zeichenkettenkonstante:

    ”Datum”

    identisch zu

    ’D’ ’a’ ’t’ ’u’ ’m’ ’\0’

    16

  • '

    &

    $

    %

    '

    &

    $

    %

    Variablen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 17

    Variablen sind durch Typ und Speicherklasse beschriebene Bezeichner.

    (Zeichenvorrat: [ A-Za-z][ A-Za-z0-9]*)

    Je Compiler sind 8 bis 32 Zeichen relevant.

    • Variablentyp:Basistyp oder abgeleiteter Typ

    • Speicherklasse:auto

    static

    extern

    register

    Hinweis:

    Deklaration

    Ein Bezeichner wird mit einem Typ versehen (bekannt gemacht), aber nicht

    physisch angelegt.

    Definition

    Wie Deklaration und zusätzlich reservieren von Speicherplatz.

    17

  • '

    &

    $

    %

    '

    &

    $

    %

    Typkonvertierungen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 18

    char

    short

    doublefloat

    int

    long

    unsigned long

    unsigned int

    unsigned char

    unsigned short

    18

  • '

    &

    $

    %

    '

    &

    $

    %

    Operatoren

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 19

    1. Deklarationsoperatoren

    * Zeiger

    [ ] Vektor

    ( ) Funktion

    2. unäre Operatoren

    + Vorzeichen (nur Exponent)

    – Vorzeichen

    * Zeigeroperator (dereferenziert Zeiger)

    & Adreßoperator (liefert Adresse einer Instanz)

    ++ Inkrement–Operator

    – – Dekrement–Operator

    sizeof Größe eines Objektes/Typs in Byte ermitteln

    19

  • '

    &

    $

    %

    '

    &

    $

    %

    Operatoren

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 20

    3. binäre Operatoren

    • arithmetisch

    % Modulo, Rest der ganzzahligen Division

    * Multiplikation (Integer und Real)

    / Division (Integer und Real)

    + Addition

    – Subtraktion

    • Vergleichsoperatoren

    >, >= größer, größer gleich

  • '

    &

    $

    %

    '

    &

    $

    %

    Operatoren

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 21

    • bitorienterte Operatoren

    & UND (z.Bsp Maskieren von Bits)

    | ODER (z.Bsp Setzen von Bits)ˆ Exklusiv-ODER

    > Bit-shift rechts

    ˜ Einerkomplement (unär)

    • logische Operatoren

    && logisches UND

    | | logisches ODER! logische Negation (unär)

    21

  • '

    &

    $

    %

    '

    &

    $

    %

    Entscheidungsoperator

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 22

    Sollte bei der Ermittlung eines Wertes nach einer Entscheidung verwendet

    werden.

    Syntax:

    ausdruck1 ? ausdruck2 : ausdruck3

    Der Wert des Gesamtausdrucks ist vom Wahrheitswert des

    ausdruck1 abhängig.

    Beispiel:

    if( a > b )

    max = a;

    else

    max = b;

    kann verkürzt werden zu

    max = a > b ? a : b;

    auch als Return-Wert verwendbar

    int abs(int x) /* Absolutwert */

    {return ( x > 0 ? x : -x);

    }

    22

  • '

    &

    $

    %

    '

    &

    $

    %

    spezielle Operatoren

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 23

    Komma-Operator

    Syntax: ausdruck1 , ausdruck2

    • Auswertung von links nach rechts

    • Typ und Wert werden durch rechten Ausdruck bestimmt

    x = 1, y += x /* Wert des Ausdrucks ist y */

    Inkremet-Operator

    int x = 0, y;

    y = x++; /* y = x; x = x + 1; */

    y = ++x; /* x = x + 1; y = x; */

    Dekremet-Operator

    int x = 0, y;

    y = x--; /* y = x; x = x - 1; */

    y = --x; /* x = x - 1; y = x; */

    23

  • '

    &

    $

    %

    '

    &

    $

    %

    Vorrang und Assoziativität

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 24

    Es ist vom konkreten Compiler abhängig, in welcher Reihenfolge die Auswer-

    tung von gleichberechtigten Operanden erfolgt:

    x = f(y++) + g(y);

    () ] -> . L

    ! ++ -- * & - sizeof(typcast) R

    * / % L

    + - L

    > L

    < >= L

    == != L

    & L

    ^ L

    | L&& L

    || L? : R

    = op= R

    , L

    24

  • '

    &

    $

    %

    '

    &

    $

    %

    Ablaufsteuerung

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 25

    Block := Folge von Anweisungen

    • Vereinbarungen nur am Blockanfang

    • nach schließender Klammer kein Semikolon

    • Block wird als eine Anweisung betrachtet

    • anstelle einer Anweisung kann also ein Block stehen

    • Schachteln von Blöcken ist möglich

    int main(void) /* Ablauf ohne Verzweigung */

    {int i; /* Definition der Variablen i */

    char c;

    ...

    i = 0; /* Anweisung */

    ...

    return 0;

    }

    25

  • '

    &

    $

    %

    '

    &

    $

    %

    Entscheidung

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 26

    26

  • '

    &

    $

    %

    '

    &

    $

    %

    switch–Anweisung

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 27

    27

  • '

    &

    $

    %

    '

    &

    $

    %

    Schleifen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 28

    28

  • '

    &

    $

    %

    '

    &

    $

    %

    for–Anweisung

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 29

    29

  • '

    &

    $

    %

    '

    &

    $

    %

    unbedingte Sprünge

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 30

    1. goto

    • Vereinbarung einer (Ziel-)Marke notwendig• Sprünge nur innerhalb einer Funktion möglich• sinnvoll zum schnellen Verlassen mehrfach geschachtelter Schleifen

    Beispiel:

    marke: /* Endlosschleife */

    goto marke;

    2. return

    • zurück an übergeordnetes Programm• Wertübergabe ist möglich (Ausnahme void)• zum vorzeitigen Verlassen von ,,main” ist der

    Exit-Handler mit

    exit(parameter);

    zu rufen

    30

  • '

    &

    $

    %

    '

    &

    $

    %

    Zeiger

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 31

    • uneingeschränkte Verwendung möglich

    • Zeigerkonzept besonders gut unterstützt

    • zwei sinnvolle Werte für Zeiger:

    – (Hauptspeicher-)Adresse eines Objekts vom gleichen Typ

    – NULL

    • Operatoren:

    – & lvalue Zeiger auf Objekt, “Adresse von ...”

    – * zeiger indirekter Zugriff, “Inhalt von ...”

    31

  • '

    &

    $

    %

    '

    &

    $

    %

    Zeiger-Arithmetik

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 32

    Folgende Operationen sind zugelassen:

    Zeiger + Integer Ergebnis Zeiger

    Zeiger − Integer Ergebnis ZeigerZeiger − Zeiger Ergebnis Integer

    Vergleich

    Zeiger mit NULL

    Achtung:

    Die Integerwerte sind als Feld-Indizees zu interpretieren !

    32

  • '

    &

    $

    %

    '

    &

    $

    %

    Standard-Bibliothek

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 33

    Leistungen:

    • Ein/Ausgabe zeilen– und zeichenweise

    • formatgesteuerte Ein/Ausgabe

    • Dateizugriff

    • dynamische Speicherverwaltung

    • Stringmanipulationen

    • Klassifizierung von Zeichen (upper, lower, ...)

    33

  • '

    &

    $

    %

    '

    &

    $

    %

    Formatgesteuerte Ausgabe

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 34

    int printf(char *format, ...);

    Ausgabe auf stdout

    int sprintf(char *buf, char *format, ...);

    Ausgabe in Hauptspeicher

    int fprintf(FILE *fp, char *format, ...);

    Ausgabe auf Datei oder stderr

    Formatstring:

    1. darstellbare, nicht zu interpretierende Zeichen werden kopiert

    2. nicht darstellbare Zeichen lösen Steuervorgänge aus

    3. interpretierbare Zeichen repräsentieren Konvertierungen

    Aufbau:

    % [flags] [ [0] Feldbreite ] [.[Genauigkeit] ] [ l ]konv.Zeichen

    34

  • '

    &

    $

    %

    '

    &

    $

    %

    Dateifunktionen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 35

    1. Datei eröffnen

    FILE *fopen(char *filename, char *mode);

    mode Zugriffsrechte existiert existiert nicht

    ”r” read ok Fehler

    ”w” write löschen Eröffnen

    ”a” append ok Eröffnen

    ”r+” read + write ok Fehler

    ”w+” write + read löschen Eröffnen

    Achtung:

    Unter MS–Win werden CR-LF in Texten als Newline verwendet. Die Defaultein-

    stellung eröffnet eine Datei im Textmodus, was zu einer Konvertierung dieser

    Zeichenkombination führt.

    Binärmodus:

    ”rb”,”r+b”,”wb”,”w+”,”ab”

    35

  • '

    &

    $

    %

    '

    &

    $

    %

    Dateifunktionen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 36

    2. Datei schließen

    int fclose(FILE *fp);

    leeren des Dateipuffers und schließen der Datei.

    int fcloseall();

    schließen aller Dateien.

    3. Dateipuffer leeren

    int fflush(FILE *fp);

    Ausgabe aller gepufferten Daten erzwingen.

    4. Positionieren in Datei

    long ftell(FILE *fp);

    Liefert Offset von Dateianfang in Byte

    int fseek(FILE *fp, long offset, int mode);

    Setzen des Dateizeigers auf bestimmte Position

    SEEK SET zum Dateianfang

    SEEK CUR zur aktuellen Position

    SEEK END zum Dateiende

    36

  • '

    &

    $

    %

    '

    &

    $

    %

    Stringfunktionen (Auswahl)

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 37

    int strlen(char *s);

    ermittelt die Länge der Zeichenkette in Byte (ohne ′\0′ )

    int strcmp(char *s1, char *s2);

    vergleicht zwei Zeichenketten lexikographisch.

    int strncmp(char *s1, char *s2, int n);

    vergleicht ’n’ Zeichen zweier Zeichenketten lexikographisch.

    char *strcat(char *s1, char *s2);

    hängt Zeichenkette s2 an s1 an (Achtung: Speicherplatz !)

    char *strncat(char *s1, char *s2, int n);

    hängt ’n’ Zeichen von s2 an s1 an

    char *strcpy(char *s1, char *s2);

    kopieren von s2 auf s1 an (Achtung: Speicherplatz !)

    char *strncpy(char *s1, char *s2, int n);

    ’n’ Zeichen von s2 auf s1 kopieren

    char *strchr(char *s, char c);

    Suche des Zeichens ’c’ in ’s’ (von vorn)

    37

  • '

    &

    $

    %

    '

    &

    $

    %

    Memoryfunktionen

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 38

    char *memcpy(char *dest, char *source, int anz bytes);

    Kopieren von Speicherbereichen (Vorsicht bei Überlappung)

    char *memccpy(char *dest, char *source, int c, int anz bytes);

    Kopiert bis einschließlich ’c’ (Adresse zurück)

    char *memchr(char *buf, int c, int anz bytes);

    Suche von ’c’ (Adresse zurück)

    char *memset(char *buf, int c, int anz bytes);

    Initialisieren mit ’c’

    int memcmp(char *s1, char *s2, int anz bytes);

    Vergleich zweier Speicherbereiche

    Die Benutzung dieser Funktionen ergibt sehr schnelle Programme.

    38

  • '

    &

    $

    %

    '

    &

    $

    %

    Speicherverwaltung

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 39

    1. Speicher anfordern

    char *malloc(int anz bytes);

    allocieren von anz Bytes

    char *calloc(int block anz, int size);

    allocieren von block anz Blöcken der Größe size

    2. Speicher verändern

    char *realloc(char *oldbuf, int anz bytes);

    Grösse von oldbuf auf anz Bytes verändern

    3. Speicher freigeben

    void free(char *buf);

    Rückgabe des angeforderten Speichers

    Hinweise:

    • immer den Rückgabewert mit NULL vergleichen

    • nur abgeforderten Speicher wieder freigeben (sonst Beule ! )

    • nicht kleckern, sondern klotzen !

    39

  • '

    &

    $

    %

    '

    &

    $

    %

    Preprozessor

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 40

    • wird vor jedem Compilerlauf gestartet

    • verarbeitet Zeilen mit ’#’ an erster Position

    Befehle

    #include < datei >

    #define Makroname

    #undef Makroname

    Bedingte Compilierungg

    #ifdef Makroname

    #ifndef Makroname

    #else

    #endif

    Weitere Preprozessor-Befehle:

    #line Konstante ”dateiname”

    40

  • '

    &

    $

    %

    '

    &

    $

    %

    ANSI–C Preprozessor

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 41

    Erweiterung der bedingten Compilierung:

    #if defined (Makroname)

    #elif defined (Makroname)

    #else

    #endif

    implementierungsabhängige Aktionen:

    #pragma (Sequenz)

    • eingebaute Makros:

    LINE Nummer der aktuellen Quelltextzeile

    FILE Name der aktuell compilierten Datei

    DATE aktuelles Datum der Form ”Mmm dd yyy”

    TIME aktuelle Uhrzeit der Form ”hh:mm:ss”

    STDC Konstante (Wert 1), wenn ANSI-kompatibel

    • Bildung von Zeichenketten, wenn Ersatzsymbolfolge mit ’#’ beginnt

    • Verkettung von Symbolen mittels ’##’

    • vor dem ’#’ dürfen Lerrzeichen/Tabulatoren stehen

    41

  • '

    &

    $

    %

    '

    &

    $

    %

    allgemeine Hinweise

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 42

    • Include Dateien– eine für Projekt − > keine Wiederverwendung von Teilen+ Module nach ,,Objekten” bilden, (ev. mit Testrahmen)

    • Variablen– globale sind zur Kommunikation unübersichtlich

    + Lokalität bietet Abgeschlossenheit, als Parameter übergeben

    • Kommantare– zukommentiertes Programm, undokumentierte Seiteneffekte

    + selbstkommentierende Symbolnamen, Modul/Fkt.kommentar

    • Strukturierung– keine oder freie

    + Blockbildung mit Tabulatoren

    • Codegestaltung– Spaghetti-Code (elend lange Funktionen...)

    + Eine Funktion nicht länger als eine Bildschirmseite

    • Namenskonventionen– bunt gemischt

    + symbol. Konstanten groß, Variablen klein, Funktionsname dürfen Groß-

    buchstaben als Worttrenner enthalten,

    42

  • '

    &

    $

    %

    '

    &

    $

    %

    Tools

    '

    &

    $

    %

    '

    &

    $

    %

    Arlt/Pahnke TUI/EI/ESS emsys eC CPP-I 43

    • make

    – Automatische Generierung von Programmen (compile, link)

    –”build“-Kriterium ≡

    ”time stamps“

    – Vermeidung von Redundanz

    • ctags/etags

    – Generierung eines”tag- (index-) files“- tags/TAGS für vi(vim)/emacs

    – Auffinden von Deklarationen und Definitionen durch

    –”cross references“

    43