Title: Formaterad utskrift printf()
1Formaterad 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 ltstdio.hgt
2Inmatning med scanf()
int a scanf(d, a)
Inmatning av ett heltal till variabeln a.
Formatsträngen fungerar här på samma sätt som för
printf(). Avsluta inmatningen med retur.
Adressoperatorn a betyder adressen till a.
scanf() lägger det inmatade talet på as adress.
(Dvs. i a).
printf(Variable a d at the hex address
x\n, a, a)
För att använda scanf() include ltstdio.hgt
3Adressoperatorn
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 malloc( sizeof(int)
) Nu innehåller c en int-adress till en
ledig plats. c Avrefereringsoperatorn. Det som
c pekar på. c 19 Talet 19 lagras på den
plats som c pekar ut. free(c) Int-adressen
lämnas tillbaka.
4Cs minneskarta
- Kod-segmentet innehåller programmets körbara
kod - Data-segmentet innehåller variabler som är
globala samt programkonstanter - Stack-segmentet innehåller Automatiska
variabler. Funktionernas parametrar, returvärden
och lokala variabler. - Heap-segmentet innehåller dynamiska variabler
skapade under programkörningen.
Begreppen Stack och Heap (två olika högar)
tillhör dataområdets allmänbildning!
5Cs minneskarta var hamnar variabler?
include ltstdio.hgt 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!
6Data-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!
7Stacken
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 ). 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.
8Automatiska variabler
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.
Nu anropas en annan funktion funk2(). Den
funktionens aktivitetspost kan nu utnyttja samma
minne på stacken.
main() aktivitetspost
Funktionernas variabler på stacken kallas för
automatiska variabler. Minnesutrymmet på stacken
återanvänds av funktionerna och utnyttjas därmed
effektivt.
9En funktion som genererar data
Antag att funktionen funk2() genererar data och
lagrar dessai en lokal array på stacken.
Funktionen returnerar arrayens adress till
main(), med hjälp av adressen kan main()nå och
använda datat.
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?
10Heapen
Funktionen funk2() behöver lagra sina data någon
annanstans.
Den kan anropa Cs 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().
Om Cs minneshanterare är bra skriven utnyttjas
minnesutrymmet på heapen effektivt.
11Hur stora är pekare?
Det får man veta genom att köra ett testprogram
på sin dator
include ltstdio.hgt int main(void)
printf("typ\tbytes\n") printf("char pekare
\td\n", sizeof(char )) printf("int pekare
\td\n", sizeof(int )) printf("float pekare
\td\n", sizeof(float )) printf("double
pekare \td\n", sizeof(double )) printf("void
pekare \td\n", sizeof(void ))
system("PAUSE") return 0
12Vad ä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 kommer att räknas)!
13Endianess
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)
14J Swift endianess
Termen endianess kommer från Jonathan Swifts
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.
(char)a adressen till a ändras från en
int-adress till en char-adress.
/ Endianess test / include ltstdio.hgt int
main(void) int a 1 if( ( (char)a )
1) printf("Little Endian\n") else printf("Big
Endian\n") system("PAUSE") return 0
15Nä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? ).
Otur!
16Array ( vektor, matris )
include ltstdio.hgt int main(void) int temp1,
temp2, temp3, temp4, temp5 printf("Ge
temperatur --gt ") scanf("d",temp1)
printf("Ge temperatur --gt ") scanf("d",temp2)
printf("Ge temperatur --gt ")
scanf("d",temp3) printf("Ge temperatur --gt
") scanf("d",temp4) printf("Ge temperatur
--gt ") scanf("d",temp5) printf("\ntemp 1
d", temp1) printf("\ntemp 2 d", temp2)
printf("\ntemp 3 d", temp3) printf("\ntemp
4 d", temp5) printf("\ntemp 5 d\n",
temp5) system("PAUSE") return 0
ett klumpigt program
17Vi behöver indexerade variabler!
include ltstdio.hgt int main(void) int
temp5 int i for(i1 ilt5 i)
printf("Ge temperatur d --gt ",i)
scanf("d",tempi-1) for (i1 ilt5
i) printf(\ntemp d d",i, tempi1)
printf("\n") system("PAUSE") return 0
En array deklareras!
18Beteckningar
int temp5
Namnet på arrayen är samma sak som adressen till
arrayen!
Adress, konstant pekare Pekare, minnesutrymme
som kan lagra adresser Minnesutrymme, variabel
19pekare adress och avreferering
Kort om C-språkets pekare
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.
( )
( )
( )
20Index- och pekarstegning
for (i0 ilt5 i) printf("d\td\n",i,
tempi )
Indexstegning
Pekarstegning
int Pek temp for (i0 ilt5 i)
printf("d\td\n",i ,Pek )
21Strängar, char array
En sträng är en char array som avslutats med
strängslutstecknet \0. ASCII nr 0.
char strH,e,l,l,l,o,??,w,o,
r,l,d,!,\0
Eller mer rakt på sak
char strHello world!
OBSERVERA! if(str1 str2) betyder att str1 och
str2 har samma adress, inte att strängarna har
samma innehåll! Strängar jämförs i stället med
funktionen strcmp().
22Typecast av pekare
Vi kan kopiera 16 bokstäver som 4 int detta går
snabbare (om datorn har 32 bitars buss).
include ltstdio.hgtint main(void) char
text16"Hello my world!" char array16
char ptr1 text char ptr2 array int
i for( i0ilt4i) (
((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!
23Strukturer - "struct", post
- I en array så är alla "delminnen" av samma typ
- antag att man vill samla flera olika slags
minnen under ett "tak", ett variabelnamn - som t ex att en bank vill lagra fakta om konton
- Kontonummer
- Efternamn
- Förnamn
- Kontoställning
- Adress
- Postnummer
24struct
typedef struct int number
char lastname20
char firstname20 int saldo
char adress20
int zip konto
Från och med nu finns det en ny datatyp med
namnet konto. Man kan deklarera variabler som
konto. Delarna i variabeln når man med
punktoperatorn .. konto a a.number 125678
a.lastname Sandqvist a.firstname
William
Har man en pekare till structen når man i stället
delarna med pilopera-torn -gt konto peka
a peka-gtnumber 125678
25struct array
konto sthlm5 sthlm3.zip 16868
Här lagrar vi fem bankkonton. Vi går in i kontot
4 (index börjar på 0) och lägger dit postnumret.
En array ligger i sammanhängande minne
S Burd, Systems Architecture ISBN 0-619-21692-1
Figure 3-8
26Sortera element i en array
qsort() i stdlib.h
Wikipedia Quicksort
27Sorteringsfunktion 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.
Exempel, en array med fem bokstäver
char alfa5 C, E, A, D, F, B
qsort( (void) alfa, 5, sizeof( char ),
SorteringsOrdning )
Sorteras till A, B, C, D, E, F om funktionen
SorteringsOrdning() jämför alfabetiskt!
28Sorteringsfunktionen
int Sorteringsordning( const void a, const void
b) if ( ((char )a) lt ((char )b) )
return -1 else if ( ((char )a) gt ((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.
Arrayer är således lätta att sortera!
29Länkad lista
- En länkad lista är dynamisk. Det innebär att den
enkelt kan öka och minska i storlek efter behov,
till skillnad från till exempel en array, som har
en fix storlek. I en länkad lista kan även
element läggas till och tas bort i mitten.
typedef struct konto int
number char lastname20 char
firstname20 int saldo char
adress20 int zip struct
konto next konto
S Burd, Systems Architecture ISBN 0-619-21692-1
Figure 3-11
next är pekaren till nästa kontopost!
30Länkad lista i minnet
En länkad lista lagras inte sammanhängande i
minnet
S Burd, Systems Architecture ISBN 0-619-21692-1
Figure 3-10
Den här listan vill man inte gärna sortera!
31Länkad lista i C
include ltstdio.hgt typedef struct lista
char character struct lista
next lista int main(void) char
c lista Ptr, listPtr / Länkad lista
med bokstäverna A B C D E byggs enklast bakifrån
E D C B A / listPtr NULL for(c'E'c
gt'A'c--) / Räkna med bokstäver i for-loopen!
/ / använd
Heap-minne till listelementen / Ptr
(lista ) malloc(sizeof( lista ))
Ptr-gtnext listPtr Ptr-gtcharacter c
listPtr Ptr / utskrift av
listan / Ptr listPtr do
printf("c", Ptr-gtcharacter) Ptr
Ptr-gtnext while(Ptr ! NULL)
printf("\n") system("PAUSE") return 0
Här borde man återlämnat Heap-minnet med free()
det fixar operativsystemet.
32Hur byter man plats på två element?
- Byt plats på tredje och fjärde elementen (C,D)
- c (( listPtr-gtnext)-gtnext)-gtcharacter
- (( listPtr-gtnext)-gtnext)-gtcharacter
- ((( listPtr-gtnext)-gtnext)-gtnext)-gtcharacter
- ((( listPtr-gtnext)-gtnext)-gtnext)-gtcharacter
c
Länkade listor är svårare att sortera!
33Indexarray
typedef struct int number char
lastname20 char firstname20 int
saldo char adress20 int zip
konto konto index20
S Burd, Systems Architecture ISBN 0-619-21692-1
Figure 3-15
En indexarray innehåller pekare till posterna.
Behöver man sortera posterna räcker det med att
sortera index, lika enkelt som att sortera en
vanlig array. Ex. tredje postens saldo ska vara
100 index2-gtsaldo 100
34Sortera index
Man sorterar inte länkade listor. Däremot behöver
man kunna sortera vilken ordning man vill
bearbeta, eller skriva ut, posterna. Om man
lagrar pekarna till posterna i en array
(indexarray) så kan pekarna sorteras utan att
posterna behöver flyttas i minnet. Sorteringsfunk
tionen använder pekarna med piloperatorn -gt för
att nå valfri delpost att sortera utifrån.
35Hur sorterar man elefanter?
Genom att sortera pekarna inte gärna genom att
flytta på elefanterna!
36(No Transcript)
37Dubbellänkad lista
- en dubbellänkad lista kan genomsökas lika
effektivt i bägge riktningarna. - men nackdelen är att posterna innehåller två
pekare som måste uppdateras.
S Burd, Systems Architecture ISBN 0-619-21692-1
Figure 3-13
38Klasser och Objekt
Objektorienterade programspråk, som tex, Java,
använder klasser. En klass innehåller både data
och (pekare till) de funktioner (metoder), som
bearbetar data. Ett objekt är ett exemplar av
klassen. Tex. klassen konton har som objekt
ett specifikt konto.
S Burd, Systems Architecture ISBN 0-619-21692-1
Figure 3-16