Institutionen för datavetenskap Umeå Universitet

Datavetenskapens grunder, KV, VT02


Kursplan
Lärare och handledare
Kursutvärderaren

Schema
Kursöversikt/läsanvisningar
Kurslitteratur
Gruppövningar
Utdelat material
Tentor
Handledning
Obligatoriska uppgifter
Laboration 1
Laboration 2
Laboration 3
Resultat

Lösningsförslag för C-delen

I C kan man göra generiska datatyper samt dynamisk storlek på matriserna. Man måste dock använda void*, malloc samt funktionspekare.

matrix.h
matrix.c
main.c

Det är endast matrix.c och matrix.h som är den abstrakta datatypen. Main.c är bara till för att visa hur man kan använda matrisen. Tittar man i matrix.h så ser man vilken gränsyta man har mot matrisen. För en som är ovan med funktionspekare kan det te sig som ett mörker. Men kortfattat:

  • Matrix getMatrix(unsigned int r, unsigned int s, unsigned int es);
    skapar en ny matris med r st rader, c kolumner och där varje element i matrisen har storlek es.
  • void getElement(Matrix m, unsigned int r, unsigned int c, void* v);
    hämtar elementet på plats (r,c) och sparar det i den plats som v pekar på.
  • Matrix addMatrises(Matrix m1, Matrix m2, void* (*addFunc) (void*, void*));
    adderar m1 med m2 och returnerar en ny matris. addFunc är en pekare till den funktion som adderar 2 element i m1 och m2. addFunc är en funktionspekare till en funktion som tar 2st void pekare som argument och returnerar en void pekare. (se main.c för exempel).

Eftersom matrisen är generell så vet den inte hur den ska behandla varje element, den vet bara algoritmerna för att addera två matriser. Den som använder ADT:n måste då själv implementera funktionen att addera matriselement och skicka med det som argument. Så en generell ADT gör oftast att mer ansvar flyttas från den som implementerar ADT:n till den som använder den.

I main.c så skapas en matris som har struct Bil som element. För att addMatrises ska vara "vettig" måste då först Bil + Bil vara definerad. Inte heller en utskrift kan göras utan att skicka med en funktion för att skriva ut ett enskilt element. I exemplet så är det gjort så att resultatet av Bil+Bil blir en Bil med "res" som förare och maxfarten som summan av de två bilarnas maxfart. Utskrift av en Bil är förare:maxfart

Lösningen är långt ifrån perfekt/klar. T.ex så är det inte implementerat hur man multiplicerar två matriser. Det minne som man har för att hålla elementen frigörs inte. Bättre felkontroller borde göras osv... Kompilering sker (lämpligen) med gcc -Wall -pedantic -ansi matrix.c main.c -o matrix

http://www.cs.umu.se/kurser/KOGB03/VT02/lab/lab1/index.html
Ansvarig för sidan: wmaster
Senast ändrad 2002-05-22
Copyright © 1999. All rights reserved.