Structs och funktionspekare

Relevanta dokument
Ulf Assarsson. Grafisk display + seriekommunika3on (USART) Läromoment: USART Grundläggande C-programmering del 2

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Grundläggande C-programmering

Grundläggande C-programmering del 4 Mer programstruktur samt Dynamisk minnesallokering Ulf Assarsson

Programmering av inbyggda system

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Ulf Assarsson. Grundläggande C-programmering del 3. Läromoment: Grundläggande C-programmering del 3

Demonstration och konsultation Arbetsbokens avsnitt 5 och 6 LCD Grafisk display Introduktion till laboration 3

Repetition C-programmering

Introduktion C-programmering

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Övning från förra gången: readword

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering av grafisk display

Programmering av grafisk display

Att använda pekare i. C-kod

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77)

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Classes och Interfaces, Objects och References Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmering A. Johan Eliasson

Classes och Interfaces, Objects och References, Initialization

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Programmering för språkteknologer II, HT2011. Rum

TDIU01 - Programmering i C++, grundkurs

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

*Pekarvärden *Pekarvariabler & *

Tentamen *:58/ID100V Programmering i C Exempel 3

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDIU01 - Programmering i C++, grundkurs

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

#include <stdio.h> #include <string.h>

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

F5: Högnivåprogrammering

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

F5: Högnivåprogrammering

1 Egna klasser. 1.1 En punkt-klass

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Föreläsning 5-6 Innehåll

TDDC77 Objektorienterad Programmering

Anteckningar 1: Grundläggande saker

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

GPIO - General Purpose Input Output

Programmering B med Visual C

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

TDDC76 - Programmering och Datastrukturer

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Typkonvertering. Java versus C

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 14

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Enkla datatyper minne

Assemblerprogrammering för ARM del 2

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Övningar Dag 2 En första klass

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Poster ( structar ) Postdeklarationer

F8 - Arv. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Föreläsning 10. Pekare (Pointers)

DAT043 - Föreläsning 7

C-programmering del 4. Ulf Assarsson. extern, sta.c, Överkurs: const, inline, Gameloop, grafikloop, fraktalt berg

Det finns många flaggor till g++,

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Innehåll. Pekare Exempel

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Objektorientering: Lagring, räckvidd och livstid

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

JAVA Mer om klasser och objektorientering

Assemblerprogrammering, ARM-Cortex M4 del 3

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

SMD 134 Objektorienterad programmering

Assemblerprogrammering för ARM del 3

Datatyper. Programmering. Att definiera datatyper i Java. Laddade partiklar. (x,y) (Rx,Ry) hh.se/db2004

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Grundläggande C-programmering del 1 - För maskinorienterad programmering

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

TDA550 - Objektorienterad programvaruutveckling, fk

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Välkommen till. Datastrukturer, algoritmer och programkonstruktion. eller DOA

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

TDDC77 Objektorienterad Programmering

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Transkript:

Grundläggande C-programmering del 3 Structs och funktionspekare Ulf Assarsson Läromoment: Structs, pekare till structs (pilnotation), array av structs, Portadressering med structs Funktionspekare, structs med funktionspekare (objektorienterad stil) Kopplat till Arbetsbok Avsnitt 4: GPIO Avsnitt 5: ASCII-display Hemuppgifter: v3.

Föregående lektion Pekare int a; int*p = &a; Absolutadressering (portar): typedef, volatile, #define Arrayer av pekare, arrayer av arrayer char *fleranamn[] = "Emil", "Emilia", "Droopy"; typedef volatile unsigned char* port8ptr; #define INPORT_ADDR 0x40011000 #define INPORT *((port8ptr)inport_addr) // läser från 0x40011000 value = INPORT; int arrayofarrays[3][4] = 1,2,3,4, 5,6,7,8, 9,10,11,12 ; 2

Stack Vanlig fråga Heap Data Segment Code Segment Ska man skapa en pekare eller en array (när det gäller specialfallet sträng)? 1. char* s1 = "Emilia"; // skrivskyddat strängliteralminne (datasegmentet) 2. char s2[] = "Emilia"; // skrivbart minne (datasegmentet eller stacken) Spelar ofta ingen roll, men ska du ändra strängen så välj nr 2. // skrivskyddat strängliteralminne: void main() char *a; a = "hejsan ; const static char literal_constant_34562[7] = h', 'e', j', s', a', n', '\0'; int main() char *a; a = &literal_constant_34562[0]; Pekare och Arrayer/VK 3

Structs

Sammansatta datatyper (structs) En så kallad struct (från eng. structure) (Kallas även post på svenska) Har en/flera medlemmar. Medlemmarna kan vara av t ex: bas-typ char, short, int, long, long long (som signed/unsigned) float, double Sammansatta typer (t ex en annan struct). Pekare (även till funktioner och samma struct) Arrayer Kombinationer av ovanstående 5

Användning av struct #include <stdio.h> char* kursnamn = Maskinorienterad Programmering"; struct Course char* name; float credits; int numberofparticipants; ; int main() struct Course mop; mop.name = kursnamn; mop.credits = 7.5f; mop.numberofparticipants = 110; Definition av strukturen Deklaration av variabeln mop Access till medlemmar via.-operatorn return 0; 6

Initieringslista struct Course ; char* name; float credits; int numberofparticipants; struct Course kurs1 = "MOP", 7.5f, 110; struct Course kurs2 = "MOP", 7.5f; initieringslista En struct kan initieras med en initieringslista. Initieringen sker i samma ordning som deklarationerna, men alla medlemmar måste inte initieras. 7

Typedef alias för typer Exempel: typedef unsigned int uint32, uint32_t; typedef signed short int int16; typedef unsigned char *ucharptr; uint32 a, b = 0, c; int16 d; ucharptr p; typedef int postnr; typedef int gatunr; postnr x = 41501; gatunr y = 3; x = y; // Ingen typkonvertering behövs ty bådas typer är int. // Lurighet: '*' ingår inte i typdeklarationen för byteptr2 typedef char* byteptr, byteptr2; // byteptr2 fel! typedef char *byteptr, *byteptr2; // rätt typedef char *byteptr, byte; // rätt typedef förenklar/förkortar uttryck, vilket kan öka läsbarheten. typedef unsigned char uint8, ; typ alias/typnamn 8

Structs (sammansatta datatyper) Sv: Poster optional struct StructName typ medlem1; typ medlem2; variabel1, variabel2 ; optional Ekvivalenta skrivsätt: struct Player // Player kan här skippas int age; char* name; player1, player2; Eller: struct Player int age; char* name; ; struct Player player1, player2; Eller: typedef struct tplayer // tplayer kan skippas int age; char* name; Player ; Player player1, player2; 9

Structs (sammansatta datatyper) Initieringar av structs Vanligt förekommande: typedef struct int age; char* name; Player; //Player är nu typalias för denna struct. Fördel: slipper skriva struct Player Player player1 = 15, "Ulf"; Player player2 = 20, "John Doe"; // eller t ex player1.age = 16; player1.name = "Striker"; Structs kan innehålla andra structs: typedef struct int x; int y; Position; typedef struct int age; char* name; Position pos; Player; Player player1 = 15, "Striker, 5, 10; // eller t ex player1.pos.x = 6; player1.pos.y = 11; player1.pos = (Position)6,11;// funkar // Ofullständing initiering OK! Player player1 = 15, "Striker, 5; 10

Structs (sammansatta datatyper) I uppgift 34: typedef struct tpoint unsigned char x; unsigned char y; POINT; #define MAX_POINTS 20 typedef struct tgeometry int numpoints; int sizex; int sizey; POINT px[ MAX_POINTS ]; GEOMETRY, *PGEOMETRY; Skapa och initiera en variabel av typen GEOMETRY: GEOMETRY ball_geometry = 12, 4, 4, // POINT px[20] 0,1, // px[...] 0,2, 1,0, 1,1, 1,2, 1,3, 2,0, 2,1, 2,2, 2,3, 3,1, 3,2 // Här utnyttjar vi ofullständig // initiering (12 av 20) ; 11

Pekare till struct - pilnotation Course *pmop; // Pekare till struct (*pmop).name = Eller enklare: pmop->name = Pilnotationen förenklar, då det är vanligt att ha pekare till structs 12

Pekare till struct #include <stdio.h> #include <stdlib.h> char* kursnamn = Maskinorienterad Programmering"; I Java: public class Course String name; float credits; int numberofparticipants; typedef struct char* name; float credits; int numberofparticipants; Course; int main() Course *pmop; // Pekare till struct pmop = (Course*)malloc(sizeof(Course)); (*pmop).name = kursnamn; pmop->name = kursnamn; pmop->credits = 7.5f; pmop->numberofparticipants = 110; // eller Course mop, *pmop; pmop = &mop; // och givetvis utan free() Course mop = new Course(); mop.name = mop.credits = 7.5; Access till medlemmar via -> operatorn free(pmop); return 0; 13

Java har lurat er Dog mydog = new Dog("Rover"); mydog är (under ytan) en pekare till en Dog. Pekare behövs oftast i ett program. Men ett programspråkkan döljabehovetgenom språkets konstruktion. 14

Array av structs #include <stdio.h> typedef struct char* name; float credits; Student; Student stud1 = "Per", 200.0f; Student stud2 = "Tor", 200.0f; Student stud3 = "Ulf", 20.0f; Student students[3] = stud1, stud2, stud3; // eller bara: Student students[] = "Per", 200.0f, "Tor", 200.0f, "Ulf", 20.0f; int main() printf("%s, %s, %s\n", students[0].name, students[1].name, students[2].name); return 0; Per, Tor, Ulf 15

Portadressering med structs Istället för: #define portmoder ((volatile unsigned int *) (PORT_DISPLAY_BASE)) #define portotyper ((volatile unsigned short *)(PORT_DISPLAY_BASE+0x4)) #define portospeedr ((volatile unsigned int *) (PORT_DISPLAY_BASE+0x8)) #define portpupdr ((volatile unsigned int *) (PORT_DISPLAY_BASE+0xC)) #define portidrlow ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x10)) #define portidrhigh ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x11)) #define portodrlow ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x14)) #define portodrhigh ((volatile unsigned char *) (PORT_DISPLAY_BASE+0x14+1)) Så kan vi utnyttja structs genom att skriva: typedef struct uint32_t moder; uint16_t otyper; // +0x4 uint16_t otreserved; uint32_t ospeedr; // +0x8 uint32_t pupdr; // +0xc uint8_t idrlow; // +0x10 uint8_t idrhigh; // +0x11 uint16_t idrreserved; uint8_t odrlow; // +0x14 uint8_t odrhigh; // +0x15 uint16_t odrreserved; GPIO; #define GPIO_D (*((volatile GPIO*) 0x40020c00)) #define GPIO_E (*((volatile GPIO*) 0x40021000)) Exempel: GPIO_E.moder = 0x55555555; GPIO_E.otyper = 0x00000000; GPIO_E.ospeedr = 0x55555555; GPIO_E.pupdr &= 0x55550000; 16

Portadressering individuella bytes Nyss definierade vi idrlow och idrhigh som bytes och idrreserved som 16-bits. Men vi skulle istället kunna ha definierat alla dessa tre som bara uint32_t idr; dvs 4 bytes och sedan addressera individuella bytes uint8_t x = *(uint8_t*)&gpio_e.idr; // idrlow uint8_t y = *((uint8_t*)&gpio_e.idr + 1); // idrhigh uint16_t z = *((uint16_t*)&gpio_e.idr + 1); // idrreserved typedef struct uint32_t moder; uint16_t otyper; // +0x4 uint16_t otreserved; uint32_t ospeedr; // +0x8 uint32_t pupdr; // +0xc uint8_t idrlow; // +0x10 uint8_t idrhigh; // +0x11 uint16_t idrreserved; uint8_t odrlow; // +0x14 uint8_t odrhigh; // +0x15 uint16_t odrreserved; GPIO; typedef volatile GPIO* gpioptr; #define GPIO_E (*((gpioptr) 0x40021000)) typedef struct _gpio uint32_t moder; uint32_t otyper; // +0x4 uint32_t ospeedr; // +0x8 uint32_t pupdr; // +0xc uint32_t idr; // +0x10 uint32_t odr; // +0x14 GPIO; typedef volatile GPIO* gpioptr; #define GPIO_E (*((gpioptr) 0x40021000)) 17

Portadressering med structs typedefstruct tag_usart volatile unsigned short sr; volatile unsigned short Unused0; volatile unsigned short dr; volatile unsigned short Unused1; volatile unsigned short brr; volatile unsigned short Unused2; volatile unsigned short cr1; volatile unsigned short Unused3; volatile unsigned short cr2; volatile unsigned short Unused4; volatile unsigned short cr3; volatile unsigned short Unused5; volatile unsigned short gtpr; USART; #define USART1 ((USART *) 0x40011000) Exempel: while (( (*USART).sr & 0x80) == 0) ; // vänta tills klart att skriva (*USART1).dr = (unsigned short) 'a'; Eller med pilnotation: while (( USART->sr & 0x80)==0) ; USART1->dr = (unsigned short) 'a ; 18

Funktionspekare

Funktionspekare #include <stdio.h> int square(int x) return x*x; int main() int (*fp)(int); En funktionspekare fp = square; printf("fp(5)=%i \n", fp(5)); return 0; fp(5)=25 20

Funktionspekare int (*fp)(int); Funktionspekarens typ bestäms av: Returtyp. Antal argument och deras typer. Funktionspekarens värde är en adress. 21

Likheter assembler C Både funktioner och globala variabler har adresser i minnet, men vi använder symboler..align 2 delay: movs r3, #255 loop_delay: subs r3, r3, #1 ands r3, r3, #255 bne loop_delay bx lr.align 4 var1:.space 4 int var1; void delay() unsigned char tmp = 255; do tmp--; while(tmp); 22

Structs med funktionspekare för en mer objektorienterad programmeringsstil

Objektorientering Har utvecklats kontinuerligt sedan 50-talet. Enormt stort område. Ni lär er i kursen Objektorientering (och fortsättningskurser ) Bör vara ert 1:a ryggmärgsval för att designa kod. (Finns emellanåt dock bra andra alternativ.) För oss här och nu: ett sätt att strukturera sina funktioner tillsammans med tillhörande data. Man vill ha lokala funktioner som hör ihop med strukten. Konceptet kallas klass (class). En klass kan innehålla både medlemmar och metoder (=funktioner). C har inte klasser, så vi får simulera detta med structs med funktionspekare för metoderna. Vi skulle t ex vilja kunna göra såhär: typedef struct int a; // en medlem void inc() // metod som inkrementerar a MyClass; a++; MyClass v = 0; // initierar en variabel v.inc(); // inkrementerar v.a I C kan vi dock göra såhär: typedef struct tmyclass int a; void (*inc) (struct tmyclass* this); MyClass; void incr(myclass* this) this->a++; MyClass v = 0, incr; v.inc(&v); 24

Objektorientering med C Förtydligande: Detta är ekvivalent typedef struct tmyclass int a; void (*inc) (struct tmyclass* this); MyClass; tmyclass används för att ange en giltig parametertyp för this, eftersom MyClass är odefinierad fram tills sista raden. // MyClass är ett så kallat objekt. // v1, v2 är två instanser av objektet. MyClass v1 = 0, incr, v2 = 1, incr; // Här anropar vi metoden inc() för v1 // samt v2. v1.inc(&v1); v2.inc(&v2); med detta: Talar om för compilern att MyClass är en struct eftersom den inte finns definierad förrän sista raden men behövs redan här struct MyClass; typedef struct int a; void (*inc) (MyClass* this); MyClass; Båda sätten är lika OK. Hur metodanropet.inc( ) fungerar i C: Dessa initieringar gör att v1.a = 0 och v2.a=1 samt att v1.inc och v2.inc pekar på funktionen incr(). Kom ihåg att incr helt enkelt är en symbol för minnesadressen där incr() ligger, samt att v1.inc och v2.inc är pekarvariabler som pekar på denna adress. Här anropas de funktioner som funktionspekaren v1.inc resp. v2.inc pekar på, och med &v1 resp. &v2 som inparameter. Dvs v1.inc(&v1) resulterar i att incr(&v1) anropas. v2.inc(&v2) resulterar i at incr(&v2) anropas. // incr() är en vanlig funktion (som funktionspekarna v1.inc och v2.inc pekar på). void incr(myclass* this) this->a++; Anropet incr(&v1) innebär att inparametern this blir lika med &v1 (dvs adressen till v1). Alltså resulterar this->a++ i samma som (&v1)->a++ (vilket är eqvivalent med v1.a++) vilket är precis vad vi vill ska hända när vi gör v1.inc(&v1); J Samma gäller v2.inc(&v2); Dvs det inkrementerar v2.a. 25

Objektorientering i C - exempel Exempel från hemuppgifterna: typedef struct tgameobject // medlemmar GfxObject gfxobj; vec2f pos; float speed; // metoder (dvs funktionspekare) void (*update) (struct tgameobject* this); GameObject; // update ska peka på någon av dessa funktioner: void updateship (GameObject* this) this->pos += void updatealien(gameobject* this) this->pos += GameObject ship, alien; GameObject* objs[] = &ship, &alien; void main() // initiera funktionspekarna för ship och // alien till rätt funktion. (Initiera även // övriga structmedlemmar.) ship.update = updateship; alien.update = updatealien; // update all objects for(int i=0; i<2; i++) objs[i]->update(objs[i]); Detta resulterar Detta alltså utför i anropen alltså anropen ship.update(&ship) updateship(&ship) samt alien.update(&alien), samt vilket pga update-funktionspekarna updatealien(&alien) resulterar i anropen: updateship(&ship) resp. updatealien(&alien) 26

Objektorientering i C - exempel Exempel 34 i Arbetsboken: typedef struct tobj PGEOMETRY geo; int dirx,diry; int posx,posy; void (* draw ) (struct tobj *); void (* move ) (struct tobj *); void (* set_speed ) (struct tobj *, int, int); OBJECT, *POBJECT; // store all objects in global array OBJECT* obj[] = &ball, &player; // In some function: // - move and draw all objects for(int i=0; i<2; i++) obj[i]->move(obj[i]); obj[i]->draw(obj[i]); ; OBJECT ball = &ball_geometry, // geometri för en boll 0,0, // move direction (x,y) 1,1, // position (x,y) draw_object, // draw method move_object, // move method set_object_speed // set-speed method ; OBJECT player = &player_geo, // geometri för en boll 0,0, // move direction (x,y) 10,10, // position (x,y) draw_player, // draw method move_player, // move method set_player_speed // set-speed method ; 27

Structs med funktionspekare påminner om klassmetoder I C: typedef struct tcourse void (*addstudent)(struct tcourse* crs, char* name); Course; Like a class method! - but needs 4 bytes for the function pointer in the struct. Java/C++ store all the class methods in one separate ghost struct. void funcaddstudent(course* crs, char* name) // some C function void main() Course mop; mop.addstudents = funcaddstudent; // set the function pointer to our desired function mop.addstudent(&mop, "Per"); // call addstudent() like a class method 28

Structs med funktionspekare påminner om klassmetoder I C: typedef struct tcourse char* name; float credits; int numberofparticipants; char* students[100]; void (*addstudent)(struct tcourse* crs, char* name); Course; void funcaddstudent(course* crs, char* name) crs->students[crs->numberofparticipants++] = name; void main() Course mop; mop.name = "Maskinorienterad Programmering"; mop.credits = 7.5f; mop.numberofparticipants = 0; mop.addstudent = funcaddstudent; // set the function pointer to our desired function mop.addstudent(&mop, "Per"); I Java: public class Course String name; float credits; int numberofparticipants; String[] students; void addstudent(string name); Course mop = new Course(); mop.name = mop.credits = 7.5; mop.addstudent( Per ); OK, men vi hade ju lika gärna kunnat anropa funcaddstudent( ) här, så vad är poängen med att gå via pmop->addstudent(...)? Jo... 29

Övningsuppgift 1 Gör en struct som innehåller en funktionspekare Tilldela funktionspekaren värdet till en motsvarandelämplig funktion (dvsav samma typ). Anropa funktionen (dvs motsvarigheten till metodanrop för klass i Java/C++ etc.). 30

Övningsuppgift 2 Objektorientering struct med funktionspekare: typedef struct tmyobject int b; // lägg till funktionspekare till funktion som decrementerar b myobject ; // och komplettera nedanstående kod myobject var = ; var.dec( ); // så att följande anrop funkar och alltså // har samma effekt som var.b--; Ledtråd tidigare exempel: typedef struct tmyclass int a; void (*inc) (struct tmyclass* this); myclass; void incr( ) this->a++; 31

Nästa föreläsning: Mer programstruktur