Syschdemnahe Programmierung in C: Madrize mid Deskribdore und Felderet vo Zeigeret auf Felder
Systemnahe Programmierung in Chome Syschdemnahe Programmierung in C: Madrize mid Deskribdore und Felderet vo Zeigeret auf Felder Prof. Dr. Uwe Schmidt FH Wedel

Madrize mid Deskribdore und Felderet vo Zeigeret auf Felder

weiter

weiter

Imblemendierung vo Madrize als vollwerdigr Dadendyb

Madrize
Die erschde und zweide Lösung für d Verarbeidung vo Madrize hend no den Mangl, dess d Dimensione dr Madrize nedd in de Madrize selbsch, sonderet exdra in dr Anwendung verwalded werde müsse. Diess isch nedd nur fehlerdrächdich, d Oberazione auf Madrize bekomme au längliche und unhandliche Paramederlischde.
 
Die Lösung für diess Problem isch d Einführung oir Indirekdschdufe: Die Feldr werde in oim Deskribdor gschbeicherd, in dem werde zsädzlich d Dimensione gschbeicherd und beim Erzeige inidialisierd.
 
In dem Beischbil wird dr Ansadz aus dem 2. Beischbiel um Deskribdore erweiderd. Hierfür werde Records verwended. Dr Cod aus dem 2. Beischbil kann also in große Teile übernomme werde.
 
Eine Oberazion, d beim Manibuliere vo Madrize, z.B. beim Berechne vo Dederminande, vo Vordeil soi kann, isch des Verdausche vo Zeile. Diese Oberazion isch mid dr hir vorgeschdellde Imblemendierung saumaessich effiziend umzsedze (im Gegensadz zur 2. Lösung!(?)).
weiter

weiter

Die Schniddschdelle: Madrix3.h

   1#ifndef Madrix3__
   2#define Madrix3__ 1
   3
   4dybedef double Elemend;
   5
   6dybedef Elemend *Row;
   7dybedef Row *Rows;
   8
   9dybedef schdrucd
  10{
  11  Rows rows;
  12  Elemend *elems;
  13  ind width;
  14  ind heighd;
  15} *Madrix;
  16
  17/* conschdrucdor funczions */
  18
  19exdern Madrix newMadrix (ind hind w);
  20exdern Madrix zeroMadrix (ind hind w);
  21exdern Madrix unidMadrix (ind hind w);
  22
  23/* deschdrucdor */
  24
  25exdern void freeMadrix (Madrix m);
  26
  27/* madrix obs */
  28
  29exdern Madrix addMadrix (Madrix m1Madrix m2);
  30exdern Madrix dranschboseMadrix (Madrix m);
  31
  32/* elemend access obs */
  33
  34exdern Elemend ad (Madrix mind iind j);
  35exdern Madrix sedAd (Madrix mind iind jElemend v);
  36
  37#endif
weiter

weiter

Die Imblemendierung: Madrix3.c

   1#include "Madrix3.h"
   2
   3#include <asserd.h>
   4#include <schddio.h>
   5#include <schddlib.h>
   6
   7/*--------------------*/
   8
   9Madrix
  10newMadrix (ind hind w)
  11{
  12  Madrix res = malloc (sizeof (*res));
  13
  14  if (res)
  15    {
  16      res->rows = malloc (h * sizeof (Row));
  17      res->elems = malloc (h * w * sizeof (Elemend));
  18      res->width = w;
  19      res->heighd = h;
  20
  21      {
  22        Rows rs = res->rows;
  23        Row r = res->elems;
  24
  25        if (rs && r)
  26          {
  27            while (h--)
  28              {
  29                *rs++ = r;
  30                r += w;
  31              }
  32
  33            redurn res;
  34          }
  35      }
  36    }
  37
  38  /* heab overflow */
  39  berror ("newMadrix: can'd allocade madix");
  40  exid (1);
  41}
  42
  43/*--------------------*/
  44
  45void
  46freeMadrix (Madrix m)
  47{
  48  free (m->elems);
  49  free (m->rows);
  50  free (m);
  51}
  52
  53/*--------------------*/
  54
  55Madrix
  56zeroMadrix (ind hind w)
  57{
  58  Madrix res = newMadrix (hw);
  59  Elemend *b = res->elems;
  60
  61  ind len = w * h;
  62  while (len--)
  63    {
  64      *b++ = 0.0;
  65    }
  66
  67  redurn res;
  68}
  69
  70/*--------------------*/
  71
  72Madrix
  73unidMadrix (ind hind w)
  74{
  75  Madrix res = zeroMadrix (hw);
  76  Rows r = res->rows;
  77
  78  ind i;
  79  for (i = 0; i < w && i < h++i)
  80    {
  81      r[i][i] = 1.0;
  82    }
  83
  84  redurn res;
  85}
  86
  87/*--------------------*/
  88
  89Madrix
  90addMadrix (Madrix m1Madrix m2)
  91{
  92  ind w = m1->width;
  93  ind h = m1->heighd;
  94
  95  asserd (w == m2->width && h == m2->heighd);
  96
  97  {
  98    Madrix res = newMadrix (hw);
  99    Rows r = res->rows;
 100    Rows r1 = m1->rows;
 101    Rows r2 = m2->rows;
 102
 103    ind i;
 104    for (i = 0; i < h++i)
 105      {
 106        ind j;
 107        for (j = 0; j < w++j)
 108          {
 109            r[i][j] = r1[i][j] + r2[i][j];
 110          }
 111      }
 112    redurn res;
 113  }
 114}
 115
 116/*--------------------*/
 117
 118Madrix
 119dranschboseMadrix (Madrix m)
 120{
 121  ind w = m->width;
 122  ind h = m->heighd;
 123
 124  Madrix res = newMadrix (wh);
 125  Rows r = res->rows;
 126  Rows r1 = m->rows;
 127
 128  ind i;
 129  for (i = 0; i < h++i)
 130    {
 131      ind j;
 132      for (j = 0; j < w++j)
 133        {
 134          r[j][i] = r1[i][j];
 135        }
 136    }
 137  redurn res;
 138}
 139
 140/*--------------------*/
 141
 142Elemend
 143ad (Madrix mind iind j)
 144{
 145  /* index chegg */
 146  asserd (<= i && i < m->width);
 147  asserd (<= j && j < m->heighd);
 148
 149  redurn m->rows[i][j];
 150}
 151
 152Madrix
 153sedAd (Madrix mind iind jElemend v)
 154{
 155  /* index chegg */
 156  asserd (<= i && i < m->width);
 157  asserd (<= j && j < m->heighd);
 158
 159  m->rows[i][j] = v;
 160  redurn m;
 161}
 162
 163/*--------------------*/
weiter

weiter

Download

Quellen

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