Programmeringsspråket C Del 3

Like dokumenter
Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Dagens tema C, adresser og pekere

Ark 3 av 26. printf("i adresse %08x ligger b med verdien %d.\n", &b, b); printf("i adresse %08x ligger a med verdien %d.

Dagens tema INF1070. Signaturer. Typekonvertering. Pekere og vektorer. struct-er. Definisjon av nye typenavn. Lister

Pekere og vektorer. Dagens tema. I C gjelder en litt uventet konvensjon:

Dagens tema. Det siste om C Pekere og vektorer. Pekere til pekere. Vanlige pekerfeil. struct-er og typedef. Lister. Feilsøking

Dagens tema. Adresser som parametre Dynamisk allokering Signaturer Definisjon av nye typenavn Typekonvertering Pekere og vektorer

Signaturer. Dagens tema. En vanlig feil int-funksjon. Dette kan noen ganger gi rare feilmeldinger: INF1070 INF1070 INF1070 INF1070

IN 147 Program og maskinvare

Dagens tema: Datastrukturer

Vektorer. Dagens tema. Deklarasjon. Bruk

Dagens tema INF1070. Vektorer (array er) Tekster (string er) Adresser og pekere. Dynamisk allokering

Programmeringsspråket C Del 2

Programmeringsspråket C Del 3. Michael Welzl

Dagens tema. Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere

IN 147 Program og maskinvare

IN 147 Program og maskinvare

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Dagens tema INF2270. Signaturer. Typekonvertering. Pekere og vektorer. struct er. Definisjon av nye typenavn. Lister. Info om C

Dagens tema INF1070. Vektorer (array-er) Tekster (string-er) Adresser og pekere. Dynamisk allokering

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

IN 147 Program og maskinvare. Vanlige feil ved bruk av pekere Feilsøking Debuggere

Dagens tema. Dynamisk allokering Signaturer Definisjon av typer og nye typenavn Typekonvertering Pekere, vektorer og lister Dokumentasjon

Del 1 En oversikt over C-programmering

Dagens tema INF1070. Info om C. Cs preprosessor. Feilsøking. Dag Langmyhr,Ifi,UiO: Forelesning 31. januar 2005 Ark 1 av 29

Informasjon om C. Dagens tema INF1070 INF1070 INF1070 INF1070. Den viktigste kilden til informasjon om C (utenom en god. C-funksjonene.

Programmeringsspråket C Del 3. Hans Petter Taugbøl Kragset

Programmeringsspråket C

Dagens tema. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

IN 147 Program og maskinvare

IN 147 Program og maskinvare

Del 4 Noen spesielle C-elementer

Dagens program. Operativsystemer Prosesser og systemkall i UNIX Hente prosessens nummer Starte prosesser Vente på prosesser Utføre programmer

Signaturer. Dagens tema

Nybegynnerkurs i C. Øyvind Grønnesby. 14. oktober Introduksjon Typer Operatorer Kontrollstrukturer Pekere Makroer Lenker

Programmeringsspråket C Del 2. Michael Welzl

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Kapittel 1 En oversikt over C-språket

Runtimesystemer Kap 7 - I

IN 147 Program og maskinvare. Dagens tema

Dagens tema: Kjøresystemer II

Programmeringsspråket C

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Litt om Javas class-filer og byte-kode

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Programmeringsspråket C

INF225 høsten 2003 Prosjekt del 4: kodegenerering

Versjon (vil bli endret).

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

Dagens tema. Perl: Mer om regulære uttrykk Filer Lister og tabeller Kompilering og interpretering (kapittel ) IN 211 Programmeringsspråk

Programmering i C++ Løsningsforslag Eksamen høsten 2005

Oversikt. Introduksjon Kildekode Kompilering Hello world Hello world med argumenter. 1 C programmering. 2 Funksjoner. 3 Datatyper. 4 Pekere og arrays

Dagens tema: Enda mer MIPS maskinkode

Lenkelister. Lister og køer.

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Kort om meg. INF1000 Uke 2. Oversikt. Repetisjon - Introduksjon

Grunnleggende Datastrukturer

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Stack. En enkel, lineær datastruktur

2 Om statiske variable/konstanter og statiske metoder.

Velkommen til INF1010

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Debugging. Tore Berg Hansen, TISIP

Bakgrunnen for INF2100. Velkommen til INF2100. Prosjektet. Hva gjør en kompilator?

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

2 Om statiske variable/konstanter og statiske metoder.

Debuggere En «debugger» er et meget nyttig feilsøkingsverktøy. Det kan analysere en program dump, Dagens tema INF1070 INF1070 INF1070 INF1070

Velkommen til INF2100

Dagens tema INF2270. Cs preprosessor. Separat kompilering av C funksjoner. C og minnet. Dag Langmyhr,Ifi,UiO: Forelesning 5. februar 2007 Ark 1 av 15

Programmeringsspråket C Del 2. Hans Petter Taugbøl Kragset

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

Cs preprosessor. Dagens tema. Betinget kompilering

Velkommen til INF Introduksjon til operativsystemer og datakommunikasjon

Oversikt. INF1000 Uke 2. Repetisjon - Program. Repetisjon - Introduksjon

Runtimesystemer Kap 7 - I

Velkommen til INF2100 Jeg er Dag Langmyhr

Innlevering 2b i INF2810, vår 2017

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Semantisk Analyse del III

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

IN 147 Program og maskinvare

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Overflows. Building Secure Software. Inf 329, Høst Chapter 7. Lars Skjærven

Kjøresystemer. Hva er et kjøresystem? Den abstrakte maskinen SIMPLESEM (2.6) Klassifisering av språk: Parametre (2.7.7) Statiske språk (

Sist gang (1) IT1101 Informatikk basisfag. Sist gang (2) Oppgave: Lenket liste (fysisk) Hva menes med konseptuelt og fysisk i forb med datastrukturer?

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Pensumoversikt - kodegenerering. Kap. 8 del 1 kodegenerering INF5110 v2006. Hvordan er instruksjonene i en virkelig CPU? Arne Maus, Ifi UiO

Transkript:

Programmeringsspråket C Del 3 Michael Welzl E-mail: michawe@ifi.uio.no 8/25/10 inf1060 1

Dynamisk allokering Ofte trenger man å opprette objekter under kjøringen i tillegg til variablene. Standardfunksjonen malloc ( memory allocate ) benyttes til dette. Parameter er antall byte den skal opprette; operatoren sizeof kan gi oss dette. Vi må ha med stdlib.h for at malloc skal fungere skikkelig. Frigivelse av objekter: Når objekter ikke trengs mer, må de gis tilbake til systemet med funksjonen free: 8/25/10 inf1060 2

Et eksempel Anta at vi skal lese et navn (dvs. en tekst) og skrive det ut. For at navnet ikke skal oppta plass når vi ikke trenger det, bruker vi dynamisk allokering. 8/25/10 inf1060 3

Lagring av data Det er fire hovedteknikker for å lagre data: Vektor (matrise, array ) benyttes når det er naturlig å gi hvert element et identifikasjonsnummer. Eksempel: Opptelling av forekomster av tegn i en fil. Stakk ( stack ) er til mellomlagring når yngste element skal hentes først. (LIFO = Last in, first out ) Eksempel: Snu sifrene i et heltall ved utskrift. Kø ( queue ) er til mellomlagring når eldste element skal hentes først. (FIFO = First in, first out ) Eksempel: Kø av utskrifter til en skriver. Liste ( list ) er mest fleksibel; den omtales senere. 8/25/10 inf1060 4

Stakker Man bruker en peker til å peke på øverste element. Anta at vi bruker sp som stakkpeker og at stakken er tom. 8/25/10 inf1060 5

Man kan nå legge en verdi på stakken ( push-e en verdi) ved å utføre: Status er da: Etter å ha lagt totalt fire ulike verdier på stakken, har vi denne situasjonen: 8/25/10 inf1060 6

Verdien øverst på stakken kan hentes tilbake ( pop-es ) med: Gjør vi dette to ganger, er status: Nå ligger det to tall på stakken: 31 (øverst) og 18. Selv om de andre verdiene stadig ligger i minnet, er de logisk sett ikke lenger på stakken. 8/25/10 inf1060 7

Køer Man kunne ha implementert køer slik: Ringbuffere Det er bedre å bruke ringbuffere. Ingen høynivåspråk har noen tilsvarende struktur. Pekerne forteller hvor neste element skal inn, og hvor man kan finne neste element som skal ut. 8/25/10 inf1060 8

Implementasjon: En ringbuffer implementeres ved å klippe den opp og lagre den i en vektor: 8/25/10 inf1060 9

Innsetting og henting fra ringbufferet: 8/25/10 inf1060 10

Et eksempel: Det finnes et nyttig Unix-program med navn tail som skriver ut de ti siste linjene i en fil. 8/25/10 inf1060 11

8/25/10 inf1060 12

Noe forklaring: Følgende C-elementer har ikke vært nevnt før: Setningen break hopper ut av nærmeste løkke (eller switch-setning). Løkken while(1) {... } vil dermed gjentas inntil det utføres en break inni den. Funksjonen fgets leser en hel linje; parametrene er: 1) en peker til en char-vektor med plass til linjen, 2) antall tegn det er plass til i nevnte vektor og 3) filen (stdin er standard inn-fil dvs tastaturet). 8/25/10 inf1060 13

Pekere og vektorer I C gjelder en litt uventet konvensjon: Bruk av et vektornavn gir en peker til element nr. 0: int a[88];...... a &a[0] Når en vektor overføres som parameter, er det altså en peker til starten som overføres. 8/25/10 inf1060 14

Følgende to funksjoner er derfor fullstendig ekvivalente: 8/25/10 inf1060 15

Nok en konvensjon: Enda en uventet konvensjon: Aksess av vektorelementer kan også uttrykkes med pekere: a[i] *(a+i) Det er altså det samme om vi skriver a[3] eller *(a+3). 8/25/10 inf1060 16

Regning med pekere Dette er greit om a er en char-vektor, men hva om den er en long som trenger 4 byte til hvert element? Egne regneregler for pekere: C har egne regneregler for pekere: p+i betyr Øk p med i multiplisert med størrelsen av det p peker på. 8/25/10 inf1060 17

Programmet: Gir følgende resultat når det kjøres: 8/25/10 inf1060 18

Pekere til pekere til... Noen ganger trenger man en peker til en pekervariabel, for eksempel fordi den skal overføres som parameter og endres. Siden vanlige pekere deklareres som: Må en peker til en peker angis som: Dette kan utvides med så mange stjerner man ønsker. 8/25/10 inf1060 19

Eksempel: Omgivelsesvariable i Unix inneholder opplysninger om en bruker og hans eller hennes preferanser: Omgivelsen overføres nesten alltid fra program til program ved en global variabel: 8/25/10 inf1060 20

Eksempel (forts.) Pekeren environ peker på en vektor av pekere som hver peker på en omgivelsesvariabel og dens definisjon: 8/25/10 inf1060 21

Vanlige pekerfeil: Det er noen feil som går igjen: Det allokerte objektet vil nå være utilgjengelig, men vil flyte rundt og oppta plass så lenge programmet kjører. Dette kalles en hukommelseslekkasje. 8/25/10 inf1060 22

Vanlige pekerfeil (forts.) 8/25/10 inf1060 23

Enda en vanlig pekerfeil: 8/25/10 inf1060 24

Struct-er i C 8/25/10 inf1060 25

Deklarasjon og bruk av struct-variable Struct-variable brukes ellers som i Simula og Java: Bruk av struct-variable: 8/25/10 inf1060 26

Typedefinisjoner Nå kan ul og str_a brukes i deklarasjoner på lik linje med int, char etc. 8/25/10 inf1060 27

Pekere til struct-er 8/25/10 inf1060 28

Lister Enkle lister Operasjoner på lister Fordelene med lister: Dynamiske; plassforbruk tilpasses under kjøringen. Fleksible; innbyrdes rekkefølge kan lett endres. Generelle; kan simulere andre strukturer. Ulemper med lister: Det kan lett bli en del leting, slik at lange lister kan være langsomme i bruk. 8/25/10 inf1060 29

En enkel liste: Listepekeren liste peker på første element. Denne listen kan simulere: - Stakker - Køer - Prioritetskøer 8/25/10 inf1060 30

Konvensjon: 8/25/10 inf1060 31

Operasjoner på lister 8/25/10 inf1060 32

Operasjoner på lister (forts.) 8/25/10 inf1060 33

Innsetting sist i listen (forts.): Dette kan gjøres raskere hvis vi alltid har en peker til siste element. 8/25/10 inf1060 34

Operasjoner på lister (forts.) 8/25/10 inf1060 35

Debuggere En debugger er et meget nyttig feilsøkingsverktøy. Det kan: analysere en program-dump, vise innhold av variable, vise hvilke funksjoner som er kalt, kjøre programmet én og én linje, og kjøre til angitte stopp-punkter. Debuggeren gdb er laget for å brukes sammen med både cc og gcc. Den har et vindusgrensesnitt som heter ddd, som kan brukes på UNIX-maskiner. 8/25/10 inf1060 36

Hvordan finne ddd? ddd finnes i katalogene: /store/snacks/bin og i /usr/bin (sistnevnte er alltid i path). 8/25/10 inf1060 37

Debuggere (forts.) For å bruke gdb/ddd må vi gjøre to ting: kompilere våre programmer med opsjonen g, og angi at vi ønsker programdumper: 8/25/10 inf1060 38

Et program med feil: Følgende program prøver å: 1. Sette opp en vektor med 10 pekere til heltall, 2. Sette inn tallene 0-9 og 3. Skrive ut tallene 8/25/10 inf1060 39

Programdumper 8/25/10 inf1060 40

>/usr/bin ddd test-gdb& 8/25/10 inf1060 41

8/25/10 inf1060 42

8/25/10 inf1060 43

8/25/10 inf1060 44

8/25/10 inf1060 45

8/25/10 inf1060 46

8/25/10 inf1060 47

Et eksempel til 8/25/10 inf1060 48

8/25/10 inf1060 49

>/usr/bin ddd printenv-feil& 8/25/10 inf1060 50

8/25/10 inf1060 51

8/25/10 inf1060 52

8/25/10 inf1060 53

8/25/10 inf1060 54

8/25/10 inf1060 55

8/25/10 inf1060 56

Her ser vi at p er 0, og det må være galt! 8/25/10 inf1060 57

Andre feilsøkingsverktøy 8/25/10 inf1060 58

8/25/10 inf1060 59

Programmet alleyoop Dette programmet er i tillegg ypperlig til å finne minnelekasjer. 8/25/10 inf1060 60

8/25/10 inf1060 61