Systemnahe Programmierung in Chome Systemnahe Programmierung in C: Mehrdimensionale Felder Prof. Dr. Uwe Schmidt FH Wedel

Mehrdimensionale Felder

weiter

weiter

Mehrdimensionale Felder als Parameter
Beispiel: mehrdimparam.c

   1long f1 (long ar[][6][7]);
   2long f2 (long *unsignedunsignedunsigned);
   3
   4void
   5test (void)
   6{
   7  long x;
   8  long larray[5][6][7];
   9
  10  x = f1 (larray);
  11
  12  x = f2 (&larray[0][0][0], 5, 6, 7);
  13
  14}
  15
  16long
  17f1 (long ar[][6][7])
  18{
  19  return ar[1][2][3];
  20}
  21
  22long
  23f2 (long *arunsigned d1unsigned d2unsigned d3)
  24{
  25  return *(ar + 1 * d3 * d2 + 2 * d2 + 3);
  26
  27  /* oder */
  28
  29  return ar[* d3 * d2 + 2 * d2 + 3];
  30
  31  /* oder */
  32
  33  return ar[(* d3 + 2) * d2 + 3];
  34
  35}
weiter

weiter

Übersetzen

cc -c -Wall mehrdimparam.c

weiter

weiter

Matrizen

zwei Beispielimplementierungen

weiter

weiter

Tabellengesteuerter Typcheck
Beispiel: typecheck.c

   1#include <stdio.h>
   2
   3enum TYPES
   4{ SPECIAL = -2,
   5  ILLEGAL,
   6  INT,
   7  FLOAT,
   8  DOUBLE,
   9  POINTER,
  10  LAST
  11};
  12
  13enum TYPES result_type[LAST][LAST] =
  14{ INT,     DOUBLE,  DOUBLE,  POINTER,
  15  DOUBLE,  DOUBLE,  DOUBLE,  ILLEGAL,
  16  DOUBLE,  DOUBLE,  DOUBLE,  ILLEGAL,
  17  POINTERILLEGALILLEGALSPECIAL
  18};
  19
  20enum TYPES
  21type_needed (enum TYPES t1enum TYPES t2)
  22{
  23  enum TYPES result = result_type[t1][t2];
  24
  25  if (result == ILLEGAL)
  26    fprintf (stderr"Illegal Operands\n");
  27
  28  return result;
  29}
weiter

weiter

Übersetzen

cc -c -Wall typecheck.c

weiter

weiter

Eleganterer Gebrauch von enum
Beispiel: typecheck2.c

   1#include <stdio.h>
   2
   3typedef enum
   4{ SPECIAL = -2,
   5  ILLEGAL,
   6  INT,
   7  FLOAT,
   8  DOUBLE,
   9  POINTER,
  10  LAST
  11}
  12TYPES;
  13
  14TYPES result_type[LAST][LAST] =
  15  { { INT,     DOUBLE,  DOUBLE,  POINTER },
  16    { DOUBLE,  DOUBLE,  DOUBLE,  ILLEGAL },
  17    { DOUBLE,  DOUBLE,  DOUBLE,  ILLEGAL },
  18    { POINTERILLEGALILLEGALSPECIAL }
  19  };
  20
  21TYPES
  22type_needed (TYPES t1TYPES t2)
  23{
  24  TYPES result = result_type[t1][t2];
  25
  26  if (result == ILLEGAL)
  27    fprintf (stderr"Illegal Operands\n");
  28
  29  return result;
  30}
weiter

weiter

Übersetzen

cc -c -Wall typecheck2.c

weiter

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