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

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

Vektorer. Dagens tema. Deklarasjon. Bruk

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

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

Programmeringsspråket C Del 2. Michael Welzl

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

IN 147 Program og maskinvare

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: INF2100. Utvidelser av Minila array-er. tegn og tekster. Flass- og Flokkode. prosedyrer. Prosjektet struktur. feilhåndtering.

Programmeringsspråket C

Dagens tema. Kort repetisjon om rutiner. Programmering i C Variable og adresser. Vektorer. Tekster. Preprosessoren. Separat kompilering

Velkommen til INF2100. Bakgrunnen for INF2100. Hva gjør en kompilator? Prosjektet. Jeg er Dag Langmyhr

IN 147 Program og maskinvare

Offentlig utvalg for punktskrift, OUP Norsk standard for 8-punktskrift punktskrift 24. oktober 2004 sist endret

Datamaskinen LC-2. Dagens tema. Tall i datamaskiner Hvorfor kan LC-2 lagre tall i intervallet ? Hvorfor er det akkurat celler i lageret?

Dagens tema. Datamaskinen LC-2 En kort repetisjon. Binære tall Litt om tallsystemer generelt. Binære tall. Heksadesimale og oktale tall

Dagens tema. Rutiner i LC-2 Og her er tilsvarende kode for LC-2: Funksjoner i C Her er det samme programmet i C: Kort repetisjon om rutiner

Digital representasjon

Digital representasjon

Digital representasjon

Velkommen til INF2100

Del 1 En oversikt over C-programmering

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

Velkommen til INF2100

Del 2 Tabeller, arrays, strenger

Kapittel 1 En oversikt over C-språket

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

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

Programmeringsspråket C

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Del 3. Pekere RR 2016

Programmeringsspråket C

ISO Dagens tema. Tegn. Uttrykk. I Minila lagres kun heltall, men de kan tolkes som tegn. Det siste om Minila.

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

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

Cs preprosessor. Dagens tema. Betinget kompilering

Dagens tema. Oppsummering om assemblerspråk. Programmering i C. Bakgrunn. Et minimalt eksempel med forklaring. Datatyper i C.

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

Forelesning inf Java 5

Forelesning inf Java 5

IN 147 Program og maskinvare

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

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

Unicode. Unikt vakkert eller unisont håpløst? En vandring gjennom tegnkodingens historie. Dag Lamgmyhr, Ifi/UiO Ark 1 av 23

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

Del 4 Noen spesielle C-elementer

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

Dagens tema: Datastrukturer

Velkommen til INF2100

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

IN 147 Program og maskinvare

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

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

INF1000 : Forelesning 4

UNIVERSITETET I OSLO

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Hvordan en prosessor arbeider, del 1

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

Dagens tema. Cs preprosessor Separat kompilering av C-funksjoner C og minnet Oversikt over operatorene

INF 1000 høsten 2011 Uke september

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

INF1000 undervisningen INF 1000 høsten 2011 Uke september

TDT4110 IT Grunnkurs Høst 2015

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

INF1000: Forelesning 4. Mer om arrayer Metoder

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

Tegn og tekst. Posisjonssystemer. Logaritmer en kort repetisjon. Bitposisjoner og bitmønstre. Kapittel August 2008

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Læringsmål. INF1000: Forelesning 12. Hovedkilde. Kunne binærtall og heksadesimale tall og konvertering mellom ulike tallsystemer: Titallsystemet

Obligatorisk oppgave 1 INF1020 h2005

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

2 Om statiske variable/konstanter og statiske metoder.

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

2. Pekere og referanser.

Oppgavene 1, 2, 4, 5, 6, 9, 12 og 13 passer best til å løses ved en datamaskin.

( ) ( ( ) ) 2.12 Løsningsforslag til oppgaver i avsnitt

Albregtsen og Skagestein: Digital representasjon Løsningsforslag til kapittel 2 Representasjon av tegn og tekster

INF225 høsten 2003 Prosjekt del 4: kodegenerering

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Rekker (eng: series, summations)

Metoder med parametre, løkker og arrayer

EKSAMENSFORSIDE Skriftlig eksamen med tilsyn

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

Programmeringsspråket C Del 3. Michael Welzl

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

ITGK - H2010, Matlab. Repetisjon

Transkript:

Dagens tema C-programmering Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes. Adresser og pekere Parametre Vektorer (array-er) Tekster (string-er)

Hvordan ser minnet ut? Variabler, adresser og pekere Variabler ligger lagret i hurtiglageret (ofte kalt RAM) i en eller annen adresse. 0xFFFFFFFC 0xFFFFFFF8 0xFFFFFFF4 0xFFFFFFF0 : 0x0000000C 0x00000008 0x00000004 0x00000000

Hvordan få tak i en adresse? Operatoren & I C kan man få vite i hvilken adresse en variabel ligger ved å bruke den unære operatoren &. #include <stdio.h> int a, b, c; int main(void) { printf("skriv to tall: "); scanf("%d", &a); scanf("%d", &b); c = a + b; printf("summen er %d.\n", c); } printf("i adresse 0x%08x ligger a med verdien %d.\n", &a, a); printf("i adresse 0x%08x ligger b med verdien %d.\n", &b, b); printf("i adresse 0x%08x ligger c med verdien %d.\n", &c, c);

Innlesning i C Innlesning Til innlesning brukes scanf. Første parameter angis hva som skal leses inn: %c for tegn, %d for heltall og %f for flyt-tall. Legg merke til & foran variabelnavnet; den må være der!

Hvordan få tak i en adresse? La oss kjøre dette programmet: Skriv to tall: 33 21 Summen er 54. I adresse 0x080497f4 ligger a med verdien 33. I adresse 0x080497f8 ligger b med verdien 21. I adresse 0x080497fc ligger c med verdien 54. NB! Det kan variere fra gang til gang hvilke adresser man får. Her ser vi at variablene ligger pent etter hverandre og at hver av dem opptar 4 byte.

Adressevariabler Adressevariabler I C kan vi lagre adresser i variabler; disse deklareres med en stjerne: int v, *p; Her er v en vanlig variabel mens p er en adresse som kan peke på int-variabler. (Vi må alltid oppgi hva slags variabler adresser skal peke på.) Bruk av adressevariabler Vi kan sette adressen til variabler inn i pekervariabelen; vi sier at vi får adressen til å «peke på» variabelen. p = &v;

Å følge en adresse Vi kan «slå opp en adresse» ved å bruke operatoren *; da får vi variabelen som adressen peker på. v = 7; printf("v = %d, *p = %d.\n", v, *p); v = -17; printf("v = %d, *p = %d.\n", v, *p); Denne koden skriver ut v = 7, *p = 7. v = -17, *p = -17.

Å følge en adresse Både v og *p angir altså samme variabel: *p = 123; printf("v = %d, *p = %d.\n", v, *p); Utskriften av denne koden er v = 123, *p = 123.

Adresser som parametre Et eksempel La oss lage en funksjon som bytter om de to parametrene sine. Til selve ombyttingen trengs en hjelpevariabel: temp = v1; v1 = v2; v2 = temp;

Adresser som parametre #include <stdio.h> void swap (int v1, int v2) { int temp; } temp = v1; v1 = v2; v2 = temp; int main (void) { int a = 3; int b = 4; printf("før: a = %d og b = %d\n", a, b); swap(a, b); printf("etter: a = %d og b = %d\n", a, b); }

Adresser som parametre Når vi kjører programmet, får vi en overraskelse: Før: a = 3 og b = 4 Etter: a = 3 og b = 4 Grunnen er: Parametre overføres som verdier i C (som i Java). Følgelig er det bare lokale kopier som endres. Når funksjonen er ferdig, er alt glemt. Løsning Løsningen er å overføre adressene til de to variablene i stedet for verdiene. Adressene overføres som kopier, men vi kan allikevel endre det de peker på.

Adresser som parametre Vi må endre både deklarasjonen og kallet: #include <stdio.h> void swap (int *v1, int *v2) { int temp; } temp = *v1; *v1 = *v2; *v2 = temp; int main (void) { int a = 3, b = 4; printf("før: a = %d og b = %d\n", a, b); swap(&a, &b); printf("etter: a = %d og b = %d\n", a, b); }

Adresser som parametre Når dette programmet kjører, skjer alt som vi forventer: Før: a = 3 og b = 4 Etter: a = 4 og b = 3 Konklusjon om parametre Det er ulike måter å overføre parametre på. I C og i Java brukes verdioverføring. Man kan allikevel oppdatere variabler ved å sende over adressene til dem. Dette gjøres for eksempel i scanf("%d", &v);

C-kommentarer Kommentarer Kommentarer omgis av /* og */. De kan stå hvor som helst. (Mange kompilatorer godtar også //... linjeskift men det er ikke standard i C.)

Logiske verdier Logiske («boolean») verdier C har ingen egen datatype for logiske verdier; i stedet brukes int slik: = 0 Usant (= false) 0 Sant (= true)

Tegn i C Lagring av tegn C har ingen egen type for å lagre tegn (som char i Java). I stedet benyttes heltall. Det har vært vanlig å lagre hvert tegn i én byte; i den vestlige verden har man brukt ASCII eller ISO 8859-1 (og også kjent som ISO LATIN-1). Nå er Unicode og UTF-8 i ferd med å overta. (Vi kommer tilbake til dette.)

April 1995, DFL, Ifi/UiO Adresser Diverse annet Vektorer Tekster Oppsummering Tegnsett 0 000 00 1 001 01 2 002 02 3 003 03 4 004 04 5 005 05 6 006 06 7 007 07 8 010 08 9 011 09 10 012 0A 11 013 0B 12 014 0C 13 015 0D 14 016 0E 15 017 0F 16 020 10 17 021 11 18 022 12 19 023 13 20 024 14 21 025 15 22 026 16 23 027 17 24 030 18 25 031 19 26 032 1A 27 033 1B 28 034 1C 29 035 1D 30 036 1E 31 037 1F ISO 8859 1 04 64 100 96 140 128 200 160 240 32 0 20 33 041! " # $ % & ( ) * +,. / 0 1 2 3 4 5 6 7 8 9 : ; < = >? 21 34 042 22 35 043 23 36 044 24 37 045 25 38 046 26 39 047 27 40 050 28 41 051 29 42 052 2A 43 053 2B 44 054 2C 45 055 2D 46 056 2E 47 057 2F 48 060 30 49 061 31 50 062 32 51 063 33 52 064 34 53 065 35 54 066 36 55 067 37 56 070 38 57 071 39 58 072 3A 59 073 3B 60 074 3C 61 075 3D 62 076 3E 63 077 3F @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ 40 65 101 41 66 102 42 67 103 43 68 104 44 69 105 45 70 106 46 71 107 47 72 110 48 73 111 49 74 112 4A 75 113 4B 76 114 4C 77 115 4D 78 116 4E 79 117 4F 80 120 50 81 121 51 82 122 52 83 123 53 84 124 54 85 125 55 86 126 56 87 127 57 88 130 58 89 131 59 90 132 5A 91 133 5B 92 134 5C 93 135 5D 94 136 5E 95 137 5F a b c d e f g h i j k l m n o p q r s t u v w x y z { } ~ 60 97 141 61 98 142 62 99 143 63 100 144 64 101 145 65 102 146 66 103 147 67 104 150 68 105 151 69 106 152 6A 107 153 6B 108 154 6C 109 155 6D 110 156 6E 111 157 6F 112 160 70 113 161 71 114 162 72 115 163 73 116 164 74 117 165 75 118 166 76 119 167 77 120 170 78 121 171 79 122 172 7A 123 173 7B 124 174 7C 125 175 7D 126 176 7E 127 177 7F 80 129 201 81 130 202 82 131 203 83 132 204 84 133 205 85 134 206 86 135 207 87 136 210 88 137 211 89 138 212 8A 139 213 8B 140 214 8C 141 215 8D 142 216 8E 143 217 8F 144 220 90 145 221 91 146 222 92 147 223 93 148 224 94 149 225 95 150 226 96 151 227 97 152 230 98 153 231 99 154 232 9A 155 233 9B 156 234 9C 157 235 9D 158 236 9E 159 237 9F A0 161 241 ª «± ² ³ µ ¹ º» ¼ ½ ¾ A1 162 242 A2 163 243 A3 164 244 A4 165 245 A5 166 246 A6 167 247 A7 168 250 A8 169 251 A9 170 252 AA 171 253 AB 172 254 AC 173 255 AD 174 256 AE 175 257 AF 176 260 B0 177 261 B1 178 262 B2 179 263 B3 180 264 B4 181 265 B5 182 266 B6 183 267 B7 184 270 B8 185 271 B9 186 272 BA 187 273 BB 188 274 BC 189 275 BD 190 276 BE 191 277 BF À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß 192 300 C0 193 301 C1 194 302 C2 195 303 C3 196 304 C4 197 305 C5 198 306 C6 199 307 C7 200 310 C8 201 311 C9 202 312 CA 203 313 CB 204 314 CC 205 315 CD 206 316 CE 207 317 CF 208 320 D0 209 321 D1 210 322 D2 211 323 D3 212 324 D4 213 325 D5 214 326 D6 215 327 D7 216 330 D8 217 331 D9 218 332 DA 219 333 DB 220 334 DC 221 335 DD 222 336 DE 223 337 DF à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ 224 340 E0 225 341 E1 226 342 E2 227 343 E3 228 344 E4 229 345 E5 230 346 E6 231 347 E7 232 350 E8 233 351 E9 234 352 EA 235 353 EB 236 354 EC 237 355 ED 238 356 EE 239 357 EF 240 360 F0 241 361 F1 242 362 F2 243 363 F3 244 364 F4 245 365 F5 246 366 F6 247 367 F7 248 370 F8 249 371 F9 250 372 FA 251 373 FB 252 374 FC 253 375 FD 254 376 FE 255 377 FF

Lese filer Hvordan lese filer? Med funksjonen fopen kan man åpne filer: #include <stdio.h> FILE *f = fopen("minfil.txt", "r"); (Siste parameter angir at filen skal åpnes for lesing.) Når man leser fra fil, benyttes fscanf (i stedet for scanf): fscanf(f, "%d", &v);

Deklarasjon Vektorer Alle programmeringsspråk har mulighet til å definere en såkalt vektor (også kalt matrise eller «array» på engelsk). Dette er en samling variabler av samme type hvor man bruker en indeks til å skille dem. Deklarasjon I C deklareres vektorer ved å sette antallet elementer i hakeparenteser etter variabelnavnet: char a, b[4], c; Antallet elementer må være en konstant.

Hvordan lagres de i minnet? char a, b[4], c;. 0x300d?? c 0x300c?? 0x300b?? 0x300a?? 0x3009?? b 0x3008?? a.

Bruk av vektorer Bruk a = 3; b[0] = 7; b[a] = 8; Etter dette er situasjonen:. 0x300d?? c 0x300c 8 0x300b?? 0x300a?? 0x3009 7 b 0x3008 3 a.

Beregning av adresser Beregning av adresse Man kan regne seg frem til adressen til et vektorelement når man kjenner indeksen og vektorens startadresse; formelen er Startadresse + Indeks Størrelse Hva skjer med en ulovlig indeks? I C sjekkes ikke indeksen. Dette gjør det mulig å ødelegge andre variabler, kode eller i noen tilfelle hele systemet.

Beregning av adresser Størrelse over 1 byte. Anta at int er 4 byte. int a, b[4], c; 0x301c?? c 0x3018?? 0x3014?? 0x3010?? 0x300c?? b 0x3008?? a.

Flere dimensjoner Flerdimensjonale matriser I C kan vi ha flerdimensjonale matriser: int a[3][2]; Hvordan lagrer man noe slikt i minnet?

Flere dimensjoner Svar Flerdimensjonale matriser lagres sammenhengende og radvis: #include <stdio.h> int main(void) { int a[3][2], i, j; } for (i = 0; i < 3; ++i) for (j = 0; j < 2; ++j) printf("a[%d][%d] ligger i adresse 0x%08x.\n", i, j, &a[i][j]); return 0;

Flere dimensjoner gir dette svaret: A[0][0] ligger i adresse 0x2bf66160. A[0][1] ligger i adresse 0x2bf66164. A[1][0] ligger i adresse 0x2bf66168. A[1][1] ligger i adresse 0x2bf6616c. A[2][0] ligger i adresse 0x2bf66170. A[2][1] ligger i adresse 0x2bf66174.

Flere dimensjoner Adresseberegning Adressen til A[i 1 ][i 2 ] beregnes slik: Start + (i 1 antall 2 + i 2 ) Størrelse... og dette kan utvides til vilkårlig mange dimensjoner.

Lagring av tekster Én-bytes tekster 2 I C lagres tekster som tegnvektorer med en spesiell konvensjon: Etter siste tegn står en byte med verdien 0. 1 Variabler Når man deklarerer en tekstvariabel, må man angi hvor mange tegn det er plass til (samt plass til 0-byten). char str[6]; Tekstvariabel str har plass til 5 tegn. 1 En byte med verdien 0 er ikke det samme som sifferet «0»; sifferet «0» er representert av verdien 48; se plansje nr 17. 2 Unicode-tekster kommer senere.

Kopiering av tekst Kopiering av tekst Flytting av tekst skjer med standardfunksjonen strcpy: unsigned char *mystrcpy (unsigned char til[], unsigned char fra[]) { int i = 0; } while (1) { til[i] = fra[i]; if (fra[i] == 0) return til; ++i; }

Kopiering av tekst strcpy(t,"abc") Før. 0x301d 0 0x301c 0x301b c b 0x301a a "abc" 0x3019?? 0x3018?? 0x3017?? 0x3016?? 0x3015?? 0x3014?? 0x3013?? 0x3012?? 0x3011?? 0x3010?? t. Etter. 0x301d 0 0x301c 0x301b c b 0x301a a "abc" 0x3019?? 0x3018?? 0x3017?? 0x3016?? 0x3015?? 0x3014?? 0x3013 0 0x3012 0x3011 c b 0x3010 a t.

En demonstrasjon En demonstrasjon #include <stdio.h> int main (void) { unsigned char t[10]; int i; } mystrcpy(t, "abc"); for (i = 0; i < 10; ++i) { printf("t[%2d] = %4d = %c \n", i, t[i], t[i]); } return 0;

En demonstrasjon

Ulike tekstoperasjoner Andre tekstoperasjoner strlen(str) beregner den nåværende lengden av teksten i str. (Dette gjør den ved å lete seg frem til 0-byten.) strcat(str1,str2) utvider teksten i str1 med den i str2. strcmp(str1,str2) sammenligner de to tekstene. Returverdien er < 0 om str1 < str2 0 om str1 = str2 > 0 om str1 > str2

Ulike tekstoperasjoner sprintf(str, "...", v1, v2,...) fungerer som printf men resultatet legges i str i stedet for å skrives ut. Hva om teksten er for lang? Siden tekstvariabler er vektorer, er det ingen sjekk på plassen. Det er derfor fullt mulig å ødelegge for seg selv (og noen ganger for andre).

Hva er det viktigste ved tekster? Konklusjon om tekster i C Programmereren har ansvar for å sette av plass til tekster. Nye kopier av tekster oppstår aldri automatisk i C. Programmereren må sikre at det alltid er nok plass til en tekst.