C for Java-programmerere

Slides:



Advertisements
Liknende presentasjoner
Repetisjon innkapsling static tabell av primitiv datatype LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring.
Advertisements

Tabeller av objekter Klassen ArrayList
14 okt. 2003, Arne Maus Inst. for informatikk, UiO
C++ for Java-programmerere
Datafiler og serialisering Tekstfiler Scanner-klassen Binær overføring av data Direkte tilgang til filinnholdet Serialisering LC191D Videregående programmering.
Intro til programmering i Processing
JSP presentasjon Arild Strømhylden NTNU 26 June 2014.
Uke 10 - Sortering, og hvordan lage en klasse for et klassebibliotek 21 okt. 2003, Arne Maus Inst. for informatikk, UiO.
Uke 8 - Mer om: Objekter, klasser og pekere
1 Java 6 Mer om metoder Tekster Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo.
1 Litt om OO og programmering Arne Maus. 2 OO og Java (og C++, C#)  Arven fra Simula  Programstruktur i Java  Generering av objekter  Beskyttelse.
Java 12 Mer filbehandling - skrive til fil HashMap Et større eksempel Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet.
Java 4 Mer om forgreninger While-løkker Ole Christian Lingjærde
Objekt, Instanser og referanser + litt til. Objekter  Instanser  En instans er et objekt av en bestemt klasse  Instanser blir laget ved å kalle klassens.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
IS-102 Klassedefinisjoner
#include Ligner litt på import i java. Setter inn hele fila stdio.h i programteksten. Definerer en del io funksjoner slik at signaturen er kjent. I dette.
Tema: Introduksjon Hvorfor Velocity? Installasjon Velocity VS. JSF / JSP Eksempler Oppsumering.
C# for javaprogrammerere
@ TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Åsmund Eldhuset asmunde stud.ntnu.no.
Krasjkurs i C (pluss litt matlab)
Åsmund Eldhuset asmunde stud.ntnu.no folk.ntnu.no/asmunde/algdat/
TDT4120 Algoritmer og datastrukturer Introduksjon til øvingsopplegg og programmering i Python Basert på foiler av Åsmund Eldhuset Flikket på og presentert.
Generelt I/O if/else Funksjoner Lists Løkker Dictionaries Annet Listebehandling Klasser Python med noen algdat-anvendelser Åsmund Eldhuset asmunde *at*
En gang til!? .
INF150 Programmering mandag 11.9
Objekt Orientert Programmering (OOP). Objektorientering (OO)1/6 Objektorientering er en grunnleggende måte å organisere komplekse fenomener på.
Introduksjon til Java 5.0. Hva er nytt i 5.0? Generiske typer For-løkke med iterator (for-hver løkke) Automatisk innpakking av primitive typer Metadata.
1 Kap 08 Kø. 2 Kø - Definisjon En kø (eng queue) er en lineær struktur hvor elementer kan innsetttes kun i den ene enden av listen, kalt bak, og fjernes.
Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon august 2004 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
Programmering i Java versjon Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik.
std::basic_string En oversikt over C++ Standard bibliotekets streng-klasse.
1 Organisering av kode (Kapittel 5). 2 Mål ● Forstå inkludering er og hvilken gevinst det gir ● Lære å utvikle egne funksjoner ● Forstå variablenes virkemåte.
Grunnleggende PHP - Ronny Mandal1 Grunnleggende PHP.
Intro til php - Uke3.2 - Ronny Mandal Introduksjon til PHP.
Publisering på verdensveven Kursdag 2 VÅFF, våren 2002.
Dynamiske nettsider PHP Del 2 – Kontrollstrukturer.
Dynamiske nettsider PHP Del 1 – variable. PHP  PHP (Personal Home Page)  Fritt tilgjengelig programmeringsspråk  åpen kildekode  Plattformuavhengig.
Uke 7 - del I: Repetisjon del II: Objekter, klasser og pekere 30 sept. 2003, Arne Maus Inst. for informatikk, UiO.
Java 3 Mer om uttrykk Terminal I/O Forgreninger
Java 11 Programmering med og uten objekter: hva er forskjellen?
Hvordan kan foreldre bruke de vangligste funksjonene i Itslearning.com
Å lese tall fra en fil, klassen Scanner 1.Et Scanner-objekt kan knyttes til et strømobjekt eller til en streng. 2.Kan skanne teksten etter data av ulike.
Oppgaver til kodegenerering etc. INF-5110, 2013 Oppgave 1: Vi skal se på koden generert av TA-instruksjonene til høyre i figur 9.10 i det utdelte notatet,
Programmering sif8005. Praktisk informasjon  Innleveringsfrist øvinger: mandag kl  Alle øvinger er obligatoriske  Studass tilgjengelig 6 timer.
1 Pointere, referencer, struct’s mv.. 2 Erklæringer Eksempel på erklæringer int i, *ip, f ( ), *fip( ), (*pfi) ( ); Erklærer en integer, en pointer til.
Tabeller Dette er en tabell, eller array. Den kan defineres sånn som dette: public int[] heltallsTabell = new int[11]; //Her er 11 tabellens lengde for.
1 Java Database Connectivity (JDBC) Norvald H. Ryeng
Objekt, Instanser og referanser + litt til. Objekter  Instanser  Kan sees på som det samme. Personen Per kan være både et objekt og en instans av klassen.
Main metoden n public static void main(String[] args){ } n Inni denne metoden skjer alt! n Det kan bare finnes en main metode per program. n Den kan ligge.
INF Objektorientert programmering
Object  Klassen i java  Alle klasser arver fra denne om ikke noe annet blir spesifisert  ArrayList.add(Object instans)  Alle elementer formes til Object.
INF1000 (Uke 14) Eksamen V06 Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo Are Magnus Bruaset og Arild Waaler.
Byggeklosser i java  Klassedefinisjon  Variabel deklarasjon  Metodedeklarasjoner  En ordentlig klasse  Spesielle/kryptiske skrivemåter  løkker og.
Jæger: Robuste og sikre systemer INF150 Programmering mandag 25.9 MER OM: Sub-prosedyrer og sub-funksjoner Kap 4.
Inf1000 (Uke 10) HashMap og ArrayList
INF1000 (Uke 4) Mer om forgreninger, While-løkker
XML og JDOM Helge Furuseth XML  XML = Extensible Markup Language Basert på SGML – Standard Generalized Markup Language  HTML =
Inf1000 (Uke 5) Arrayer, filer og tekst
Kapittel 5 Vilkårssetningar og løkker. 5.1 Boolske uttrykk George Boole ( ), britisk matematikar Utvikla teori om logikk ved bruk av symbol i.
Kapittel 7 Array (lister og tabellar). 7.1 Arrayelement Array (lister, tabellar) er kjent frå VB Blir brukt til å organisere data når vi har mange dataelement.
Jæger: Robuste og sikre systemer INF150 Programmering torsdag 14.9 Ulike måter for å lese inn og skrive ut data. Kap. 3.5 mer om if – setninger Ferdige.
Lokale variable Hvis vi trenger å ta vare på en verdi, inne i en metode kan vi definere en lokal variabel: int amount = 0; vi må fortelle hvilken type.
Variabler, datatyper og uttrykk
IS-102 Interaksjon med objekter
Spillutvikling Introduksjon til spillutvikling i Processing
Begynnerkurs i Python Realfagskonferansen 2019 Henrik H. Løvold
Siste uke med fokus på Python  Java
Utskrift av presentasjonen:

C for Java-programmerere Åsmund Eldhuset for Anne C. Elster / TDT4200 asmunde *at* stud.ntnu.no http://www.idi.ntnu.no/~asmunde/c-kurs.ppt Vil prøve å avdekke en del feller slik at dere slipper å skyte dere selv i foten i størst mulig grad, men har sikkert glemt både det ene og det andre... Husk å minne om at folk kan stille spørsmål

Litt historie C ble utviklet på 70-tallet av Brian W. Kernighan og Dennis M. Ritchie Designet for systemprogrammering under UNIX C++ ble utviklet på 80-tallet av Bjarne Stroustrup Bygger på C; første utgave het "C with classes" Hentet mange ideer fra norskutviklede Simula (verdens første objektorienterte språk) Både C og C++ er åpne og ISO-standardiserte Inspirert av BCPL og B UNIX ble senere skrevet på nytt i C

Argumenter for C Raskere enn Java Java kjøres av en Virtual Machine C kompileres til maskinkode Gir nærkontakt med systemet – dermed meget godt egnet til systemprogrammering (operativsystemer, mikrokontrollere etc.) Du kan gjøre så godt som alt som er mulig å gjøre med datamaskinen Nerdefaktor

Argumenter mot C Mindre nybegynnervennlig Lett å skyte seg selv så til de grader i foten Uforsiktighet kan føre til obskure minnelekkasjer Portabiliteten varierer med hva man foretar seg Utvikling tar generelt sett lengre tid enn med C++, Java og C# Ikke objektorientert

Når bruke C? Når du trenger rå hastighet (spill, grafikk, tungregning, algoritmekonkurranser) Når du driver systemprogrammering Når du arbeider med eksisterende C-systemer Når du har lyst til å leke deg med programmering Når du tar TDT4200

Dette finnes ikke i C: Klasser Generics/templates Exceptions Arv Polymorfi Virtuelle og abstrakte metoder Interfaces Generics/templates Exceptions Referanser (C++-konsept) Reflection/introspection

Kompilatorer og IDE'er Kompilator oversetter koden til maskinkode IDE = Integrated Development Environment (kombinerer editor, kompilator og debugger) Linux: Kompilator: gcc / g++ Debugger: gdb Editor: det du foretrekker Windows: Microsoft Visual Studio (http://msdn.microsoft.com/vstudio/express/visualc/) Bloodshed Dev-C++ (http://www.bloodshed.net/devcpp.html) MSVS kan lastes ned gratis fra

Bruk av gcc Kompilering: gcc kildefil For C99-modus, bruk flagget -std=c99 Kjøring: ./a.out Kompilere flere filer: gcc kilde1 kilde2 ... Endre navnet til outputfilen: gcc -o outputfil kildefil ./outputfil Skyte seg selv i foten: gcc -o kildefil kildefil (sletter kildekoden din)

Minimalt program int main() { return 0; } Vi legger merke til: Typen til main() er int, ikke void Ingen String [] args (skal programmet ta imot argumenter, skriv int argc, char * argv []) main() er ikke public static og står ikke inni noen klasse (klasser finnes jo ikke i C – tilsvarer at alle metodene er static) Dette var jo ikke så ille?

Del I: Grunnleggende C

Hello World // Dette er et Hello World-program #include <stdio.h> int main() { printf("Hello World!\n"); return 0; }

Hello World Kommentarer lages med // eller /* */ printf(x); tilsvarer System.out.println(x);, men kan bare brukes slik hvis x er en streng #include minner om import, men fungerer ved å "lime inn" en fil (mer om dette senere) stdio.h er et bibliotek som inneholder IO-støtte (f.eks. printf)

Output: printf printf baserer seg på formatstrenger – først kommer en streng som beskriver datatypene til det som skal skrives ut, og så kommer dataene som skal skrives ut printf(x) skriver ut en streng – må aldri brukes hvis innholdet i x kan inneholde prosenttegn (f.eks. hvis den inneholder data som kommer fra brukeren) printf("%s", x) skriver ut en streng på trygg måte printf("%d", x) skriver ut en int Formatstrengen kan også inneholde andre tegn. Linjeskift lages med \n

Formatflagg %s – streng (char *) %d – int %u – unsigned int %ll – long long (pass på: long er 32 bits) %c – enkelttegn (char) %p – peker/minneadresse %x – int på heksadesimal form %f – float %lf – double Antall desimaler kan styres slik: %.3f For faktisk å skrive ut et prosenttegn: %%

Input: scanf Samme formatstreng-konsept (men her må formatstrengen alltid være med) scanf("%d", &x) leser inn en int Merk &-tegnet – må være med for alle datatyper annet enn for strenger: scanf("%s", x) (som leser inn ett ord) Kan lese inn flere ting etter hverandre: scanf("%d%s%f", &x, y, &z)

Variabler Variabler lages og brukes på samme måte som i Java C har følgende primitive datatyper: char (tilsvarer byte og til en viss grad char) short int long (32 bit!) long long (64 bit) float double float/double complex unsigned kan brukes foran heltallstypene Funksjoner kan også ha void som type

If/else, for, while ... fungerer på samme måte som i Java! Kun én forskjell: betingelser i if/else og while kan være heltall (0 blir false, alt annet blir true) og pekere (NULL blir false, alt annet blir true) int x, y; scanf("%d%d", &x, &y); if (y) printf("%d\n", x / y); else printf("Nevneren er 0!\n");

Deklarasjon av funksjoner Før en funksjon brukes, må kompilatoren vite at funksjonen eksisterer Dette kan gjøres på to måter: Funksjonen kan allerede være definert (dvs. at funksjonskoden står lenger oppe i kodefilen) Definisjonen kan finnes i en annen fil, og funksjonen kan deklareres (dvs. at man bare skriver metodenavnet) Eksempel: funksjonen int square(int n) { return n * n; } kan deklareres slik: int square(int);

Biblioteker og headerfiler C-kompilatoren kompilerer én fil av gangen uavhengig av alle de andre Biblioteksfunksjonene ligger i ferdigkompilerte filer Headerfiler inneholder deklarasjoner som forteller hvordan biblioteksfunksjonene ser ut Hvis f.eks. kompilatoren ser int square(int);, stoler den på at det finnes en slik funksjon. Den kompilerer koden som bruker square() og prøver etterpå å koble inn square() sin egen kode Sammenkoblingsprogrammet kalles for en linker, og er som regel en del av kompilatoren

Biblioteker og headerfiler Man kan selv lage prosjekter som består av flere kodefiler Koden deles opp i kodefiler (.c) og headerfiler (.h) Headerfilene inneholder deklarasjoner (navn og parameterlister for metoder og klasser) Kodefilene inneholder definisjoner (den faktiske implementasjonen / koden) #include "limer inn" koden fra en fil, og skal bare brukes for å inkludere headere

Headerfiler og linking Originale kilde- og headerfiler før preprosessering: xor.h math.h bool xor(bool, bool); double sin(double); xor.c main.cpp #include "xor.h" bool xor(bool a, bool b) { return a && !b || !a && b; } #include "xor.h" #include <math.h> int main() { printf("%lf\n", sin(0.5)); printf("%d\n", xor(true, false)); return 0; }

Headerfiler og linking Headerfiler limes inn i kildefiler under preprosessering: xor.h math.h bool xor(bool, bool); double sin(double); xor.c main.c bool xor(bool, bool); bool xor(bool a, bool b) { return a && !b || !a && b; } bool xor(bool, bool); double sin(double); int main() { printf("%lf\n", sin(0.5)); printf("%d\n", xor(true, false)); return 0; }

Headerfiler og linking Kildefilene kompileres separat: xor.c main.c bool xor(bool, bool); bool xor(bool a, bool b) { return a && !b || !a && b; } bool xor(bool, bool); double sin(double); int main() { printf("%lf\n", sin(0.5)); printf("%d\n", xor(true, false)); return 0; } xor.obj main.obj [Contains bool xor(bool, bool)] [Contains main()] [References bool xor(bool,bool)] [References double sin(double)]

Headerfiler og linking Objektfilene linkes for å produsere programfilen: xor.obj main.obj [Contains bool xor(bool, bool)] [Contains main()] [References bool xor(bool,bool)] [References double sin(double)] math.obj [Contains double sin(double)] main.exe

Include guards Hvis en headerfil inkluderer en annen og begge to inkluderes i en tredje fil, blir det kollisjoner Include guards hindrer kollisjonene #ifndef FILENAME_H #define FILENAME_H (resten av filen her) #endif math.h double sin(double); main.h #include <math.h> main.cpp #include <math.h> #include "main.h"

Del II: Pekere

Pekere En variabel som inneholder en minneadresse Bruk * i deklarasjoner for å lage "peker-til-datatype" Bruk & for å finne adressen til en variabel Bruk * for å dereferere en peker (lese innholdet i adressen det pekes til) C bruker NULL i stedet for null Ved deklarasjon av flere pekere må * gjentas for hver peker int a = 42; int * p = NULL; p = &a; printf("%p\n", p); printf("%d\n", *p); p a 0x32 42 0x04 0x32 p a 42

Triksing med pekere int a = 3; int * p, * q; p = &a; q = &a; *p = 42; printf("%d\n", a); printf("%d\n", *q);

Peker-til-peker-til... int a, * p, ** q, *** r; a = 42; p = &a; q = &p; r = &q; printf("%p\n", r); printf("%p\n", *r); printf("%p\n", **r); printf("%d\n", ***r); r q p Kunne godt ha endret rekkefølgen på assignmentene; & endrer ingenting, og pekerassignment påvirker bare pekeren a 42

Funksjonsargumenter Alle argumenter sendes som kopi Følgende gir dermed ikke det tenkte resultatet: void swap(int a, int b) { int temp = a; a = b; b = temp; } Vi sender pekere i stedet, for da får vi modifisert dataene gjennom pekerne: void swap(int * a, int * b) { int temp = *a; *a = *b; *b = temp; } Sistnevnte funksjon må kalles slik: swap(&a, &b) Illustrer på tavla

void * og casting En void * kan peke til hva som helst (omtrent som et Object i Java) Alle slags pekere kan assignes til void * Kan brukes til å lage funksjoner som kan ta inn vilkårlige typer (f.eks. compare-funksjonen man må lage når man vil bruke qsort-funksjonen) Kan caste ting tilbake på samme måte som i Java (int)f vil konvertere f til en int (int*)p vil se på det p peker på og tolke det som en int Men dette er IKKE typesikkert – det sjekkes aldri om casts er "riktige"! float f = 3.14f; int * i = (int *)&f; printf("%d\n", *i);

Arrays Et array er bare et sammenhengende minneområde av samme datatype En peker kan derfor brukes til å peke til starten av et array Arrays lages ved å spesifisere hvor mange bytes du trenger: int * array = malloc(sizeof(int) * 4); array

Arrays Arrays er 0-indekserte og aksesseres som i Java: array[2] = array[1] + array[0]; Bak kulissene foregår oppslag på array[i] slik: Adressen i array leses Størrelsen til datatypen som array peker til ganges med i og adderes til adressen for å finne hvor dataene ligger array 0x32 4 bytes 0x32 0x36 0x40 0x44

Arrays Arrays vet ikke hvor store de er, og du får ingen exception (eksisterer ikke i C) hvis du går utenfor grensene int * array = malloc(sizeof(int) * 8); for (int i = -1; i <= 8; ++ i) printf("%d\n", array[i]); Ingen feilmelding Du får ut data Programmet kan krasje noen ganger, og fortsette andre ganger Etter bruk må et array slettes: free(array);

Flerdimensjonale arrays int ** array = malloc(sizeof(int*)*3); for (int i = 0; i < 3; ++ i) array[i] = malloc(sizeof(int)*4); array

Del III: Structs, strenger, makroer og minnebehandling

Structs Tilsvarer klasser som kun inneholder public-variabler, og ingen metoder Kan ikke arves (men de kan komponeres, altså at en struct inneholder en annen) Constructors og destructors eksisterer ikke, men dette og andre medlemsmetoder kan simuleres ved å lage metoder som tar struct-pekere som parametre

Structs struct Person { int age; char * name; }; Merk semikolonet Struct-variabler må deklareres som struct Person p; Hvis man skriver typedef struct { int age; char * name; } Person; kan variablene deklarereres som Person p;

Structs Struct-variabler inneholder dataene i stedet for å peke til dem, akkurat som primitive variabler Sender man en struct til en funksjon, får funksjonen en kopi Skal funksjonen modifisere struct'en, må den få en peker Struct-medlemmer kan aksesseres gjennom en peker: p->age

Arrays med structs Primitive typer: int * intArray = malloc(sizeof(int) * 4); Structs: Car * carArray = malloc(sizeof(Car) * 4); Structpekere: Car ** carPointerArray = malloc(sizeof(Car *) * 4); for (int i = 0; i < 4; ++ i) carPointerArray[i] = malloc(sizeof(Car));

Arrays med structs a a[0] a[1] a[2] a[3] car car[0] car[1] car[2]

Arrays med structs cp cp[0] cp[1] cp[2] cp[3] *cp[3] *cp[2] *cp[1]

Strenger Det finnes ingen innebygd streng-datatype En streng er et array av tegn: char * str; eller char [] str; Må bruke funksjoner for å behandle strenger: strcmp – sammenligner to strenger og returnerer <0, 0 eller >0 (samme som compareTo i java) strcat – konkatenerer strenger strcpy – kopierer en streng Pass på minnet! String literals kan vanligvis ikke modifiseres (kompilatoren kan plassere dem i et spesielt minnesegment) Kan bruke sprintf for å "printe" til en streng

Makroer I praksis en søk og erstatt-funksjonalitet Evalueres under preprosesseringsfasen Kan brukes til å deklarere konstanter: #define PI 3.14159 Merk: ingen semikolon – alle forekomster av identifikatoren PI (utenfor strenger) vil bli erstattet med alt som står etter PI i deklarasjonen Kan også brukes til å deklarere en slags funksjoner som automatisk blir inline't (så man slipper overhead ved funksjonskall), men her er det mange feller å gå i

Makroer #define lookup(a, r, c, w) (a)[(r) * (w) + (c)] lookup(array, r, c, width) vil da bli skrevet om til (array)[(r) * (width) + (c)] Parentesene er der i tilfelle man f.eks. skriver lookup(array, r + 1, c, width) Man kan referere til variabler i definisjonen, men disse vil bli evaluert der makroen brukes, så dette er potensielt sett veldig farlig: #define lookup(a, r, c) (a)[(r) * width + (c)] er lov hvis width er definert (og har riktig verdi) der man skriver lookup(array, r, c) Argumenter blir ikke evaluert før de sendes til makroen, så hvis man har #define square(a) (a)*(a) vil square(n++) bli til (n++)*(n++) (og det er ikke en gang lov å endre en variabel mer enn én gang i samme statement)

Minnebehandling C har ingen garbage collector Du er selv ansvarlig for å frigi minne du ikke trenger lenger, med free Regler for trygg minnebehandling: Ta alltid vare på resultatet fra malloc Hver gang du skriver malloc, husk å plassere en free på et passende sted Vær veldig påpasselig med ikke å free'e det samme to ganger! Når du free'er en struct som peker til noe, bør du finne ut om dette også er rett sted å free'e det den peker til (svaret kan være nei; kanskje andre objekter fortsatt peker til det samme)