Embedded C und C++ S. Arlt/K. Pahnke - TU Ilmenau

Die Seite wird erstellt Santiago-Stefan Hübner
 
WEITER LESEN
'                                                                         $

                    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
'                                                                         $

                                        Inhalt I
&                                                                         %
'                                                                         $

                               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

&                                                                         %

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

                                     Inhalt II
&                                                                         %
'                                                                         $

                       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)

&                                                                         %

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

                                 Inhalt III
&                                                                        %
'                                                                        $

                     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

&                                                                        %

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

                                 Inhalt IV
&                                                                                        %
'                                                                                        $

       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

&                                                                                        %

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

                                   Inhalt V
&                                                                %
'                                                                $

                               Teil V Embedded OS

 1. Basic Concepts of Embedded (RT)OS

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

&                                                                %

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

                                 Literatur
&                                                                                        %
'                                                                                        $

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
              ”

&                                                                                        %

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

                                       Einführung I
&                                                                                                  %
'                                                                                                  $

             “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, ...)

&                                                                                                  %

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

                                  Einführung II
&                                                                        %
'                                                                        $

 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++

&                                                                        %

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

                                   Programmstruktur
&                                                                                    %
'                                                                                    $

                       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;
}

&                                                                                    %

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

                              Aufbau einer Funktion
&                                                                                     %
'                                                                                     $

      • Funktionsname
         muß mit Buchstaben oder         beginnen

      • Parameterliste
         in runde Klammern eingeschlossen, kann leer sein

      • Anweisungsblock
         in 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;
}

&                                                                                     %

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

                                Schlüsselworte in C
&                                                                               %
'                                                                               $

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 !

&                                                                               %

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

                               Grunddatentypen
&                                                                                          %
'                                                                                          $

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)

&                                                                                          %

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

                                  Konstanten
&                                                                        %
'                                                                        $

  1. Integer

         • dezimal
            123,
            123L, 123456 /* long */
         • hexadezimal
            0x0f3,
            0xffe3f /* long */,
         • oktal
            017,
            017L /* long */

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

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

&                                                                        %

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

                                Zeichenkonstanten
&                                                                               %
'                                                                               $

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 */

&                                                                               %

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

                        Zeichenkettenkonstanten
&                                                                                  %
'                                                                                  $

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’

&                                                                                  %

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

                                Variablen
&                                                                                    %
'                                                                                    $

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.

&                                                                                    %

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

                               Typkonvertierungen
&                                                                                   %
'                                                                                   $

   char
                               int
                                                     unsigned char
   short

                                     unsigned int

                                                     unsigned short
                           long

                                     unsigned long

   float               double

&                                                                                   %

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

                                        Operatoren
&                                                                                            %
'                                                                                            $

 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

&                                                                                            %

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

                                         Operatoren
&                                                                                      %
'                                                                                      $

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
&                                                                             %
'                                                                             $

  • 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)

&                                                                             %

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

                              Entscheidungsoperator
&                                                                               %
'                                                                               $

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);
}

&                                                                               %

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

                                spezielle Operatoren
&                                                                                  %
'                                                                                  $

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; */

&                                                                                  %

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

                      Vorrang und Assoziativität
&                                                                                         %
'                                                                                         $

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

&                                                                                         %

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

                                     Ablaufsteuerung
&                                                                                         %
'                                                                                         $

                                   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;
}

&                                                                                         %

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

                               Entscheidung
&                                                           %
'                                                           $

&                                                           %

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

                               switch–Anweisung
&                                                               %
'                                                               $

&                                                               %

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

                               Schleifen
&                                                        %
'                                                        $

&                                                        %

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

                               for–Anweisung
&                                                            %
'                                                            $

&                                                            %

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

                               unbedingte Sprünge
&                                                                                    %
'                                                                                    $

 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

&                                                                                    %

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

                                           Zeiger
&                                                                                   %
'                                                                                   $

  • 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 ...”

&                                                                                   %

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

                                Zeiger-Arithmetik
&                                                                           %
'                                                                           $

Folgende Operationen sind zugelassen:

                  Zeiger + Integer Ergebnis Zeiger
                  Zeiger − Integer Ergebnis Zeiger
                  Zeiger − Zeiger     Ergebnis Integer
Vergleich

                  Zeiger mit N U LL

Achtung:
Die Integerwerte sind als Feld-Indizees zu interpretieren !

&                                                                           %

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

                               Standard-Bibliothek
&                                                                   %
'                                                                   $

Leistungen:

  • Ein/Ausgabe zeilen– und zeichenweise

  • formatgesteuerte Ein/Ausgabe

  • Dateizugriff

  • dynamische Speicherverwaltung

  • Stringmanipulationen

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

&                                                                   %

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

                      Formatgesteuerte Ausgabe
&                                                                                   %
'                                                                                   $

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:
% [f lags] [ [0] F eldbreite ] [.[Genauigkeit] ] [ l ]konv.Zeichen

&                                                                                   %

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

                                  Dateifunktionen
&                                                                                    %
'                                                                                    $

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”

&                                                                                    %

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

                                Dateifunktionen
&                                                                     %
'                                                                     $

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

&                                                                     %

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

                     Stringfunktionen (Auswahl)
&                                                                                 %
'                                                                                 $

int strlen(char *s);
     ermittelt die Länge der Zeichenkette in Byte (ohne 0 \00 )

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)

&                                                                                 %

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

                                Memoryfunktionen
&                                                                               %
'                                                                               $

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.

&                                                                               %

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

                                Speicherverwaltung
&                                                                                 %
'                                                                                 $

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 !

&                                                                                 %

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

                                Preprozessor
&                                                                  %
'                                                                  $

   • wird vor jedem Compilerlauf gestartet

   • verarbeitet Zeilen mit ’#’ an erster Position

Befehle

         #include < datei >
         #define M akroname
         #undef        M akroname

Bedingte Compilierungg

         #ifdef        M akroname
         #ifndef       M akroname
         #else
         #endif

Weitere Preprozessor-Befehle:

         #line         Konstante ”dateiname”

&                                                                  %

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

                            ANSI–C Preprozessor
&                                                                                        %
'                                                                                        $

Erweiterung der bedingten Compilierung:

         #if           defined (M akroname)
         #elif         defined (M akroname)
         #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

&                                                                                        %

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

                               allgemeine Hinweise
&                                                                                    %
'                                                                                    $

  • 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,

&                                                                                    %

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

                                 Tools
&                                                                                   %
'                                                                                   $

  • 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“
        ”

&                                                                                   %

Arlt/Pahnke TUI/EI/ESS emsys                                          eC CPP-I 43
Sie können auch lesen