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

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

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

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

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

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Structs och funktionspekare

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

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

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

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

TDDC76 - Programmering och Datastrukturer

Repetition C-programmering

Introduktion C-programmering

TDIU01 - Programmering i C++, grundkurs

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

2 Pekare och dynamiska variabler.

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

EDA480/EDA485 - Maskinorienterad programmering, tentamen 2006-xx-xx 1(7)

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

TDDC76 - Programmering och Datastrukturer

Poster ( structar ) Postdeklarationer

TDP004. Minne och pekare. Eric Elfving Institutionen för datavetenskap

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

Tommy Färnqvist, IDA, Linköpings universitet

LEU240 Mikrodatorsystem

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

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

TDIU01 - Programmering i C++, grundkurs

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

*Pekarvärden *Pekarvariabler & *

Abstrakta datastrukturer

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

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

Minnestilldelning (allokering) och frigörande (avallokering) av minne

tentaplugg.nu av studenter för studenter

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Föreläsning 10. Pekare (Pointers)

Att använda pekare i. C-kod

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

Det finns många flaggor till g++,

Tentamen med lösningsförslag

Datastrukturer. föreläsning 3. Stacks 1

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

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

TDDC77 Objektorienterad Programmering

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

4 Sammansatta datatyper

Föreläsning 2. Länkad lista och iterator

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen *:58/ID100V Programmering i C Exempel 3

TDIU01 Programmering i C++

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

Föreläsning 5-6 Innehåll

Tentamen med lösningsförslag

Föreläsning 2. Länkad lista och iterator

Indexerade variabler

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

Föreläsning 6: Introduktion av listor

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

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Tillämpad programmering

Enkla datatyper minne

Arrays (indicerade variabler) Föreläsning 6

Länkade strukturer, parametriserade typer och undantag

Exempelsamling Assemblerprogrammering

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

PROGRAMMERING-Java Omtentamina

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

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

1 Egna klasser. 1.1 En punkt-klass

grundläggande C++, funktioner m.m.

Datastrukturer. Typdeklarationer. Ny datastruktur i C- struct. exempel. Ofta bra att kunna fšra ihop information av olika datatyper till en enhet.

F4. programmeringsteknik och Matlab

Objektorienterad Programmering (TDDC77)

F5: Högnivåprogrammering

Hantering av textsträngar och talsträngar. William Sandqvist

Föreläsning 5: Introduktion av pekare

Assemblerprogrammering för ARM del 3

F5: Högnivåprogrammering

Pekare och arrayer. Indexering och avreferering

Arrays (indicerade variabler) Föreläsning 4

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

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

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Programmering B med Visual C

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

Föreläsning 11. Arrayer. Arrayer. Arrayer. Lagrar flera värden av samma typ Kan vara primitiva typer eller objekt. Kan ha en array av t.

Föreläsning 4 Innehåll

Exempel ( )

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

Objektorienterad Programmering (TDDC77)

Programmering i C++ EDA623 Typer. EDA623 (Föreläsning 4) HT / 33

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

Datastrukturer och algoritmer

Programmering A. Johan Eliasson

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

Digital- och datorteknik

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Transkript:

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

Pekare och Arrayer/VK 2

Pekare och Arrayer/VK 3

Förra föreläsningen Pekare Bll data Arrayer fix storlek och adress Dynamisk minnesallokering malloc() free() Fortsä'ning Pekare/VK 4

Pekare - sammanfa'ning Dvs, om a s värde är en adress, så är *a vad adressen innehåller. &a -> Adress till variabel a. Dvs minnesadress som a är lagrat i. a -> variabelns värde (t ex int, float eller en adress om a är pekarvaribel) *a -> Vad variabel a pekar på (här måste a's värde vara en giltig adress och a måste vara av typen pekare). a s värde är en adress till en annan variabel eller port. Vi hämtar värdet för den variabeln/porten. Exempel för pekarvariabel p: Adress för c: 0x5233 118 ('v')... *p är värdet som p pekar på, dvs 'v' char c = 'v'; char* p = &c; *p == c; Adress för p: 0x3026 p s värde 0x5233... Ökande adresser Fortsä'ning Pekare/VK 5

Pekare Bll pekare char *p1, *p2, *p3; char **pp; pp = &p1; Pointer Pointer Variable address address value // Annat exempel. Funktion som allokerar minne dynamiskt, t ex för elaka fiender i ett spel void allocateenemyarray(struct Enemy **pp, int n) *pp = (struct Enemy *)malloc(n * sizeof(struct Enemy)); *pp == penemies int main() struct Enemy *penemies = NULL; allocateenemyarray(&penemies, 100); // Game logic free(penemies); Ska funkbonen kunna uppdatera argumentet måste vi skicka in adressen för argumentet (istället för värdet på argumentet) Pekare och Arrayer/VK 6

Kul med pekare vad skrivs ut? #include <stdio.h> #include <conio.h> char * s1 = "Emilia"; // variabeln s1 är en variabel som går att ändra, och vid // start tilldelas värdet av adressen till 'E. char s2[] = "Roger"; // värdet på s2 känt vid compile time. s2 är konstant, dvs // ingen variabel som går att ändra. Är adressen till R. int main() printf("kul med pekare\n"); char **pp, *p = s1; pp = &p; printf("p = %s\n", p); // p == s1, så ekvivalent med att skicka s1 som argument. printf("*pp = %s\n", *pp); *pp = s2; // *pp ekvivalent med p. Ändrar p till s2 printf("p = %s\n", p); *p = 'T'; // (p == s2). *s2 ekv. med s2[0]. Ändrar s2[0] till T **pp = 'J'; // *pp ekv med p. p==s2. -> *s2 = J. Ändrar s2[0] till 'J *(*pp+2) = 'k'; // ändrar s2[2] till 'k printf("%s\n", p); (*pp)[0] = 'P'; // *pp ekv med p (== s2). s2[0]. Ändrar s2[0] till 'P' printf("%s\n", p); getch(); return 0; Fortsä'ning Pekare/VK 7

Array av pekare #include <stdio.h> char* fleranamn[] = "Emil", "Emilia", "Droopy"; int main() printf("%s, %s, %s\n", fleranamn[2], fleranamn[1], fleranamn[0]); return 0; Droopy, Emilia, Emil sizeof(fleranamn) = 12; // 3*sizeof(char*) = 3*4 = 12 Pekare och Arrayer/VK 8

Array av arrayer #include <stdio.h> char kortanamn[][4] = "Tor", "Ulf", "Per"; int main() printf("%s, %s, %s\n", kortanamn[2], kortanamn[1], kortanamn[0]); return 0; Per, Ulf, Tor Pekare och Arrayer/VK 9

Array av arrayer #include <stdio.h> int arrayofarrays[3][4] = 1,2,3,4, 5,6,7,8, 9,10,11,12 ; int main() int i,j; for( i=0; i<3; i++) printf("arrayofarray[%i] = ", i); for ( j=0; j<4; j++) printf("%i ", arrayofarrays[i][j]); printf("\n"); return 0; Fortsä'ning Pekare/VK 10

Pekare Bll portar och funkboner Denna föreläsning handlar om pekare Bll Portar FunkBoner Sammansa'a datatyper (struct) Fortsä'ning Pekare/VK 11

Absolutadressering Vid portadressering så kan vi ha en absolut adress (t ex 0x400). Fortsä'ning Pekare/VK 12

Absolutadressering 0x400 // ett hexadecimalt tal (unsigned char*)0x400 // en unsigned char pekare som pekar på adress 0x400 *((unsigned char*)0x400) // dereferens av pekaren // läser från 0x400 unsigned char value = *((unsigned char*)0x400); // skriver till 0x600 *((unsigned char*)0x600) = value; Fortsä'ning Pekare/VK 13

Läsbarhet med typedef typedef unsigned char* port8ptr; #define INPORT_ADDR 0x400 #define INPORT *((port8ptr)inport_addr) 0x400 (unsigned char*)0x400 *((unsigned char*)0x400) INPORT_ADDR (port8ptr)inport_addr INPORT // läser från 0x400 value = *((unsigned char*)0x400); // läser från 0x400 value = INPORT; typedef förenklar/förkortar u'ryck, vilket kan öka läsbarheten. typedef unsigned char* port8ptr; typ alias/typnamn Fortsä'ning Pekare/VK 14

VolaBle qualifier char * inport = (char*)0x400; void foo() while(*inport!= 0) //... En kompilator som opbmerar kanske bara läser en gång (eller inte alls om vi aldrig skriver Bll adressen från programmet). Fortsä'ning Pekare/VK 15

VolaBle qualifier volatile char * inport = (char*)0x400; void foo() while(*inport!= 0) //... volatile hindrar vissa opbmeringar (vilket är bra och här nödvändigt!), ty anger a' kompilatorn måste anta a' innehållet på adressen kan ändras ubfrån. Fortsä'ning Pekare/VK 16

Sammanfa'ning portar Inport: typedef volatile unsigned char* port8ptr; #define INPORT_ADDR 0x400 #define INPORT *((port8ptr)inport_addr) Utport: typedef volatile unsigned char* port8ptr; #define UTPORT_ADDR 0x401 #define UTPORT *((port8ptr)utport_addr) // läser från 0x400 value = INPORT; // skriver till 0x401 UTPORT = value; Fortsä'ning Pekare/VK 17

[portadressering i XCC12] Fortsä'ning Pekare/VK 18

FunkBonspekare #include <stdio.h> int square(int x) return x*x; int main() int (*fp)(int); En funkbonspekare fp = square; printf("fp(5)=%i \n", fp(5)); return 0; fp(5)=25 Fortsä'ning Pekare/VK 19

FunkBonspekare int (*fp)(int); FunkBonspekarens typ bestäms av: Returtyp. Antal argument och deras typer. FunkBonspekarens värde är en adress. Fortsä'ning Pekare/VK 20

Likheter assembler C utport EQU $400 start: ORG $1000 LDAA #1 loop_start: STAA utport JSR delay LSLA BEQ start BRA loop_start delay: LDAB #$FF loop_delay: DECB BNE loop_delay RTS int var1; void delay() Både funkboner och globala variabler har adresser i minnet, men vi använder symboler. unsigned char tmp = 0xFF; do tmp--; while(tmp); var1 RMB 2 Fortsä'ning Pekare/VK 21

FunkBonspekare exempel int(*print)(const char*, ); print = printf; Eller print = popupwindow; Objektorientering. Metoder: struct GfxObject float x,y; void (*render)(struct GfxObject* this); // renderingsfunktion för att rita // ut det här objektet på skärmen. struct GfxObject gfxobj[10]; for(int i=0; i<10; i++) gfxobj[i].render(&gfxobj[i]); Fortsä'ning Pekare/VK 22

[exempel på funkbonspekare] Fortsä'ning Pekare/VK 23

Sammansa'a datatyper En så kallad struct (från eng. structure) Har en/flera medlemmar. Medlemmarna kan vara av bas-typ (t ex int, float, char, double) egendefinerad typ (t ex en annan struct). Pekare (även Bll funkboner och samma struct) Fortsä'ning Pekare/VK 24

Användning av struct #include <stdio.h> char* kursnamn = Maskinorienterad Programmering"; struct Course char* name; float credits; int numberofparticipants; ; DefiniBon av strukturen Skriv ner en struct som innehåller några medlemmar, inkl en funkbonspekare och en annan struct! Checka med grannen, och ta hjälp av grannen om problem. int main() struct Course mop; mop.name = kursnamn; mop.credits = 7.5f; mop.numberofparticipants = 110; DeklaraBon av variabeln mop Access Bll medlemmar via.-operatorn return 0; Fortsä'ning Pekare/VK 25

IniBeringslista struct Course char* name; float credits; ; int numberofparticipants; struct Course kurs1 = "MOP", 7.5f, 110; struct Course kurs2 = "MOP", 7.5f; iniberingslista En struct kan iniberas med en iniberingslista. IniBeringen sker i samma ordning som deklarabonerna, men alla medlemmar måste inte iniberas. Fortsä'ning Pekare/VK 26

Pekare Bll struct (pilnotabon -> ) #include <stdio.h> char* kursnamn = Maskinorienterad Programmering"; struct Course char* name; float credits; int numberofparticipants; ; int main() struct Course *pmop; pmop = (struct Course*)malloc(sizeof(struct Course)); I Java: public class Course String name; float credits; int numberofparbcipants; Course mop = new Course(); mop.name = mop.credits = 7.5; (*pmop).name = kursnamn; pmop->name = kursnamn; pmop->credits = 7.5f; pmop->numberofparticipants = 110; Access Bll medlemmar via -> operatorn free(pmop); return 0; Fortsä'ning Pekare/VK 27

[struct-exempel] Fortsä'ning Pekare/VK 28

Länkade datastrukturer Ex. Länkad lista: Elementen ligger inte på konsekubva adresser, utan listans minnesstruktur bestäms av pekare. Fortsä'ning Pekare/VK 29

Enkellänkad lista head struct LinkedList int a; struct LinkedList *next; ; struct LinkedList *head = NULL; struct LinkedList* insert( struct LinkedList *head, struct LinkedList *node) // Stoppa in noden först i listan node->next = head; // Exempel på insättning av 100 noder i listan. int main() struct LinkedList *head = NULL; int i; for (i=0; i<100; i++) // Skapa ny nod struct LinkedList* node = (struct LinkedList*) malloc(sizeof(struct LinkedList)); // Initiera noden till något valfritt node->a = i; ; // för att uppdatera head return node; // Stoppa in noden i listan och peka head på // vår nya nod head = insert(head, node); return 0; Fortsä'ning Pekare/VK 30

Länkade datastrukturer Ex. Cyklisk dubbellänkad lista: Fortsä'ning Pekare/VK 31

head newnode node Dubbellänkad lista struct DLinkedList int a; struct DLinkedList *next, *prev; ; struct DLinkedList *head = NULL; struct DLinkedList* insert( struct DLinkedList *node, struct DLinkedList *newnode) // Hantera att node (dvs head) == 0 if (node == 0) node = newnode; node->prev = newnode; // Stoppa in vår newnode först i listan newnode->next = node; newnode->prev = node->prev; node->prev->next = newnode; node->prev = newnode; return newnode; ; // Exempel på insättning av 100 noder i listan. int main() struct DLinkedList *head = NULL; int i; for (i=0; i<100; i++) struct DLinkedList *node = (struct DLinkedList*) malloc(sizeof(struct DLinkedList)); node->a = i; head = insert(head, node); return 0; Fortsä'ning Pekare/VK 32

Länkade datastrukturer Ex. träd: Fortsä'ning Pekare/VK 33

LaboraBon 3 enkellänkad lista En lista av element som är Dynamiskt allokerade. En struct. Varje element innehåller En pekare Bll nästa element. En prioritet. En pekare Bll data (en sträng i de'a fall). Fortsä'ning Pekare/VK 34

Överkurs Type Union union int d; char c; float f; x; x.d = 4; x.c = 'i'; x.f = 3.0; typedef struct union float v[2]; struct float x,y;; ; Vec2f; Vec2f pos; pos.v[0] = 1; pos.v[1] = 2; pos.x = 1; pos.y = 2; &x.d == &x.c == &c.f d, c och f delar samma minnesadress. D v s samma minnesadress kan adresseras på tre olika sä' via tre olika variabelnamn. Exempel: pos.v[0] och pos.x är samma sak. pos.x visar tydligt a' det är x-koordinaten vi adresserar. pos.v[i] är dock användbart om vi vill skriva en loop över x- och y-koordinaten. Tex: void addvec(vec2f *a, Vec2f *b) for(i=0; i<2; i++) a->v[i] += b->v[i]; Fortsä'ning Pekare/VK 35