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

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

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

TDDC76 - Programmering och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

Repetition C-programmering

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

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

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

Introduktion C-programmering

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

TDDC76 - Programmering och Datastrukturer

2 Pekare och dynamiska variabler.

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

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

Poster ( structar ) Postdeklarationer

LEU240 Mikrodatorsystem

Tommy Färnqvist, IDA, Linköpings universitet

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

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

*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

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

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

Att använda pekare i. C-kod

Föreläsning 10. Pekare (Pointers)

Datastrukturer. föreläsning 3. Stacks 1

TDIU01 - Programmering i C++, grundkurs

Tentamen med lösningsförslag

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

Det finns många flaggor till g++,

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

4 Sammansatta datatyper

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen *:58/ID100V Programmering i C Exempel 3

TDDC77 Objektorienterad Programmering

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

Ö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.

Tentamen med lösningsförslag

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

tentaplugg.nu av studenter för studenter

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

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

Föreläsning 6: Introduktion av listor

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

Länkade strukturer, parametriserade typer och undantag

Enkla datatyper minne

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

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

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

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.

PROGRAMMERING-Java Omtentamina

Exempel ( )

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

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

Digital- och datorteknik

F5: Högnivåprogrammering

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

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

F5: Högnivåprogrammering

Assemblerprogrammering för ARM del 3

TDIU01 - Programmering i C++, grundkurs

Listor. Koffman & Wolfgang kapitel 2, avsnitt , och 2.9

Pekare och arrayer. Indexering och avreferering

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

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

Tillämpad programmering

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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

F4. programmeringsteknik och Matlab

Programmering A. Johan Eliasson

Datastrukturer och algoritmer

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

Exempelsamling Assemblerprogrammering

Föreläsning 5: Introduktion av pekare

Arrays (indicerade variabler) Föreläsning 6

Objektorienterad Programmering (TDDC77)

Föreläsning 4 Innehåll

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

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

Föreläsning 11. Strängar

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

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

TDIU01 Programmering i C++

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

Indexerade variabler

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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 &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) Exempel för pekarvariabel p: Adress Bll c: 0x5233 118 ('v')... Värdet som p pekar på, dvs 'v' char c = 'v'; char* p = &c; Adress Bll 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)); int main() struct Enemy *penemies = NULL; allocate(&penemies, 100); // Game logic free(penemies); 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); printf("*pp = %s\n", *pp); *pp = s2; // ändrar p till s2 printf("p = %s\n", p); *p = 'T'; // ändrar s2[0] till T **pp = 'J'; // ändrar s2[0] till 'J *(*pp+2) = 'k'; // ändrar s2[2] till 'k printf("%s\n", p); (*pp)[0] = 'P'; // ä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 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

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

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 23

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; DefiniBon av strukturen DeklaraBon av variabeln mop Access Bll medlemmar via.- operatorn return 0; Fortsä'ning Pekare/VK 24

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 25

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

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

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

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 29

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

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 31

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

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 33

ÖVERKURS Type Union union int d; char f; ; d = 4; f = 'i'; d och f delar samma minnesadress. D v s samma minnesadress kan adresseras på två olika sä' via två olika variabelnamn. 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; 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 34