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

Like dokumenter
Dagens tema: Datastrukturer

IN 147 Program og maskinvare

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

IN 147 Program og maskinvare. Dagens tema

Programmeringsspråket C Del 3

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. C-programmering. Nøkkelen til å forstå C-programmering ligger i å forstå hvordan minnet brukes.

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

Programmeringsspråket C

IN 147 Program og maskinvare

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

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

Del 1 En oversikt over C-programmering

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

Vektorer. Dagens tema. Deklarasjon. Bruk

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

Programmeringsspråket C Del 2

Del 4 Noen spesielle C-elementer

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

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

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

Semantisk Analyse del III

Del 2 Tabeller, arrays, strenger

Oppgave 1 JK-flip-flop (Total vekt 20%)

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

Programmeringsspråket C

Programmeringsspråket C

IN 147 Program og maskinvare

Dagens tema. Mer MIPS maskinkode. Maske-operasjoner Skift-operasjoner Lesing og skriving Pseudo-instruksjoner Mer om funksjonskall Registeroversikt

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

Dagens tema: Enda mer MIPS maskinkode

IN 147 Program og maskinvare

Pensum Hovedtanker Selvmodifiserende Overflyt Veien videre Eksamen. Oppsummering

Datatyper og typesjekking

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

Oversikt over IN147(A):

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

Datatyper og typesjekking

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

Programmeringsspråket C Del 2. Michael Welzl

Datatyper og typesjekking

Dagens tema: Kjøresystemer II

Læringsmål og pensum. Oversikt

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

Datatyper og typesjekking

Kap 6.4: Typesjekking Foiler ved Birger Møller-Pedersen Forelest av Stein Krogdahl 19. og 23. mars Dagens tema: Typer og typesjekking

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

Kapittel 1 En oversikt over C-språket

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

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

En oppsummering (og litt som står igjen)

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

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

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

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

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

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

Introduksjon til objektorientert programmering

TDT4110 Informasjonsteknologi grunnkurs: Uke 43: Datastrukturer (kap. 8)

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

TDT4110 IT Grunnkurs Høst 2015

Hvordan en prosessor arbeider, del 1

Cs preprosessor. Dagens tema. Betinget kompilering

Løsningsforslag til eksamen i IN147(A)

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

INF3110 Programmeringsspråk. Velkommen til kurset INF 3110/4110. Programmeringsspråk 1/24

INF 3110/4110. Velkommen til kurset. Programmeringsspråk. Først det praktiske

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

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

TDT4105 Informasjonsteknologi grunnkurs: Uke 43: Datastrukturer (kap. 8)

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

Del 3. Pekere RR 2016

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

IN 147 Program og maskinvare

Typer. 1 Type: boolean. 2 Verdimengde: {true, false} 3 Operatorer: NOT, AND, OR... 1/19. Forelesning Forelesning

INF3110 Programmeringsspråk. Dagens tema. Typer (Kapittel 3 frem til ) Innføring i ML (Kapittel & ML-kompendiet.) 1/19

Kap. 8 del 1 kodegenerering INF5110 Vår2007

TDT4110 IT Grunnkurs Høst 2016

Leksjon 2. Setninger og uttrykk

Leksjon 2. Setninger og uttrykk

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

løsningsforslag-uke5.txt

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Obligatorisk oppgave 1 INF1020 h2005

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

2. Pekere og referanser.

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

Notat 2, ST Sammensatte uttrykk. 27. januar 2006

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

Runtimesystemer Kap 7 - I

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

Mer om C programmering og cuncurrency

Transkript:

Dagens tema Mer om C Enkle datatyper Sammensatte datatyper: Vektorer og matriser Tekster Mengder Strukturer Unioner Ringbuffere Formål: Nyttige å bruke under programmeringen Trening i programmering i C og assemblerspråk Ark 1 av 19 Forelesning 17.2.1998

Enkle datatyper Tall Heltall og flyt-tall finnes ulike størrelser: % more size.c #include <stdio.h> int main(void) { printf("sizeof(char): %d\n", sizeof(char)); printf("sizeof(short): %d\n", sizeof(short)); printf("sizeof(int): %d\n", sizeof(int)); printf("sizeof(long): %d\n", sizeof(long)); printf("sizeof(float): %d\n", sizeof(float)); printf("sizeof(double): %d\n", sizeof(double)); } % a.out sizeof(char): 1 sizeof(short): 2 sizeof(int): 4 sizeof(long): 4 sizeof(float): 4 sizeof(double): 8 Det eneste C lover er: sizeof(char) 1 sizeof(short) 2 sizeof(long) 4 sizeof(char) sizeof(short) sizeof(int) sizeof(long) Forelesning 17.2.1998 Ark 2 av 19

Fortegns-bit Typene short, int og long er alle heltall med fortegns-bit. Man kan sette signed foran, men dette er overflødig. Disse typene har også en variant uten fortegns-bit: unsigned short, unsigned int og unsigned long. Typen char er signed eller unsigned, så her må man angi hva man ønsker hvis dette er viktig. Heltallskonstanter Man kan angi hvilken type en konstant skal være de få gangene dette er viktig: 123 er int (eller long int eller unsigned long) 123L er long int (eller unsigned long) 123U er unsigned int (eller unsigned long) 123UL er unsigned long Forelesning 17.2.1998 Ark 3 av 19

Heltallsvariable i assemblerspråk I MIPS assemblerspråk setter man av plass til variable med.word eller.byte: Var1:.word 122 B1:.byte 65 Bruk av riktig instruksjon (byte/halvord/ord og med/uten fortegnsbit) er programmererens ansvar. Ofte benyttes bare ett adresseregister til å peke på en samling variable. De enkelte variable aksesseres via et fast tillegg: la $t0,var1 lb $t1,4($t0) # Hent B1, addi $t1,$t1,1 # øk med 1, og sb $t1,4($t0) # legg tilbake. Alternativt kan man legge lokale variable på stakken. Fordel: Variabelen opptar kun plass når den brukes. Ulempe: Programmereren kan gå i surr med bruk av $sp-registeret. (Ofte brukes $fp-registeret ($30) til å peke på de lokale variable. Vi vil ikke bruke $fp i dette kurset.) Forelesning 17.2.1998 Ark 4 av 19

Andre enkle datatyper Tegn Finnes ikke; bruk unsigned char siden vi i Norge bruker 8-bits tegnsett. Men: Ved innlesning bruk int siden EOF er 1. Logisk (Boolean) Finnes ikke; bruk char. I tester sjekke det om verdien er 0 (som angir FALSE) og 0 (som regnes som TRUE). Følgende to tester er derfor ekvivalente: while (n!= 0)... while (n)... Flyt-tall Omtales senere i kurset. Tekst Omtales senere i dag. Pekere Omtales neste uke. Forelesning 17.2.1998 Ark 5 av 19

Matriser Vektorer (én-dimensjonale matriser) C FORTRAN Pascal Simula Lagring int A[12]; INTEGER A(12) var A: array [10..21] of Integer; integer array A(10:21); short int Arr[6] = {1, 1, 2, 3, 5, 8}; I C: Generelt:. A10A 8 5 A108 5 4 A106 3 3 A104 2 2 A102 1 1 A100 1. 0 Arr + I S Arr + (I L) S Forelesning 17.2.1998 Ark 6 av 19

Indeksering # Kode: Henter et element i vektoren «Vektor». # Registre: $8: Indeksen (i området 1 til 10). # $9: Elementet. # Spesielt: Vektor er deklarert med noe à la # Vektor: array [1:10] of Short; (Pascal). addi $8,$8,-1 # Kompensér for nedre grense. add $8,$8,$8 # Doble, pga 2 byte/element. la $9,Vektor # Hent adressen til Vektor. add $8,$8,$9 # Legg til 2 indeks. lh $9,0($8) # Hent elementet. Forelesning 17.2.1998 Ark 7 av 19

To-dimensjonale matriser I Simula: integer array Arr2(1:3,1:2); hvor hver integer opptar 4 byte. Disse lagres radvis i de fleste programmeringsspråk. Generelt:. A114 (3,2) A110 (3,1) A10C (2,2) A108 (2,1) A104 (1,2) A100. (1,1) Arr2 + ((I 1 L 1 ) D 2 + (I 2 L 2 )) S der D i er U i L i + 1. I C: long int Arr2[3][2]; Arr2 + (I 1 D 2 + I 2 ) S I FORTRAN lagres matriser kolonnevis. Forelesning 17.2.1998 Ark 8 av 19

Eksempel: I Simula: integer array Arr2(1:3,1:2); Hvor ligger Arr2(3,1)? Arr2 + ((3 1) D 2 + (1 1)) 4 = Arr2 + (2 (2 1 + 1) + 0) 4 = Arr2 + (2 2) 4 = Arr2 + 16 = A100 hex + 16 = A110 hex Forelesning 17.2.1998 Ark 9 av 19

Tekster En tekst må lagres som en vektor, og det er flere måter å angi lengden på: Avslutningstegn: H a l l o! 0 Viktigste fordel: Vilkårlig lange tekster kan lagres. Denne teknikken brukes i C. Avslutningstegnet skrives som \0. Lengdeangivelse: 6 H a l l o! Viktigste fordeler: Alle tegn kan lagres. Lett å finne siste tegn i teksten. Denne teknikken brukes i Pascal og Simula. Forelesning 17.2.1998 Ark 10 av 19

Hvordan oppstår tekster? I C og assemblerspråk oppstår ikke objekter med tekster så automatiske som i for eksempel Simula. De kan faktisk kun oppstå på tre måter: Som programkonstanter: printf("hallo!"); /* i C */ t_var:.asciiz "Hallo!" # I ass.språk Som tegnvektorer: unsigned char melding[200]; melding:.space 200 Ved eksplisitt allokering: unsigned char *p; /* «p» er en peker. */ p = (unsigned char*)malloc(20); strcpy(p, "Hallo!"); Forelesning 17.2.1998 Ark 11 av 19

Operasjoner på tekster I C benyttes egne funksjoner for alle operasjonene på tekster. De vanligste er: strcpy(a,b) kopierer teksten b til a. strcat(a,b) utvider a med innholdet av b. strlen(a) beregner antall tegn i a. strcmp(a,b) sammenligner tekstene a og b. < 0 hvis a<b Svaret er 0 hvis a=b > 0 hvis a>b Det er programmererens ansvar at det er plass i den teksten som endres ved strcpy, strcat eller lignende. Forelesning 17.2.1998 Ark 12 av 19

Mengder På en tippekupong kan man velge mellom tre tips: H, U og B. Man kan imdlertid gardere: HU, HB, UB eller HUB. I alt finnes det 8 verdier i mengden over mulige tips i hver kamp: {}, {H}, {U}, {B}, {H, U}, {H, B}, {U, B} og {H, U, B}. En slik verdi kan lagres som et bit-mønster med 3 bit: H U B {H, B} x x x x x 1 0 1 Forelesning 17.2.1998 Ark 13 av 19

Operasjoner på mengder Det fine med denne representasjonen, er at maske-operasjonene fungerer: Snitt ({H, B} {H, U} = {H}) kan implementeres som and. Union ({H, B} {H, U} = {H, U, B}) kan implementeres som or. Differanse ({H, B}\{H, U} = {B}) kan implementeres som and og not. Til å test om et element er med i en mengde, må man bruke and og kanskje sll. Forelesning 17.2.1998 Ark 14 av 19

Strukturer Strukturer kan sammenlignes med enkle Simula-klasser. I C ser de slik ut: struct punkt{ long xpos, ypos; char merke; short status; } origo;. struct punkt p1, p2;. p1.xpos = 0; p1.ypos = 7; p1.merke = A ; ++p1.status; I assemblerspråk: p1:.space 12 # struct punkt p1; p2:.space. 12 # struct punkt p2; la $8,p1 # Adressen til «p1». sw $0,0($8) # p1.xpos = 0; li $9,7 # 7; sw $9,4($8) # p1.ypos= li $9,65 # A ; sb $9,8($8) # p1.merke= lh $9,10($8) # p1.status addi $9,$9,1 # +1; sh $9,10($8) # p1.status= Legg merke til instruksjonene lh, sh og sb. Legg også merke til at p1.status har tillegg 10 og ikke 9 på grunn av lagertilpasning. Forelesning 17.2.1998 Ark 15 av 19

Unioner I en union lagres verdiene «oppå» hverandre. Deklarasjonen i C ser slik ut: union fortegn { long med_fort; unsigned long uten_fort; unsigned char byte[4]; } x; Eksempler på bruk: x.med_fort = -2; a[0] = x.byte[0]; a[2] = x.byte[2]; a[1] = x.byte[1]; a[3] = x.byte[3]; Bruksområder Omgå type-definisjoner Strukturer med variabel del Forelesning 17.2.1998 Ark 16 av 19

Ringbuffere Ringbuffere brukes til å implementere køer («FIFO-lister»). Ingen høynivåspråk har noen tilsvarende struktur. Ut Inn Pekerne forteller hvor neste element skal inn, og hvor man kan finne neste element som skal ut. Forelesning 17.2.1998 Ark 17 av 19

Implementasjon En ringbuffer implementeres å «klippe den opp» og lagre den i en vektor: Ut xx xx xx xx xx xx Inn Deklarasjon i C #define BUFFSIZ 12 int ringb[buffsiz], innp = 0, utp = 0, ant_e = 0; Forelesning 17.2.1998 Ark 18 av 19

Innsetting i ringbuffer int put(int x) { if (ant_e == BUFFSIZ) return 0; } ant_e++; ringb[innp] = x; innp++; if (innp >= BUFFSIZ) innp = 0; return 1; Henting fra ringbuffer int get(void) { int x; if (ant_e == 0) return -1; } ant_e--; x = ringb[utp]; utp++; if (utp >= BUFSIZE) utp = 0; return x; Forelesning 17.2.1998 Ark 19 av 19