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



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

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

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

Signaturer. Dagens tema

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

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

IN 147 Program og maskinvare

Programmeringsspråket C Del 3. Michael Welzl

Vektorer. Dagens tema. Deklarasjon. Bruk

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

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.

IN 147 Program og maskinvare

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.

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

IN 147 Program og maskinvare

Del 1 En oversikt over C-programmering

IN 147 Program og maskinvare

Del 4 Noen spesielle C-elementer

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

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

Dagens tema: Datastrukturer

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

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

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

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

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

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

Cs preprosessor. Dagens tema. Betinget kompilering

Programmeringsspråket C Del 2

Programmeringsspråket C Del 2

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

Programmeringsspråket C Del 2

Programmeringsspråket C

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

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

Programmeringsspråket C

Programmeringsspråket C

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

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

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

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

Programmeringsspråket C Del 2. Michael Welzl

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

IN 147 Program og maskinvare. Dagens tema

INF1000: Forelesning 7

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

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

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Java. INF1000 : Forelesning 2. Ulike varianter for ulike behov. Java Standard Edition (Java SE) Java:

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

INF1000: Forelesning 7. Konstruktører Static

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

Del 2 Tabeller, arrays, strenger

Programmeringsspråk for nybegynnere. Krav til språket. Krav til språket. Krav til språket

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

Objekter og referanser

Diverse eksamensgaver

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

Lynkurs i shellprogrammering under Linux

INF1000 : Forelesning 1 (del 2)

Datatyper og typesjekking

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Del 3: Evaluere uttrykk

INF 1000 høsten 2011 Uke september

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Oversikt. Beskrivelse Bash. 1 UNIX shell. 2 Kommandolinje som brukergrensesnitt. 3 Input og output. 4 Bash builtins. 5 Linux utilities.

Kompilering Statiske Syntaksanalyse Feilsjekking Eksempel Oppsummering

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre, anders}@idi.ntnu.

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

Dagens tema: 12 gode råd for en kompilatorskriver. Sjekking av navn. Lagring av navn. Hvordan finne et navn?

Datatyper og typesjekking

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

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Datatyper og typesjekking

IN 147 Program og maskinvare

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

Oving 2. Oppgave 1. #include <stdio.h> int main(int argc, char **argv) { char *navn = argv[1]; printf ("Navnet ditt er %s\n", navn); } Oppgave 2

En oppsummering (og litt som står igjen)

2 Om statiske variable/konstanter og statiske metoder.

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Datatyper og typesjekking

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

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

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Kapittel 8: Programutvikling

Transkript:

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

Verdt å huske på! Husk! Nøkkelen til å forstå C er å skjønne hvordan C bruker minnet. Husk! Ingen blir god i C uten trening.

Malloc-funksjonen 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. #include <stdlib.h>. int *p;. p = malloc(sizeof(int));

Free-unksjonen Frigivelse av objekter Når objekter ikke trengs mer, må de gis tilbake til systemet med funksjonen free: free(p);

Et eksempel 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. char *navn;. printf("hva heter du? "); navn = malloc(200); scanf("%s", navn); printf("hei, %s.\n", navn); free(navn);

Pekerfeil i Java Hva hvis noe går galt? Følgende Java-program inneholder en ganske vanlig feil: 1 class Feil { 2 void m() { 3 } 4 5 public static void main (String args[]) { 6 Feil fp = null; 7 8 fp.m(); 9 } 10 } Når vi kjører det, får vi beskjed om hva som gikk galt: > javac Feil.java > java Feil Exception in thread "main" java.lang.nullpointerexception at Feil.main(Feil.java:8)

Pekerfeil i C Her er et C-program med tilsvarende feil: 1 #include <stdio.h> 2 #include <string.h> 3 4 int main (void) 5 { 6 char *s; 7 8 strcpy(s, "Abc"); 9 return 0; 0 } Når vi kompilerer og kjører det, skjer følgende: > gcc feil.c -o feil >./feil Segmentation fault Konklusjon Vær nøye med å få programmet riktig. (Vi kommer ellers tilbake med verktøy for feilfinning siden.)

Signaturer Signaturer I C gjelder alle deklarasjoner fra deklarasjonspunktet og ut filen. Følgende program: 1 int main (void) 2 { 3 x = 4; 4 return 0; 5 } 6 7 int x; gir denne feilmeldingen: > gcc -o dekl dekl.c dekl.c: In function main : dekl.c:3: error: x undeclared (first use in this function) dekl.c:3: error: (Each undeclared identifier is reported only dekl.c:3: error: once for each function it appears in.)

Signaturer Hva gjør man da når man må referere til noe som ikke er deklarert ennå, for eksempel når to funksjoner kaller hverandre? Løsningen er en signatur: void f1 (int x); int f2 (int a) { if (a>0) f1(a); return a-1; } void f1 (int x) { int w = f2(x/2); } int main (void) { f1(5); return 0; }

Manglende funksjonsdeklarasjoner En vanlig feil På grunn Cs forhistorie er det ikke alltid nødvendig å deklarere signaturer for funksjoner, men C antar da at det dreier seg om en int-funksjon. 1 int main (void) 2 { 3 f(6); 4 } 5 6 void f (int x) 7 { 8 /* Gjør ett eller annet med x.*/ 9 } Dette kan noen ganger gi rare feilmeldinger: > gcc -o sig-feil sig-feil.c sig-feil.c:7: warning: conflicting types for f sig-feil.c:3: warning: previous implicit declaration of f was here

Typedefinisjoner Typedefinisjoner For å unngå lange typenavn kan vi gi dem navn: typedef unsigned long ul; typedef struct a str_a; Nå ul og str_a brukes i deklarasjoner på lik linje med int, char etc.

Typekonvertering Typekonvertering I C (som i Java) kan man konvertere en verdi fra én type til en annen: (type)v Dette er aktuelt for heltall av ulike størrelser: short x = 22; f((long)x); heltall til flyt-tall og omvendt: double pi = 3.14159265; i = (int)pi; NB! Heltall blir trunkert. pekere til ulike verdier: int *p = &v; node *np = (node*)p; char *addr = (char*)0x12302;

Sammenhengen 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.

Sammenhengen Følgende to funksjoner er derfor fullstendig ekvivalente: int strlena (char str[]) { int ix = 0; while (str[ix]) ++ix; return ix; } int strlenb (char *str) { char *p = str; while (*p) ++p; return p-str; } Eksempler på kall: int la, lb; unsigned char s[10]; strcpy(s, "Abc"); la = strlena(s); lb = strlenb(s);

Indeksering 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). a[0] a[1] a[2] a[3] a[4] a[5] a +3 0x12340000 0x12340001 0x12340002 0x12340003 0x12340004 0x12340005 0x12340006 0x12340007 0x12340008 0x12340009

Pekeraritmetikk 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å.»

Pekeraritmetikk #include <stdio.h> typedef unsigned long ul; int main(void) { char *cp = (char*)0x123400; long *lp = (long*)0x123400; cp++; lp++; printf("cp = 0x%lx\nlp = 0x%lx\n", (ul)cp, (ul)lp); return 0; } gir følgende når det kjøres: cp = 0x123401 lp = 0x123408

Pekere til pekere 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 xxx *p; må en «peker til en peker» angis som xxx **pp; Dette kan utvides med så mange stjerner man ønsker.

Pekere til pekere Eksempel Omgivelsesvariabler i Unix inneholder opplysninger om en bruker og hans eller hennes preferanser: LOGNAME=dag PAGER=less HOSTTYPE=sgi PRINTER=prent HOME=/home/ansatte/03/dag SHELL=/local/gnu/bin/bash

Pekere til pekere Omgivelsen overføres nesten alltid fra program til program ved en global variabel: extern char **environ; Pekeren environ peker på en vektor av pekere som hver peker på en omgivelsesvariabel og dens definisjon. environ 0 LOGNAME=dag PAGER=less HOSTTYPE=sgi PRINTER=prent HOME=/home/ansatte/03/dag SHELL=/local/gnu/bin/bash

Noen vanlige feil Vanlige pekerfeil Det er noen feil som går igjen: Glemme initiering av pekeren! long *p; printf("verdien er %ld.\n", *p);

Noen vanlige feil Glemme frigjøring av objekt! long *p; p = malloc(sizeof(long)); p = NULL; Det allokerte objektet vil nå være utilgjengelig, men vil «flyte rundt» og oppta plass så lenge programmet kjører. Dette kalles en hukommelseslekkasje.

Noen vanlige feil La en global peker peke på lokal variabel! long *p; void f(void) { long x; } p = &x; f(); p peker nå på en variabel som ikke finnes mer. Stedet på stakken der x lå, kan være tatt i bruk av andre funksjoner.

Noen vanlige feil Peke på resirkulert objekt! long *p, *q; p = q = malloc(sizeof(long)); free(p); p = NULL; q peker nå på et objekt som er frigjort og som kanskje er tatt i bruk gjennom nye kall på malloc.

Sammenligning med Java-klasser struct-er i C I Java kan man sette sammen flere datatyper til en klasse. I C har man noe tilsvarende: Java C class A { struct a { int a, b, c; int a, b, c; float f; float f; char ch; unsigned char ch; } }; Cs struct-er er rene datastrukturer; der kan man ikke ha metoder.

Deklarasjon av struct -er Deklarasjon av struct-variabler Struct-variabler deklareres som andre variabler: struct a astr; Følgende skiller slike deklarasjoner fra de tilsvarende i Java: Struct-ens navn består at to ord: struct (som alltid skal være der) og a (som programmereren har funnet på). Man trenger ikke opprette noe objekt med new.

Bruk av struct -er Bruk av struct-variabler Struct-variabler brukes ellers som i Java: astr.b = astr.c + 2; if (astr.f < 0.0) astr.ch = x ;

Pekere til struct -er Pekere til struct-er Vi kan selvfølgelig peke på struct-variabler: struct a *pa = malloc(sizeof(struct a)); (*pa).f = 3.14; Legg merke til at vi trenger parentesene rundt pekervariabelen fordi *pa.f tolkes som *(pa.f). Fordi vi så ofte trenger pekere til struct-objekter, er det innført en egen notasjon for dette: pa->f = 3.14;

Fordeler og ulemper Lister Enkle lister Operasjoner på lister Fordelene med lister: Dynamiske; plassforbruket tilpasses under kjøringen. Fleksible; innenbyrdes rekkefølge kan lett endres. Generelle; kan simulere andre strukturer. Ulemper med lister Det kan lett bli en del leting, så lange lister kan være langsomme i bruk.

Hvordan ser en liste ut? En enkel liste struct elem { struct elem *neste;... diverse data... }; struct elem *liste; liste 0 Listepekeren liste peker på første element. Denne listen kan simulere Stakker Køer Prioritetskøer

NULL-pekeren Peker til «ingenting» I C er konvensjonen at adressen 0 er en peker til «ingenting». I mange definisjonsfiler (som stdio.h) er NULL definert som 0.

Innsetting i lister Innsetting først i listen p->neste = liste; liste = p;... liste... liste p p

Man-sider Informasjon om C Den viktigste kilden til informasjon om C (utenom en god oppslagsbok) er programmet man. Det dokumenterer alle C-funksjonene. > man sqrt SQRT(3) Linux Programmer s Manual SQRT(3) NAME sqrt, sqrtf, sqrtl - square root function SYNOPSIS #include <math.h> double sqrt(double x); float sqrtf(float x); long double sqrtl(long double x); Link with -lm. DESCRIPTION The sqrt() function returns the non-negative square root of x. It fails and sets errno to EDOM, if x is negative. ERRORS EDOM x is negative. SEE ALSO hypot(3)

Man-sider Kapitler i man Man-filene er organisert i kapitler; vi er mest interessert i 1 Kommandoer (som gcc) 2 Unix-operasjoner (som kill) 3 C-funksjoner (som printf) Hvis navnet finnes i flere kapitler, får vi ikke alltid det vi ønsker. > man exit BASH_BUILTINS(1) BASH_BUILTINS(1) NAME bash, :,., [, alias, bg, bind, break, builtin, cd, command, compgen, complete, continue, declare, dirs, disown, echo, enable, eval, exec, exit, export, fc, fg, getopts, hash, help, history, jobs, kill, let, local, logout, popd, printf, pushd, pwd, read, readonly, return, set, shift, shopt, source, suspend, test, times, trap, type, typeset, ulimit, umask, unalias, unset, wait - bash built-in commands, see bash(1)

Man-sider Bedre er å angi kapittelet eksplisitt: > man 3 exit EXIT(3) Linux Programmer s Manual EXIT(3) NAME exit - cause normal program termination SYNOPSIS #include <stdlib.h> void exit(int status); DESCRIPTION The exit() function causes normal program termination and the the value of status & 0377 is returned to the parent (see wait(2)). All functions registered with atexit() and on_exit() are called in the reverse order of their registration, and all open streams are flushed and closed. Files created by tmpfile() are removed..