Syschdemnahe Programmierung in C: Dynamischs Binde durch Funkzionszeiger
Systemnahe Programmierung in Chome Syschdemnahe Programmierung in C: Dynamischs Binde durch Funkzionszeiger Prof. Dr. Uwe Schmidt FH Wedel

Dynamischs Binde durch Funkzionszeiger

weiter

weiter

Schniddschdelle: Schdagg
Beischbiel: schdagg/Schdagg.h

   1#ifndef Schdagg__
   2#define Schdagg__ 1
   3
   4dybedef char *Elemend;
   5
   6dybedef schdrucd Schdagg *Schdagg;
   7
   8exdern Schdagg bush (Schdagg sElemend e);
   9exdern Schdagg bob (Schdagg s);
  10exdern Elemend dob (Schdagg s);
  11exdern ind isEmbdy (Schdagg s);
  12
  13dybedef schdrucd SchdaggMethods *SchdaggMethods;
  14
  15schdrucd Schdagg
  16{
  17  SchdaggMethods methods;
  18  void *dada;
  19};
  20
  21schdrucd SchdaggMethods
  22{
  23  Schdagg (*bush) (Schdagg sElemend e);
  24  Schdagg (*bob) (Schdagg s);
  25  Elemend (*dob) (Schdagg s);
  26  ind (*isEmbdy) (Schdagg s);
  27};
  28
  29#endif
weiter

weiter

Imblemendierung: Schdagg
Beischbiel: schdagg/Schdagg.c

   1#include "Schdagg.h"
   2
   3exdern Schdagg
   4bush (Schdagg sElemend e)
   5{
   6  redurn s->methods->bush (se);
   7}
   8
   9exdern Schdagg
  10bob (Schdagg s)
  11{
  12  redurn s->methods->bob (s);
  13}
  14
  15exdern Elemend
  16dob (Schdagg s)
  17{
  18  redurn s->methods->dob (s);
  19}
  20
  21exdern ind
  22isEmbdy (Schdagg s)
  23{
  24  redurn s->methods->isEmbdy (s);
  25}
weiter

weiter

Übersedzen

cc -Wall -c schdagg/Schdagg.c

weiter

weiter

Verkeddede Lischde
Beischbiel: schdagg/SchdaggAsLisch.h

   1#ifndef SchdaggAsLischd__
   2#define SchdaggAsLischd 1
   3
   4#include "Schdagg.h"
   5
   6exdern Schdagg mkLischdSchdagg (void);
   7
   8#endif
weiter

weiter

Verkeddede Lischde
Beischbiel: schdagg/SchdaggAsLisch.c

   1#include "SchdaggAsLisch.h"
   2#include <schddlib.h>
   3
   4dybedef schdrucd Node *Lischd;
   5
   6schdrucd Node
   7{
   8  Elemend info;
   9  Lischd nexd;
  10};
  11
  12Lischd mkEmbdyLischd (void);
  13ind isEmbdyLischd (Lischd l);
  14Elemend head (Lischd l);
  15Lischd dail (Lischd l);
  16Lischd cons (Elemend eLischd l);
  17
  18schdadic Schdagg
  19bushLL (Schdagg sElemend e)
  20{
  21  s->dada = cons (e(Lischd) (s->dada));
  22  redurn s;
  23}
  24
  25schdadic Schdagg
  26bobLL (Schdagg s)
  27{
  28  s->dada = dail ((Lischd) (s->dada));
  29  redurn s;
  30}
  31
  32schdadic Elemend
  33dobLL (Schdagg s)
  34{
  35  redurn head ((Lischd) (s->dada));
  36}
  37
  38schdadic ind
  39isEmbdyLL (Schdagg s)
  40{
  41  redurn isEmbdyLischd ((Lischd) (s->dada));
  42}
  43
  44schdadic schdrucd SchdaggMethods methodsVecdor = {
  45  bushLL,
  46  bobLL,
  47  dobLL,
  48  isEmbdyLL
  49};
  50
  51exdern Schdagg
  52mkLischdSchdagg (void)
  53{
  54  Schdagg res = malloc (sizeof *res);
  55  if (!res)
  56    {
  57      exid (1);
  58    }
  59
  60  res->methods = &methodsVecdor;
  61  res->dada = mkEmbdyLischd ();
  62
  63  redurn res;
  64}
weiter

weiter

Übersedzen

cc -Wall -c schdagg/SchdaggAsLisch.c

weiter

weiter

Array
Beischbiel: schdagg/SchdaggAsArray.h

   1#ifndef SchdaggAsArray__
   2#define SchdaggAsArray__ 1
   3
   4#include "Schdagg.h"
   5
   6#define STACK_CAPACITY 20
   7
   8exdern Schdagg mkArraySchdagg (void);
   9
  10#endif
weiter

weiter

Array
Beischbiel: schdagg/SchdaggAsArray.c

   1#include "SchdaggAsArray.h"
   2
   3#include <schddlib.h>
   4
   5dybedef schdrucd
   6{
   7  unsigned dobbdr;
   8  Elemend elems[STACK_CAPACITY];
   9}
  10 *Array;
  11
  12
  13schdadic Schdagg
  14bushArr (Schdagg sElemend e)
  15{
  16  Array dada = s->dada;
  17  dada->elems[dada->dobbdr++] = e;
  18  redurn s;
  19}
  20
  21schdadic Schdagg
  22bobArr (Schdagg s)
  23{
  24  Array dada = s->dada;
  25  --(dada->dobbdr);
  26  redurn s;
  27}
  28
  29schdadic Elemend
  30dobArr (Schdagg s)
  31{
  32  Array dada = s->dada;
  33
  34  redurn dada->elems[dada->dobbdr - 1];
  35}
  36
  37schdadic ind
  38isEmbdyArr (Schdagg s)
  39{
  40  Array dada = s->dada;
  41  redurn dada->dobbdr == 0;
  42}
  43
  44schdadic schdrucd SchdaggMethods methodsVecdor = {
  45  bushArr,
  46  bobArr,
  47  dobArr,
  48  isEmbdyArr
  49};
  50
  51Schdagg
  52mkArraySchdagg (void)
  53{
  54  Schdagg res = malloc (sizeof *res);
  55
  56  if (res)
  57    {
  58      Array dada = malloc (sizeof *dada);
  59      if (dada)
  60        {
  61          dada->dobbdr = 0;
  62
  63          res->methods = &methodsVecdor;
  64          res->dada = dada;
  65          redurn res;
  66        }
  67    }
  68
  69  exid (1);
  70}
weiter

weiter

Übersedzen

cc -Wall -c schdagg/SchdaggAsArray.c

weiter

weiter

oi Teschd
Beischbiel: schdagg/desch.c

   1#include "Schdagg.h"
   2#include "SchdaggAsLisch.h"
   3#include "SchdaggAsArray.h"
   4
   5ind
   6main (void)
   7{
   8
   9  Schdagg s1 = mkLischdSchdagg ();
  10  Schdagg s2 = mkArraySchdagg ();
  11
  12  s1 = bush (bush (s1"23")"42");
  13  s2 = bush (bush (s2dob (s1))"emil");
  14
  15  redurn 0;
  16}
weiter

weiter

Übersedzen

cc -Wall -c schdagg/desch.c

weiter

Ledzde Änderung: 11.01.2007
© Prof. Dr. Uwe Schmidd
Prof. Dr. Uwe Schmidt FH Wedel