William Sandqvist Datorteknik övning 4 Maskinnära programmering med C inför hemlab 1.

Slides:



Advertisements
Liknande presentationer
INTRODUKTION TILL PROGRAMMERING
Advertisements

void hittaMax(int tal[], int antal, int *pmax) { int i; ??=tal[0]; for(i=1;i??) ??=tal[i]; } int main() { int v[]={1,2,3,4,2}; int.
Anders Sjögren Lagringsklasser •en variabel i C har två attribut –type( int, float, char..... ) –lagringsklass( auto, extern, register, static ) •lagringsklassens.
Programstruktur: C för enchipsdatorer
Funktioner och programorganisation
2D1311 Programmeringsteknik med PBL
De fundamentala datatyperna
#include void fun(char s[]) { int i=-1; while(s[++i]!=0) { if('a'
C-programmering ID120V William Sandqvist Länkad lista
Programmeringsteknik K och Media
Programmeringsteknik för K och Media
Föreläsning 13 Allt om tentan. Sistaminutenhjälp: På fredag 17 december kl 12 sitter Linda i kemi-fiket och svarar på frågor.
Föreläsning 6 Referenser Objekt som parametrar public/private Klassvariabler och klassmetoder.
i olika programmeringsspråk
Programmering B PHP Lektion 2
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser och instansvariabler -Tabeller av klassobjekt.
Föreläsning 11 Arrayer.
Sid 1 CD5250 OOP med C++ Daniel Flemström MDH/IDT CD5250 OOP med C++
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 6 ( ) INNEHÅLL: -Mera om tabeller.
Pekare och speciell programstruktur i inbyggda system
Pointers. int a=5; int f(int b) { a--; b++; return b; } int main() { int a=3; printf("%d,",f(a)); printf("%d",a); return 0; }
Programmering B PHP Lektion 2
Föreläsning 4 Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö.
Föreläsning 2 Kort Översikt Över Javaspråket. Källkodsformat Unicode används åäöμψζ tillåtna Inte alla miljöer klarar av det Källkod Bytekod Java VM för.
Vektorer (klassen Vector) Sortering
Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar.
William Sandqvist C:s minnesmodell.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 4 ( ) INNEHÅLL: -Logiska opertorer -Poster.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Klasser -Att definiera egna klasser -Klassvariabler -Klassmetoder.
Anders Sjögren Pekare. Anders Sjögren Skapa ett program som byter plats på två heltal Pekare.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 7 ( ) INNEHÅLL: -Metoder -Lokala variabler -Mera om klasser: -Nyckelorden.
1 Föreläsning 6 Programmeringsteknik och Matlab 2D1312/2D1305 Metoder & parametrar Array API och klassen ArrayList.
Namnrum, räckvidd och rekursion Linda Mannila
William Sandqvist Databuffer Omvandlar mellan olika storlekar på dataobjekt Anpassar mellan olika dataöverföringshastigheter Databuffer.
Föreläsning 1 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
INTRODUKTION TILL PROGRAMMERING
Programmering i C# 9. Pekare och osäker kod.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 2 ( ) INNEHÅLL: -Variabler och datatyper -Tilldelning av variabler -Aritmetiska.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 3 ( ) INNEHÅLL: -Tabeller -Villkorssatser -Repetitionssatser.
Jonny Karlsson INTRODUKTION TILL PROGRAMMERING Föreläsning 5 ( ) INNEHÅLL: -Metoder.
F4 - Funktioner & parametrar 1 Programmeringsteknik, 4p vt-00 Modularisering ”svarta lådor” Väl definierade arbetsuppgifter Enklare validering Enklare.
William Sandqvist C-programmering ID120V Stack och Kö William Sandqvist
Föreläsning 12 Om slutprovet. Repetition –deklaration av variabler –skapande av objekt (instansiering) –Vektorer och Vector-klassen –Klasser –Instans-/klassvariabler.
Språket för inbyggda system 2
INTRODUKTION TILL PROGRAMMERING
F6 - Pekare 1 Programmeringsteknik, 4p vt-00 Pekare & adresser Alla variabler är knutna till en viss adress i minnet int i; adressen till denna fås med.
F. Drewes, Inst. f. datavetenskap1 Föreläsning 9: Implementering av underprogram Aktiveringsposter Exekveringsstacken Implementera dynamisk räckvidd.
Anders Sjögren Deklarationsområde och funktioner.
Lennart Edblom & Frank Drewes, Inst. f. datavetenskap 1 Föreläsning 2: Variabler och datatyper Variabler Bindning Typkontroll Några viktiga datatyper.
ITM1 Kapitel 8 Datastrukturer Grundläggande datavetenskap, 4p Utgående från boken Computer Science av: J. Glenn Brookshear.
F2 1 Programmeringsteknik, 4p vt-00 Kommentarer Allt mellan /* och */ Varje kommentar byts ut mot en blank av kompilatorn /* Exempel på uttryck, tilldelningsoperatorn.
Föreläsning 5 Objekt Klasser Konstruktorer Metoder Minnesbilder av objekt.
William Sandqvist Funktionsbibliotek När man utvecklat en funktion så långt att den är "färdigutvecklad" kan man lika gärna spara den på.
Kronljusströmställaren 0, 1, 2, 3
William Sandqvist Datorteknik övning 1 Introduktion till assemblerprogrammering av Nios II William Sandqvist
Föreläsning 7 Repetition Sammansatta datatyper –vektor (hakvektor, array) –matris.
Anders Sjögren Data (i primärminnet) som en länkad lista datatypen för varje element i listan är en struktur, post ( struct )
1 Föreläsning 2 Reserverade ord Javas API Identifierare Litteraler Variabler Kompilering och interpretering.
Datorteknik övning 4 Maskinnära programmering med C inför hemlab 1
OOP&M - teori1 OOP – Föreläsning 7 (Sista oop I) Konstruktioner för att hantera upprepningar Kapitel 11.
Anders Sjögren Enkelt program med funktion /* two_func.c - a program that uses two functions in one file */ /* from Stephen Prata C Primer Plus ISBN
1 Föreläsning 4 Metoder & parametrar Array API och klassen ArrayList.
1 IS1200 Datorteknik, övning 4 Maskinnära programmering med C Förberedelser till hemlaboration 1.
William Sandqvist Datorteknik övning 3 stackhantering subrutin som anropar subrutin programutveckling.
Anders Sjögren Minnen, variabler, att lagra i primärminnet forts. Den här bilden känner ni igen sedan tidigare. Vi skall fortsätta att prata variabeltyper.
Språket för inbyggda system. C:s verktygslåda är välfylld! William Sandqvist
Anders Sjögren Programmering i ANSI-C Ett första program för att se vart vi ska...
William Sandqvist Övning 10 Processorkonstruktion med pipe-line.
Anders Sjögren Funktioner något in och något annat ut.
TDP004 Objektorienterad Programmering Fö 5 Minneshantering.
Presentationens avskrift:

William Sandqvist Datorteknik övning 4 Maskinnära programmering med C inför hemlab 1

William Sandqvist Assemblerprogram C In- och utmatning Avbrott och "trap" Cacheminnen Trådar, synkronisering CE F1 CE F3 CE F4 CE F5 CE F6 CE F7 CE F8 CE F9 CE F10 CE F2 CE Ö4 CE Ö1 CE Ö2 CE Ö3 CE Ö10 CE Ö7 CE Ö8 CE Ö9 CE Ö5CE Ö6 lab nios2time hemlab C lab nios2io lab nios2int hemlab cache hemlab trådar tentamen Datorteknik övning 4

William Sandqvist Formaterad utskrift printf() %d utskrift av heltalsvariabel %x utskrift av heltalsvariabel men hexadecimalt %f utskrift av flyttalsvariabel \n nyradstecken \t tabulatortecken För att använda printf() #include

William Sandqvist Hur många Byte är en int? #include int main(void) { printf("typ\t\tbytes\n"); printf("signed char \t%d\n", sizeof(char)); printf("unsigned char \t%d\n", sizeof(unsigned char)); printf("signed int \t%d\n", sizeof(int)); printf("unsigned int \t%d\n", sizeof(unsigned int)); printf("long \t\t%d\n", sizeof(long int)); printf("float \t\t%d\n", sizeof(float)); printf("double \t\t%d\n", sizeof(double)); system("PAUSE"); return 0; } det får man veta genom att köra ett testprogram på sin dator:

William Sandqvist 4.1 Endianess a)Förklara skillnaden mellan big-endian och little-endian. b)Vilket använder Nios-II?

William Sandqvist Endianess Datorminnen är Byteorienterade medan de flesta datatyperna består av flera Bytes. Antingen lagras den mest signifikanta Byten först (Big- endian) eller så lagras den minst signifikanta Byten först (Little-endian). Macintosh (Motorola), Sparc (Sun) … PC (Intel), VAX (Dec) … Bi-endian: Itanium (Intel) PA-RISC (HP) …

William Sandqvist J Swift endianess Termen ”endianess” kommer från Jonathan Swift’s Gullivers resor. De två kungadömena Lilleput och Blefuscu är i krig med varandra över en dispyt om vilken ända av frukostägget man ska knäcka! Lika välgrundade skäl ligger ofta bakom datateknikens olika ”standards” i vår tid … Internets överföringsstandard är big-endian som därför också kallas för Network order. /* Endianess test */ #include int main(void) { int a = 1; if( *( (char*)&a ) == 1) printf("Little Endian\n"); else printf("Big Endian\n"); system("PAUSE"); return 0; } (char*)&a adressen till a ändras från en ”int”-adress till en ”char”-adress.

William Sandqvist Nios II ? Nios II är Little endian ( men eftersom det är en softprocessor så kan endianessen lätt konfigureras om – dvs. den är bi-endian ).

William Sandqvist När har endianess betydelse? Endianessen har betydelse när två datorer kommunicerar med varandra, vid olika endianess måste en av datorerna kasta om Byte- ordningen ( vem är frivillig? ) = kr Vi skall skicka 16 miljoner kronor över internet: men om endianessen missförstås: = 1 kr Otur!

William Sandqvist 4.3 Adressrymd a)Rita en figur som illustrerar hur minnesrymden disponeras i Nios-II. Figuren skall visa områden för programkod (.text ), oinitialiserade data (.bss ), initialiserade data (.data ), samt heap och stack. b)Förklara begreppen oinitialiserade data, initialiserade data, heap och stack.

William Sandqvist C:s minnesmodell

William Sandqvist C:s minnemodell – var hamnar variabler? #include int a = 17; int main(void) { int b = 18; int * c; c = malloc( sizeof( int ) ); *c = 19; printf("a = %d at address %x\n", a, &a); printf("b = %d at address %x\n", b, &b); printf("c = %d at address %x\n", *c, c); free(c); system("PAUSE"); return 0; } Global variabel = Data segmentet Automatisk variabel = Stack Dynamisk variabel = Heap Återställ dynamiskt minne!

William Sandqvist Data-segmentet ”Globala” variabler, dvs variabler som deklarerats utanför programmets funktioner hamnar i datasegmentet. Initialiserade variabler förses med sina startvärden. Oinitialiserade variabler placeras för sig (.bss ), de kan då enkelt åtminstone 0-ställas. I datasegmentet kan också konstanter och strängkonstanter lagras. Datasegmentet är statiskt, variablerna upptar plats under hela programkörningen både när de används och när de inte används. Nackdelen med de globala variablerna är att de kan nås från alla funktioner. De kan vara både parametrar och returvärden på en och samma gång för alla funktioner som använder dem – på ett oöverskådligt sätt – som gjort för problem!

William Sandqvist Stacken När en funktion anropas så skapas en aktivitetspost på stacken. Den består av utrymme för funktionens parametrar och returvärde, samt de variabler som deklareras inuti funktionen ( = lokala variabler ). Nios-II är en registerrik processor och då ligger en del parametrar (upp till 4 st) och returvärdet i register. När en funktion avslutas så tas aktivitetsposten bort från stacken. Funktionen main() är speciell genom att den avslutas först när hela programmet kört klart. Dess aktivitetspost ligger kvar under programkörningen. main() aktivitetspost

William Sandqvist Automatiska variabler main() aktivitetspost main() anropar funktionen funk1(). En ny aktivitetspost skapas nu på stacken för den funktionens variabler. När funktionen kört klart returnerar den till main() och aktivitetposten tas bort. Funktionernas variabler på stacken kallas för automatiska variabler. Minnesutrymmet på stacken återanvänds av funktionerna och utnyttjas därmed effektivt. Nu anropas en annan funktion funk2(). Den funktionens aktivitetspost kan nu utnyttja samma minne på stacken. funk2()

William Sandqvist En funktion som genererar data array[] Antag att funktionen funk2() genererar data och lagrar dessa i en lokal array[] på stacken. Datat på stacken lever farligt! Om en ny funktion, funk3(), körs så skrivs datat över. Det behövs någon annan plats för datat. – Var skulle det kunna vara? Funktionen returnerar arrayens adress till main(), med hjälp av adressen kan main() nå och använda datat. array[] funk3()

William Sandqvist Heapen array[] funk2() Funktionen funk2() behöver lagra sina data någon annanstans. Den kan anropa C:s funktion malloc() för att få utrymme på heapen. funk2() returnerar nu arrayens adress till main(). Datat finns fortfarande kvar om en ny funktion funk3() ska köra. Minnesutrymmet frigörs när man anropar funktionen free(). free() Om C:s minneshanterare är bra skriven utnyttjas minnesutrymmet på heapen effektivt. funk3()

William Sandqvist pekare * adress & och avreferering * int b; Deklaration av heltalsvariabeln b. Plats reserveras. b = 18; Definition av variabeln b. Nu innehåller den talet 18. &b Adressoperatorn. Adressen till variabeln b. int * c; Deklaration av int-pekarvariabeln c. c = &b; Nu pekar c på b. *c Avrefereringsoperatorn. Det som c pekar på. *c = 19; Talet 19 lagras på den plats som c pekar ut. Nu innehåller b = 19. Kort om C-språkets pekare (repris) 18 ( ) 18 ( ) 19 ( )

William Sandqvist 4.4 Värden, pekare, referenser, heltalsvariabler Skriv programrader i C som visar hur * och & används i nedanstående exempel. Översätt varje exempel för hand till Nios-II-assembler. a) deklarera två globala heltalsvariabler a och b. b) initialisera b till värdet 27 i samband med deklarationen. c) deklarera två globala pekarvariabler ptr1 och ptr2 som kan peka på a och b. d) tilldela a värdet 4711 och b värdet 47. e) tilldela pekarvariabeln ptr1 ett värde så att den pekar på heltalsvariabeln a. f) tilldela heltalsvariabeln b samma värde som som a, med hjälp av ptr1. g) tilldela pekarvariabeln ptr2 ett värde så att den pekar på samma variabel som ptr1.

William Sandqvist a) b) c) a) deklarera två globala heltalsvariabler a och b..data.align 2 int a, b; a: word 0 b: word 0 b) initialisera b till värdet 27 i samband med deklarationen. c) deklarera två globala pekarvariabler ptr1 och ptr2..data.align 2 int a, b = 27; a: word 0 b: word 27.data.align 2 int a, b = 27; a: word 0 b: word 27 int * ptr1, * ptr2; ptr1: word 0 ptr2: word 0 minne

William Sandqvist d) tilldela a värdet 4711 och b värdet 47..text.align 2 movia r8,a # R8 = &a movi r9,4711 # R9 = 4711 stw r9,0(r8) # global a = 4711 movia r8,b # R8 = &b movi r9,47 # R9 = 47 stw r9,0(r8) # global b = 47 a = 4711; b = 47;

William Sandqvist e) tilldela pekarvariabeln ptr1 ett värde så att den pekar på heltalsvariabeln a. movia r8,ptr1 # R8 = &ptr1 movia r9,a # R9 = &a stw r9,0(r8) # global ptr1 = &a ptr1 = &a;

William Sandqvist f) tilldela heltalsvariabeln b samma värde som som a, med hjälp av ptr1. movia r8,ptr1 # R8 = &ptr1 movia r9,b # R9 = &b ldw r10,0(r8) # R10 = ptr1 ; &a ldw r11,0(r10) # R11 = a ; 4711 stw r11,0(r9) # global b = *ptr1 ; 4711 b = *ptr1;

William Sandqvist g) tilldela pekarvariabeln ptr2 ett värde så att den pekar på samma variabel som ptr1. movia r8,ptr1 # R8 = &ptr1 ldw r9,0(r8) # R9 = ptr1 movia r8,ptr2 # R8 = &ptr2 stw r9,0(r8) # global ptr2 = ptr1 ptr2 = ptr1;

William Sandqvist 4.5 Värden, pekare, referenser, char-variabler Skriv programrader i C som visar hur * och & används i nedanstående exempel. Översätt varje exempel för hand till Nios-II-assembler. a) deklarera två globala variabler av typen char. c och d. b) initialisera d till värdet 65 i samband med deklarationen. c) deklarera två globala pekarvariabler ptr3 och ptr4 som kan peka på c och d. d) tilldela c värdet ’M’ och d värdet 97. e) tilldela pekarvariabeln ptr3 ett värde så att den pekar på variabeln c. f) tilldela variabeln d samma värde som c, med hjälp av ptr3. g) tilldela pekarvariabeln ptr4 ett värde så att den pekar på samma variabel som ptr3. Vilka skillnader i Nios-II-assemblerkoden blir det jämfört med motsvarande operationer med heltalsvariabler?

William Sandqvist a) b) c).data.align 2 int a, b; a: word 0 b: word 0 a) deklarera två globala variabler av typen char. c och d. b) initialisera d till värdet 65 i samband med deklarationen. c) deklarera två globala pekarvariabler ptr3 och ptr4..data.align 2 int a, b = 27; a: word 0 b: word 27.data.align 2 char c, d = 65; c: byte 0 d: byte 65 char * ptr3, * ptr4; ptr3: word 0 ptr4: word 0

William Sandqvist d) tilldela c värdet ’M’ och d värdet 97..text.align 2 movia r8,c # R8 = &c movi r9,’M’ # R9 = ’M’ stb r9,0(r8) # global c = ’M’ movia r8,d # R8 = &d movi r9,97 # R9 = 97 stb r9,0(r8) # global d = 97 c = ’M’; d = 97;

William Sandqvist e) tilldela pekarvariabeln ptr3 ett värde så att den pekar på variabeln c. movia r8,ptr3 # R8 = &ptr3 movia r9,c # R9 = &c stw r9,0(r8) # global ptr3 = &c ptr3 = &c; Ingen större skillnad!

William Sandqvist f) tilldela variabeln d samma värde som som c, med hjälp av ptr3. d = *ptr3; movia r8,ptr3 # R8 = &ptr3 movia r9,d # R9 = &d ldw r10,0(r8) # R10 = ptr3 ; &c ldb r11,0(r10) # R11 = c ; ’M’ stb r11,0(r9) # global d = *ptr3 ; ’M’

William Sandqvist g) tilldela pekarvariabeln ptr4 ett värde så att den pekar på samma variabel som ptr3. movia r8,ptr3 # R8 = &ptr3 ldw r9,0(r8) # R9 = ptr3 movia r8,ptr4 # R8 = &ptr4 stw r9,0(r8) # global ptr4 = ptr3 ptr4 = ptr3; Ingen större skillnad!

William Sandqvist Hur stora är pekare? Det får man veta genom att köra ett testprogram på sin dator: #include int main(void) { printf("typ\tbytes\n"); printf("char pekare \t%d\n", sizeof(char *)); printf("int pekare \t%d\n", sizeof(int *)); printf("float pekare \t%d\n", sizeof(float *)); printf("double pekare \t%d\n", sizeof(double *)); printf("void pekare \t%d\n", sizeof(void *)); system("PAUSE"); return 0; }

William Sandqvist Vad är en void-pekare? char, int, float, double – pekare tar alla samma plats i minnet. Det som skiljer är hur stort adressteg som tas om man tex. ökar pekaren med 1. Den pekar då ut nästa av sin sort i minnet. En void-pekare är en reserverad minnesplats för en godtycklig pekarsort. Innan man använder pekaren måste den ”castas” (omvandlas) till önskad sort. Genom att använda void -pekare kan man skriva generella funktioner. Tex. kan funktionen Quicksort sortera ”vad som helst” genom att den är skriven för voidpekare. Typecast sker genom att man skriver den önskade data- typens namn i en parentes framför variabeln. float a; (int) a blir tillfälligt int (dvs bara heltals- delen räknas)!

William Sandqvist 4.6 Funktionen memcpy() C:s biblioteksrutin memcpy() har följande deklaration: void * memcpy(void * dest, const void * src, size_t len); Ett funktionsanrop kan se ut så här: int a[4711][4711], b[4711][4711];... (void *) memcpy( &b[0][0], &a[0][0], sizeof( a) ); a) Förklara vad en pointer till void är för något. b) Förklara de tre parametrarna till memcpy(). c) Förklara returvärdet från memcpy(). d) Förklara operatorn sizeof(). e) Förklara texten (void) vid anropet av memcpy(). f) Översätt funktionen memcpy() till Nios-II-assembler.

William Sandqvist Deklaration: void * memcpy(void * dest, const void * src, size_t len); Ett funktionsanrop kan se ut så här: int a[4711][4711], int b[4711][4711];... (void *) memcpy( &b[0][0], &a[0][0], sizeof( a) ); a:s totala storlek beräknas av sizeof() operatorn vid kompileringen. Datatypen size_t är den datatyp som sizeof() svarar med. b :s och a :s startadresser. Eftersom memcpy() skall returnera en voidpekare så ”castar” vi returvärdet till en sådan. (Man kan strunta i returvärdet). memcpy() brukar returnera det ursprungliga dest –värdet (?)

William Sandqvist memcpy() assemblerprogram memcopy: mov r8, r4 # src-pekare mov r9, r5 # dest-pekare mov r10, r6 # counter loop: ble r10, r0, out # kolla om klart fast: ldb r12, 0(r8) # läs en byte addi r8, r8, 1 # öka scr-pekare stb r12, 0(r9) # skriv en byte addi r9, r9, 1 # öka dest-pekare subi r10, r10, 1 # minska counter br loop # alt: bgt r10, r0, fast out: ret # vi struntar i returvärde... memcpy() kopierar byte för byte. Om man vet att arrayerna är word- aligned så kan man kopiera word för word – det går fyra gånger snabbare!

William Sandqvist Typecast av pekare Vi kan kopiera 16 bokstäver som 4 int – detta går snabbare ( om datorn har 32 bitars buss ). #include int main(void) { char text[16]="Hello my world!"; char array[16]; char * ptr1 = text; char * ptr2 = array; int i; for( i=0;i<4;i++) { *( ((int*)ptr2)++ ) = *( ((int*)ptr1)++ ); } printf("%s\n",array); system("PAUSE"); return 0; } Pekarna typecastas till int*, och då ökar steget från en Byte till 4 Byte!

William Sandqvist 4.7 Matriser Visa med en tydlig figur hur de 15 elementen i nedanstående matriser lagras i minnet vid körning av C-program. a)int a[3][5]; b) int b[5][3];

William Sandqvist a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] 3  5 matris matematik-index 3  5 matris C-index I minnet radvis.

William Sandqvist b[0][0] b[0][1] b[0][2] b[1][0] b[1][1] b[1][2] b[2][0] b[2][1] b[2][2] b[3][0] b[3][1] b[3][2] b[4][0] b[4][1] b[4][2] 5  3 matris matematik-index 5  3 matris C-index I minnet radvis.

William Sandqvist 4.8 C-version av puttime() void puttime( int * timeloc ); void puttime( int * timeloc ) { register int time = *timeloc; putchar(’\n’); putchar(’\r’); putchar( hexasc((time & 0xf000)>>12) ); putchar( hexasc((time & 0xf00)>>8) ); putchar(’:’); putchar( hexasc((time & 0xf0)>>4) ); putchar( hexasc(time & 0xf) ); }

William Sandqvist 4.9 Struct Skriv en C-kod som definierar lagring av en struct (datapost) tiger med de ingående delarna: namn, 13 tecken. Tex. ”tiger” (se nalle Puh). vikt, avrundat till hela kilogram. Tex 245 (som int). fart, snabaste i km/tim (som en float). langd, längd överallt, angiven i meter (som en float).

William Sandqvist struct tiger struct tiger { char namn[13]; int vikt; float fart; float langd; } ; sizeof( struct tiger); (13+3) = 28 int och float är word-aligned.

William Sandqvist 4.9 Struct Skriv en C-kod som definierar lagring av en struct (datapost) elephant med de ingående delarna: namn, 13 tecken. Tex. ”Dumbo” (se Disney). vikt, avrundat till hela kilogram. Tex 1243 (som int). oron, öronyta uppdelat på vänster och höger öra angivet i kvadratmeter (som två float)

William Sandqvist struct elephant struct oron { float left; float right; } ; struct elephant { char namn[13]; int vikt; struct oron oronarea; } ; sizeof( struct elephant); (13+3) ( ) = 28 int och float är word-aligned.

William Sandqvist Vektor circus[] Skriv C-kod som deklarerar en vektor, circus[], med plats för fyra elefanter. struct elephant circus[4];

William Sandqvist 4.10 Dynamisk minnesallokering Beskriv med ord, eller rita en figur, som illustrerar hur minne kan allokeras, avallokeras och återanvändas vid följande C-operationer: struct elephant * dumbo = malloc( sizeof( struct elephant)); //1 struct tiger * tiger1 = malloc( sizeof( struct tiger)); //2 free( dumbo); //3 struct tiger * tiger2 = malloc( sizeof( struct tiger)); //4 struct tiger * tiger3 = malloc( sizeof( struct tiger)); //5 free( tiger1); //6

William Sandqvist struct elephant * dumbo = malloc( sizeof( struct elephant)); //1 struct tiger * tiger1 = malloc( sizeof( struct tiger)); //2 free( dumbo); //3 struct tiger * tiger2 = malloc( sizeof( struct tiger)); //4 struct tiger * tiger3 = malloc( sizeof( struct tiger)); //5 free( tiger1); //6 dumbo tiger1tiger2 tiger3 Det är inte säkert att din malloc() gör precis så här!

C:s biblioteksfunktioner William Sandqvist C:s biblioteksfunktioner är generellt skrivna och använder därför oftast void-pekare som parametrar och för returvärden. Som exempel tar vi funktionen quicksort som storleks- sorterar element i en array för att visa hur man använder C:s biblioteksfunktioner. Sir C.A.R Hoare Turing award

Sortera element i en array qsort() i stdlib.h Wikipedia Quicksort William Sandqvist

Sorteringsfunktion Quick Sort Alla programmeringsspråk har inbyggda sorteringsfunktioner. C har funktionen qsort() som sorterar dataposterna i en array (eller structarray) i enlighet med en sorteringsordning som man själv specifierar. char alfa[5] = { ’C’, ’E’, ’A’, ’D’, ’F’, ’B’ }; qsort( (void*) alfa, 5, sizeof( char ), SorteringsOrdning ); Exempel, en array med fem bokstäver: Sorteras till: A, B, C, D, E, F om funktionen SorteringsOrdning() jämför alfabetiskt! Pekare till arrayen Antal element i arrayen Storlek på elementen i Bytes Funktionspekare, namnet på den sorteringsfunktion som skall användas

Sorteringsfunktionen William Sandqvist int Sorteringsordning( const void * a, const void * b) { if ( *((char *)a) < *((char *)b) ) return -1 ; else if ( *((char *)a) > *((char *)b) ) return 1 ; else return 0 ; } QSORT arbetar med void-pekare, och kan därför användas till att sortera vad som helst i arrayer. Sorteringsfunktionen, som man skriver själv och som QSORT sedan använder, skall alltid returnera -1, +1, eller 0 om parameter b är före, efter, eller samma som parameter a. På så sätt kan man sortera arrayen efter valfri egenskap.

#include int SorteringsOrdning( const void *, const void *); int main(void) { int i; char alfa[6] = { ’C’, ’E’, ’A’, ’D’, ’F’, ’B’ }; qsort( (char*)alfa, 6, sizeof(char), SorteringsOrdning ); for (i=0 ; i<5 ; i++) // now in order? printf("\nbokstav %d = %c",i, alfa[i]); printf("\n"); system("PAUSE"); return 0; } int SorteringsOrdning( const void* a, const void* b) { if ( *((char*)a) < *((char*)b) ) return -1 ; else if ( *((char*)a) > *((char*)b) ) return 1 ; else return 0 ; } Inte i alfabetisk ordning! Nu alfabetiskt sorterat?

William Sandqvist

typedef struct elephant typedef struct { float left; float right; } oron ; typedef struct { char namn[13]; int vikt; oron oronarea; } elephant ; Man kan skapa egna Datatyper … Från och med nu finns det en datapost av typen elephant

Delminnen Så här når vi delminnen: elephant dumbo; elephant * pek = &dumbo; dumbo.oron.right = 0.25; pek->oron.left = 0.36;. punktoperator -> piloperator William Sandqvist

Vektor circus[] deklarerar en vektor, circus[], med plats för fyra elefanter. elephant circus[4]; circus circus[2].oron.left = 0.56;

William Sandqvist Indexarray index[] elephant * index[4]; index index[2]-> oron.left = 0.56; deklarerar en vektor, index[], med plats för fyra elefant-pekare.

Hur sorterar man elefanter? Genom att sortera pekarna – inte gärna genom att flytta på elefanterna! William Sandqvist

Pekare till pekare Index Qsorts void-pekare blir ”pekare till pekare” William Sandqvist Dubbelpekare: elephant** pek = &Index[2]; Dubbel avreferering: (**pek).oronarea.left = 0.56;

qsort((void* ) Index, 4, sizeof(elephant* ), SortOrdning ); Qsort - elefanter William Sandqvist Pekare till arrayen Antal element i arrayen Storlek på elementen i Bytes Funktionspekare, namnet på den sorteringsfunktion som skall användas

Sorteringsfunktion med dubbelpekare // Sorted by weight int SortOrdning( const void* a, const void* b) { if((**((elephant** )a)).vikt (**((elephant** )b)).vikt ) return 1 ; else return 0 ; } elephant* Index[4]; for(i=0;i<4;i++) Index[i]= (elephant* )malloc(sizeof(elephant)); qsort((void* ) Index, 4, sizeof(elephant* ), SortOrdning );

Programexempel Se programexemplet från kursen ID120V Elefantpekare sorterade efter elefanternas vikter ( eller med en annan sorteringsfunktion, efter elefanternas vänsteröron ). William Sandqvist

Ex. Medianfilter William Sandqvist Ett medianfilter tar hela tiden fram det till storleken ”mittersta” värdet av löpande mätvärden. Man behöver då kunna ”storlekssortera” mätvärden – kanske med quick-sort! (om det nu inte funnes bättre och anpassade algoritmer) Brus-störningar undertrycks extremt bra med ett sådant filter. Ex. varje pixel har ersatts med medianvärdet av de pixlar som finns inuti en cirkel (eller kvadrat) med pixlet som centrum.