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

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

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

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Cs preprosessor. Dagens tema. Betinget kompilering

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

IN 147 Program og maskinvare

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

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

Programmeringsspråket C Del 2. Michael Welzl

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.

IN 147 Program og maskinvare

Vektorer. Dagens tema. Deklarasjon. Bruk

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.

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

IN 147 Program og maskinvare. Dagens tema

Programmeringsspråket C Del 3. Michael Welzl

Kapittel 1 En oversikt over C-språket

Del 1 En oversikt over C-programmering

Del 4 Noen spesielle C-elementer

Programmeringsspråket C

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.

IN 147 Program og maskinvare

Programmeringsspråket C

Programmeringsspråket C

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

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

IN 147 Program og maskinvare

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

IN 147 Program og maskinvare

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

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

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

Dagens tema: Datastrukturer

Dagens tema. Nyttige programmer Programmet make. Flyt-tall Representasjon av flyt-tall. Standarden IEEE 754. Systemkall i Unix

Hvordan en prosessor arbeider, del 1

ITGK - H2010, Matlab. Repetisjon

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

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

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

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

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

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

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

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

En oppsummering (og litt som står igjen)

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

IN 147 Program og maskinvare

Dagens tema. Nyttige programmer Programmet make. Hvis én fil endres, hvilke filer må da kompileres på nytt?

Dagens tema. LC-2 LC-2 er en «ekstrem-risc»; den har 16 instruksjoner og 3 adresseringsmåter.

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

INF 1000 høsten 2011 Uke september

INF1000 : Forelesning 4

INF1000 undervisningen INF 1000 høsten 2011 Uke september

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

Repetisjon fra sist - 1: Plan for dagen. Repetisjon fra sist 2: Hva jeg glemte sist: Nyttige Kommandoer

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

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

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

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

2 Om statiske variable/konstanter og statiske metoder.

Del 2 Tabeller, arrays, strenger

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

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

Ark 1 av 18. programmeringsspråkenes. Velkommen til IN 211. verden. IN 211 Programmeringsspråk

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

UNIVERSITETET I OSLO

Dagens tema: Enda mer MIPS maskinkode

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

UNIVERSITETET I OSLO

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

Forelesning inf Java 5

Forelesning inf Java 5

UNIVERSITETET I OSLO

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

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

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Fra Python til Java, del 2

INF1000 : Forelesning 1 (del 2)

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

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

Den siste dagen. Pensumoversikt Hovedtanker i kurset Selvmodifiserende kode Overflyt Veien videre... Eksamen

2 Om statiske variable/konstanter og statiske metoder.

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

IN 147 Program og maskinvare. Velkommen til IN 147. Program- og maskinvare

som jobbet nærmest døgnet rundt i 18 måneder i Menlo Park i California for å forberede den neste bølgen innen computing.

Litt Java-historikk. Litt Java-historikk. Ulike varianter for ulike behov. Litt Java-historikk. The Green Team

Utførelse av programmer, metoder og synlighet av variabler i JSP

INF1000: Forelesning 4. Mer om arrayer Metoder

Transkript:

Dagens tema Kort repetisjon om rutiner Programmering i C Variable og adresser Vektorer Tekster Preprosessoren Separat kompilering Innlesning og utskrift mot skjerm og fil Hva er en rutine? En rutine (også kalt prosedyre, funksjon eller metode) er en bit av programkoden som kan kalles fra andre steder Under utførelsen «hopper» man da til rutinen, utfører rutinen, og hopper så tilbake Metoder i Java class MetodeDemo public static void main (String arg[]) demo(7,3); demo(18,24); static void demo (int n, int m) Systemoutprintln("GCD(" + n + "," + m + ") = " + gcd(n,m)); static int gcd (int a, int b) while (a!= b) if (a > b) a -= b; else b -= a; return a; Ark 1 av 31 Ark 2 av 31 Funksjoner i C Her er det samme programmet i C: Rutiner i LC-2 Og her er tilsvarende kode for LC-2: #include <stdioh> orig x3000 int gcd (int a, int b) while (a!= b) if (a > b) a -= b; else b -= a; return a; void demo (int n, int m) printf("gcd(%d,%d) = %d\n", n, m, gcd(n,m)); int main (void) demo(7,3); demo(18,24); main: and r6,r0,0 add r0,r6,#7 add r1,r6,#3 jsr demo ld ld jsr halt XVIII: fill #18 XXIV: fill #24 r0,xviii r1,xxiv demo demo: st r7,r7demo jsr gcd ;; ;; Skriv ut svaret ;; ld r7,r7demo ret r7demo: fill #0 Merk at i C kan man bare kalle funksjoner definert tidligere Dette er ikke helt riktig, men en god regel for nybegynnere gcd: ;; ret end ;; Beregn svaret Ark 3 av 31 Ark 4 av 31

Størrelser og adresser (12 1222 i Patt&Patel-boken) LC-2 I LC-2 adresseres ord: x3010 x3011 x3012 short lagres i slike ord x0000 x0000 x0000 char lagres i de 8 nederste bit-ene (De øvre 8 brukes ikke) long trenger to ord for å lagres Henting og lagring av long samt operasjoner på disse krever derfor flere instruksjoner (En int er enten en short eller en long) Byte-maskiner De fleste datamaskiner i dag er byte-maskiner der man adresserer hver enkelt byte 0x1000 0 0x1001 1 0x1002 2 0x1003 3 char lagres i én byte short lagres i to byte long lagres i fire byte Prosessorene har instruksjoner som kan hente et gitt antall byte av gangen Dette kalles bussbredden og er oftest 2, 4 eller 8 i dag En 64-bits prosessor kan hente 8 byte av gangen Ark 5 av 31 Ark 6 av 31 Byte-rekkefølgen Anta at vi har en 32-bits prosessor Om resultatet av blir load R1,0x1000 R1 = 0 1 2 3 kalles maskinen big-endian Om det blir R1 = 3 2 1 0 kalles den little-endian Vektorer (173 1732 i Patt&Patel-boken) Alle programmeringsspråk har mulighet til å definere en såkalte vektor (også kalt matrise eller «array» på engelsk) Dette er en samling variable av samme type hvor man bruker en indeks til å skille dem Deklarasjon I C deklareres vektorer ved å sette antallet elementer i hakeparenteser etter variabelnavnet: short a, b[4], c; x3008?? a x3009?? b x300a?? x300b?? x300c?? x300d?? c Ark 7 av 31 Ark 8 av 31

Bruk Ved bruk angir indeksen hvilket element vi ønsker I C er alltid første element nr 0, neste nr 1, osv a=3; b[0] = 7; b[a] = 8; Etter dette er situasjonen: x3008 3 a x3009 7 b x300a?? x300b?? x300c 8 x300d?? c Beregning av adresse Adressen til vanlige variable er kjent men adressen til vektorelementer må beregnes Formelen er Startadresse + Indeks Størrelse Setningen «b[a] = 8;» oversettes til LEA LD ADD AND ADD STR R0,b R1,a R0,R0,R1 R6,R6,x0 R6,R6,#8 R6,R0,#0 Hva skjer med ulovlig indeks? I C sjekkes ikke indeksen Dette gjør det mulig å ødelegge andre variable, kode eller i noen tilfelle hele systemet Dette er ikke helt sant, men vi kan tro det er slik en stund Ark 9 av 31 Ark 10 av 31 Tekster (1734 i Patt&Patel-boken) I C lagres tekster som tegnvektorer med en spesiell konvensjon: Etter siste tegn står en byte med verdien 0 Variable 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 En byte med verdien 0 er ikke det samme som sifferet «0»; det er representert av verdien 48 Kopiering av tekst Flytting av tekst skjer med standardfunksjonen strcpy: strcpy(str, "abc"); Før x3010?? str x3011?? x3012?? x3013?? x3014?? x3015?? x3016 a "abc" x3017 x3018 b c x3019 0 Etter x3010 a str x3011 x3012 b c x3013 0 x3014?? x3015?? x3016 a "abc" x3017 x3018 b c x3019 0 Ark 11 av 31 Ark 12 av 31

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 sprintf(str,"",v1, v2, )fungerer som printf men resultatet legges i str i stedet foråskrivesut Hva om teksten er for lang? Siden tekstvariable er vektorer, er det ingen sjekk på plassen Det er derfor fullt mulig å ødelegge for seg selv (og noen ganger for andre) Cs preprosessor (1153 i Patt&Patel-boken) Før selve kompileringen går C-kompilatoren gjennom koden med en preprosessor (som er programmet /usr/lib/cpp) Dette er en programmerbar tekstbehandler som gjør følgende: Henter inn filer #include "inclh" #include <stdioh> Hvis filen er angitt med spisse klammer (som for eksempel <stdioh>), hentes filen fra området /usr/include Ellers benyttes vanlig notasjon for filer Ark 13 av 31 Ark 14 av 31 Leser makro-definisjoner og ekspanderer disse i teksten: #define LINUX #define N 100 #define MIN(x,y) ((x)<(y)? (x) : (y)) Av gammel tradisjon gis makroer navn med store bokstaver (En makro er en navngitt programtekst Når navnet brukes, blir det ekspandert, dvs erstattet av definisjonen Dette er ren tekstbehandling uten noen forbindelse med programmeringsspråkets regler) Benytter man makroer med parametre, bør disse settes i parenteser Likeledes, hvis definisjonen er et uttrykk med flere symboler, bør det stå parenteser rundt hele uttrykket Betinget kompilering Her angis hvilke linjer som skal tas med i kompileringen og hvilke som skal utelates Betinget kompilering Følgende direktiver finnes for betinget kompilering: #if Hvis uttrykket etterpå er noe annet enn 0, tas etterfølgende linjer tas med Uttrykket kan ikke inneholde variable eller funksjoner #ifdef Hvis symbolet er definert (med en #define), skal etterfølgende linjer tas med #ifndef Motsatt av #ifdef #else Skille mellom det som skal tas med og det som ikke skal tas med #endif Slutt med betinget kompilering Eksempel: #define LINUX #ifdef LINUX int x; #else long x; #endif Ark 15 av 31 Ark 16 av 31

Det er også mulig å styre betinget kompilering gjennom cc-kommandoen: > cc -c -DLINUX gir samme effekt som om det sto #define LINUX i program-koden På denne måten er det mulig å ha flere versjoner av koden (for eksempel for flere maskin-typer) og så kontrollere dette utelukkende gjennom kompileringen Fare med betinget kompilering Man kan risikere å ha kode som aldri har vært kompilert, og som kan inneholde de merkeligste feil Separat kompilering I utgangspunktet er det ingen problem med separat-kompilering i C; hver fil utgjør en enhet som kan kompileres for seg selv, uavhengig av alle andre filer i programmet > cc -c delc vil kompilere filen delc og lage delo som inneholder den kompilerte koden Ark 17 av 31 Ark 18 av 31 Eksempel Anta at vi har to filer: Filen sumc: int sum (int n) /* Beregner 1+2++n */ return n*(n+1)/2; Filen vissumc #include <stdioh> extern int sum (int n); int main (void) int i; for (i = 1; i <= 10; ++i) printf("%2d:%4d\n", i, sum(i)); Linking De kompilerte filene kan siden linkes sammen: > cc vissumo sumo -o vissum Kjøring Da får vi et ferdig program som kan kjøres: > vissum 1: 1 2: 3 3: 6 4: 10 5: 15 6: 21 7: 28 8: 36 9: 45 10: 55 Kompilering Disse kan kompileres hver for seg: > cc -c sumc > cc -c vissumc Ark 19 av 31 Ark 20 av 31

Filen progc: #include "inclh" Imidlertid er det en fare for at funksjonssignaturer, strukturer, makroer, typer og andre elementer ikke blir skrevet likt i hver fil Dette løses ved hjelp av definisjonsfiler («header files»), hvis navn gjerne slutter med h Filen inclh: #define N 100 int main(void) char *s[n]; Definisjonsfiler inneholder gjerne følgende: Makrodefinisjoner (#define) Typedefinisjoner (typedef, union, struct) Eksterne spesifikasjoner (extern) Funksjonssignaturer som extern int f(int,char); (Legg merke til semikolonet sist! Den betyr at funksjonen ikke defineres her men et annet sted) Ark 21 av 31 Ark 22 av 31 Utskrift (1154 og 1841 i Patt&Patel-boken) Som nevnt brukes printf til utskrift Første parameter er formatet, og det tolkes slik: Alle tegn unntatt «%» kopieres Tegnkombinasjonen «%» angirnoe spesielt: %% setter inn et %-tegn %d setter inn et heltall hentet fra parameterlisten %u setter inn et heltall uten fortegns-bit fra parameterlisten %x setter inn et heltall (uten fortegns-bit) men skriver det på heksadesimal form %o setter inn et heltall (uten fortegns-bit) men skriver det på oktal form %f setter inn et flyt-tall %c skriver ut et heltall tolket som et tegn %s skriver ut en tekst fra en tekstvariabel Flyt-tall omtales senere Et eksempel #include <stdioh> int main (void) int a = 102; int b = 65; char c = z ; char banner[10] = "Hola!"; float pi = 314159; printf("the variable a decimal: %d\n", a); printf("the variable a hex: %x\n", a); printf("the variable a octal: %o\n", a); printf(" a plus b as character: %c\n", a+b); printf("a char %c\ta string \"%s\"\na float %f\n", c, banner, pi); return 0; Utskriften blir The variable a decimal: 102 The variable a hex: 66 The variable a octal: 146 a plus b as character: A char z A string "Hola!" A float 3141590 Ark 23 av 31 Ark 24 av 31

Lesing fra fil Man må gjøre følgende når man skal lese fra fil: Deklarere fil-variabelen som FILE * Åpne filen med funksjonen fopen med filnavn og "r" (for «read») som parametre Hvis filen ikke finnes, returneres NULL Lese fra filen med fscanf (som virker som scanf) eller fgetc (som leser ett og ett tegn) Lukke filen med fclose Et eksempel #include <stdioh> int main(void) FILE *f; int a, b; f = fopen("2tall","r"); if (f == NULL) printf("umulig å lese filen 2tall\n"); return 1; fscanf(f, "%d%d", &a, &b); fclose(f); printf("%d + %d = %d\n", a, b, a+b); return 0; Ark 25 av 31 Ark 26 av 31 Skriving til fil Skriving til fil er tilsvarende lesing fra fil Man må gjøre følgende: Deklarere fil-variabelen som FILE * Åpne filen med funksjonen fopen med filnavn og "w" (for «write») som parametre Hvis filen ikke lar seg åpne, returneres NULL Skrive til filen med fprintf (som virker som printf) Lukke filen med fclose Et eksempel #include <stdioh> int main(void) FILE *f; int i; f = fopen("potenstab","w"); if (f == NULL) printf("umulig å skrive til potenstab\n"); return 1; fprintf(f, " n n2 n3\n"); for (i = 0; i <= 10; ++i) fprintf(f, "%2d %3d %4d\n", i, i*i, i*i*i); fclose(f); return 0; Ark 27 av 31 Ark 28 av 31

Et avsluttende eksempel #include <stdioh> #include <stdlibh> Dette gir følgende resultat: > more potenstab n n2 n3 0 0 0 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 729 10 100 1000 Utskrift i faste kolonner Ved å angi et tall i formatet (som i %2d) får vi printf til å sette av minst så mange posisjoner til tallet int main(void) FILE *f; int nc[256], i, c; for (i = 0; i <= 255; ++i) nc[i] = 0; f = fopen("minfil","r"); if (f == NULL) printf("kan ikke lese minfil!\n"); exit(1); c = fgetc(f); while (c!= EOF) ++nc[c]; c = fgetc(f); fclose(f); for (i = 0; i <= 255; ++i) if (nc[i] > 0) if ((32<=i && i<=126) 161<=i) printf(" %c ", i); else printf("%3d", i); printf(":%4d\n", nc[i]); return 0; Ark 29 av 31 Ark 30 av 31 Programmet på forrige ark leser en fil minfil tegn for tegn Så skriver det ut hvor mange forekomster det er av hvert tegn Bruker vi det på seg selv, får vi følgende resultat: 10: 32 : 131! : 2 " : 12 # : 2 % : 3 & : 2 : 3 ( : 17 ) : 17 * : 1 + : 6, : 6 : 4 0 : 5 1 : 4 2 : 5 3 : 2 4 : 1 5 : 5 6 : 3 : : 1 ; : 18 < : 7 = : 14 > : 3 E : 2 F : 2 I : 1 K : 1 L : 3 N : 1 O : 1 U : 1 [ : 5 \ : 2 ] : 5 : 1 a : 2 b : 1 c : 16 d : 7 e : 14 f : 21 g : 2 h : 3 i : 37 k : 2 l : 9 m : 3 n : 21 o : 6 p : 5 r : 9 s : 5 t : 12 u : 3 v : 1 w : 1 x : 1 : 5 : 2 : 5 Ark 31 av 31