Att använda pekare i. C-kod

Storlek: px
Starta visningen från sidan:

Download "Att använda pekare i. C-kod"

Transkript

1 Att använda pekare i C-kod (Bör användas av de som känner sig lite hemma med C-programmering!) Rev 1, av Ted Wolfram

2 Syfte: Man kan tycka att det är komplicerat att använda pekare när man programmerar i C men det finns tre stora fördelar som man måste beakta: Programmet kommer att gå mycket snabbare samt att man slipper använda globala variabler som tar upp en massa ramminne. Man kommer även att spara ROM-minne också om man gör det på ett snyggt sätt vilket visas i exemplen nedan Vad är en pekare? En pekare är inget annat än en variabel som pekar på en minnesadress. Detta är väldigt användbart då man ska skicka långa strängar eller arrayer till en funktion och sedan göra något med den som t.ex. förändrar dess värde innan man går vidare. Med pekare räcker det att bara skicka startadressen för hela textsträngen! Även om man bara skickar in en textsträng för utskrift på t.ex. en display är det att föredra om man använder pekare. Man slipper allokera en massa RAM-minne och det hela går snabbare. Varför använda dessa På följande sidor har jag bifogat tre exempel på hur effektivt det är med pekare istället för andra lösningar Dessa exempel är kompilerade med HITECH PICC18 v8.35pl2 och avsedda att användas med PIC18 serien. Alla program utför samma sak; Det finns två arrayer, array1 och array2, de är båda 200 byte långa och ges två olika startvärden. Därefter är vitsen att man ska öka alla värden i de båda arrayerna med 1. Givetvis är detta ett enkelt exempel på hur man kan göra, vanligtvis gör ju funktionen något helt annat än att bara addera 1 till var indexvärde

3 Exempel 1 Här använder vi inte pekare utan man anropar en funktion som ökar värdet med 1, sedan sparas det i en global variabel som man sedan måste kopiera resultatet från för att få tillbaka det förändrade värdet till string1 eller string2. Så här måste man göra om man vill få tillbaka resultatet i den sträng som skickades in i funktionen och använda det till något vettigt. #include <pic18.h> static char glob_array[200]; void main_utanpekare(unsigned char array[]) glob_array[i] = array[i] + 1; // Öka vart index med 1... void main() static unsigned char array1[200], array2[200]; // Ge array1 & array2 startvärden... array1[i] = i; array2[i] = i; main_utanpekare(array1); // Öka strängens värde med 1 array1[i] = glob_array[i]; // Kopiera till array1 main_utanpekare(array2); array2[i] = glob_array[i]; // Samma sak med array2... Efter att ha kompilerat detta program upptog det: 230 byte ROM 603 byte RAM Tiden det tog att köra programmet från main_utanpekare(array1); till tog instruktionscykler!

4 Exempel 2 Här använder vi pekare istället och då ser programmet ut enligt följande: #include <pic18.h> void main_pekare(unsigned char *parray) *parray = *parray + 1; // Öka värdet med 1.. // OBS! Det går inte att skriva // *parray++!!!! parray++; // Öka pekaradressen med 1... void main() static unsigned char array1[200], array2[200]; // Ge array1 & array2 startvärden... array1[i] = i; array2[i] = i; main_pekare(&array1[0]); // Öka arrayens värde med 1 main_pekare(&array2[0]); // Samma sak med array2... Efter att ha kompilerat detta program upptog det: 138 byte ROM Exempel 1 blev 1,6 ggr större, detta gäller givetvis inte alls för större program! 403 byte RAM Här blev det 200 byte mindre pga. att det inte behövs någon global variabel! Det viktigaste av allt är dock att tiden det tog att köra de två funktionerna main_pekare(&array1[0]); och main_pekare(&array2[0]); endast blev: 4026 instruktionscykler! Det är mer än 4 ggr snabbare!

5 Exempel 3 Mitt exempel gör ju inget annat än adderar 1 till alla element och i och med det går det givetvis att hoppa över funktionsanropet och göra en forloop som sköter det hela för var array. Givetvis krävs denna loop för var array, vilket man slipper om man har en funktion som sköter detta. Detta funkar ju inte om nu funktionen utför lite mer avancerade saker än att bara addera 1 till arrayen för då blir det ohållbart mycket kod att kompilera. (Samma kod till var array som ska bearbetas!) OK, då visar vi hur det kan gå till. #include <pic18.h> void main() static unsigned char array1[200]; static unsigned char array2[200]; // Ge array1 & array2 startvärden... array1[i] = i; array2[i] = i; array1[i]++; // Öka array1 med 1... array2[i]++; // Öka array2 med 1... Efter att ha kompilerat detta program upptog det: 130 byte ROM Exempel 2 blev faktiskt 1,1 ggr större, men lägg till en array till som ska modifieras så blir det större än Exempel 2! 400 byte RAM Här blev det bara 400 byte i RAM. Hur lång tid tog det då att köra de två for-looparna? Jo det tog 4800 instruktionscykler vilket innebär att det tog 1,2 ggr längre tid än Exempel 2! Skulle man sedan ha 3 arrayer att kopiera så skulle Exempel 3 ta upp mer ROM än Exempel 3.

6 Att använda pekare i C Översikt Som det har nämnts tidigare är pekare en variabel som pekar på en adress i processorns RAM-minne. OBS! Det är viktigt att man håller reda på vart i minnet man är och arbetar i, särskilt när man håller på med strängar och arrayer. Annars kan det lätt bli konstiga problem om man pekar utanför den sträng/array man vill arbeta med och därmed ändrar i någon annan variabel. OBS! Deklarationer: Här är ett exempel på hur pekare deklareras: unsigned char intepekare, intepekarr[10]; unsigned char *pekare1, *pekare2, *pekare3; pekare1 = &intepekare; // 1 *pekare1 = 5; // 2 pekare2 = &intepekarr[0]; // 3 pekare3 = &pekare2[1]; // 4 Förklaring: 1. pekare1 pekar nu på intepekare:s RAM-adress 2. Detta är samma sak som att skriva: intepekare = 5; 3. pekare2 pekar på intepekarr[0]:s RAM-adress När man pekar på en array måste man ange ett index på vart i arrayen man pekar. 4. pekare3 pekar på intepekarr[1]:s RAM-adress Likaså här måste man ange ett index i förhållande till pekaren vart man pekar, kan vara negativt! Sammanfattning Genom att sätta en * framför variabelnamnet i deklarationen berättar det för kompilatorn att det är en pekare. Ett & framför en variabel ger adressen till var den är lagrad i RAMminnet. En * framför en pekare behandlar värdet för adressen den pekar på.

7 Exempel: Om man ska skriva ett mellanslag på alla positioner genom att använda pekaren gör man följande: unsigned char txt[10], *ptxt; ptxt = &txt[0]; for(i=0;i<10;i++) *ptxt = ; ptxt++; // Spara ett mellanslag på den adress // pekaren pekar på... // Peka på nästa fält i strängen När man skriver en * framför pekaren i funktionen betyder det att man sparar i adressen! Så i vårt fall sparas ett mellanslag på den adress som pekaren pekar på. Koden: ptxt++; gör inget annat än räknar upp adressen. Pekare i funktionsanrop Om man vill anropa en funktion som använder pekare gör man följande: // Funktion som använder pekare... void pfunct(unsigned char *p) *p = *p + *p; // Dubbla värdet i den RAM-adress som *p pekar på. void main(); unsigned char foo = 8; pfunct(&foo); // Skicka in RAM-adressen för foo // foo kommer nu att vara 16!! Här finns det en funktion som har pekare i sitt funktionsanrop, då måste den variabel som skickas till funktionen ha ett & framför sig i funktionsanropet. Vad händer här då? Jo variabeln foo är en vanlig char och därmed måste man skicka in RAM-adressen för denna variabel när man anropar funktionen pfunct(); Adressen får man om man skriver & framför den variabel som skickas in. I detta fall &foo.

8 Väl inne i funktionen pfunct har pekaren p samma adress som foo och därmed måste man för att förändra värdet på p skriva *p. Raden *p = *p + *p; gör följande: *p = värdet för den adress som *p pekar på och därmed adderas det med sig själv och sparas på samma adress. Skicka arrayer till funktioner Om man vill skicka in adressen till en array så får man göra följande: // Funktion som använder pekare... void funcarr(unsigned char *p) for(i=0;i<10;i++) *p = i; // Ge pekarens adress värdet i // (Adressen är inte lika med i!!!) P++; // Öka pekaren med 1 void main(); unsigned char arr[10]; funcarr(&arr[0]); // Skicka in RAM-adressen till arr[0] När man använder strängar måste man skicka en adress i arrayen. I exemplet ovan skickar vi in adressen till position 0 (&foo[0]), givetvis kan man skicka in vilken adress som helst, även adresser utanför arrayens längd vilket kan medföra vissa problem som ni kanske förstår, kompilatorn varnar dock om detta inträffar...

9 Skicka en pekare till en funktion som anropas med pekare Om man vill skicka vidare en pekare från en funktion till ytterligare en funktion som anropas med pekare gör man följande: // Funktion 1 som använder pekare... void funcarr1(unsigned char *p) funcarr2(p); // Eftersom p är en adress behöver // man inte skriva & framför p!!! // Funktion 2 som använder pekare... void funcarr2(unsigned char *p) *p = *p + 1; // Öka adressens värde med 1 => foo = foo + 1!! void main(); unsigned char foo; Funcarr1(&foo); // Skicka in RAM-adressen till foo Skicka en pekare till en funktion som inte anropas med pekare Om man vill skicka vidare en pekare från en funktion till ytterligare en funktion som inte anropas med pekare gör man följande: // Funktion 1 som använder pekare... void funcptr(unsigned char *p) funcnotptr(*p); // Eftersom p är en adress måste man // skriva * framför p för att få värdet!!! // Funktion 2 som inte använder pekare... void funcnotptr(unsigned char test) test++; // test = foo + 1!! Däremot ändras inte foo!! void main(); unsigned char foo; funcptr(&foo); // Skicka in RAM-adressen till foo Här är det bara värdet på test som ändras eftersom man bara skickade in värdet på *p!

10 Strängar i funktionsanrop När man hanterar textsträngar som till skillnad från arrayer alltid avslutas med 0x00 som sista tecken behöver man inte skriva ett & framför strängnamnet. Detta bara för att de automatiskt tolkas som en pekare. Peka på text i programminnet (ROM) Om man vill peka på minnet i ROM måste man skriva const framför pekarvariabeln för att visa kompilatorn att texten ligger i ROM-minnet, dock är ju inte pekaren en konstant! Pekarens fysiska storlek Om man har en pekare som pekar på en array som är deklarerad som char kommer givetvis pekaren att vara mer än 8 bitar lång. Detta måste den ju vara eftersom adressen som den pekar mot är ju i stort sett alltid större än 8 bitar eller adressvärdet 256

Övningar Dag 2 En första klass

Övningar Dag 2 En första klass Kurs i C++ Sid 1 (5) Övningar Dag 2 En första klass Denna övning går ut på att steg för steg bygga upp en klass och skapa objekt. Vi kommer att utgå från en sammansatt datatyp i en struct och parallellt

Läs mer

Föreläsning 10. Pekare (Pointers)

Föreläsning 10. Pekare (Pointers) Föreläsning 10 Pekare (Pointers) Dagens kluringar int a=5; int f(int b) a--; b++; return b; int main() int a=3; printf("%d,",f(a)); printf("%d",a); return 0; int f(int a) if(a==1) return a; else return

Läs mer

Om include-filer i PHP

Om include-filer i PHP Programmering för webben! 1 Om include-filer i PHP För att få bättre struktur och slippa skriva vanligt förekommande kod flera gånger använder man ofta include-filer i PHP. Här kommer en kort beskrivning

Läs mer

*Pekarvärden *Pekarvariabler & *

*Pekarvärden *Pekarvariabler & * *Pekarvärden *Pekarvariabler & * Motivering Pekare är ett fundamentalt koncept i C (och C++) Multipla returvärden från funktioner. Arrayer hanteras via pekare Dynamiskt minne (kommer i slutet av kursen)

Läs mer

Programmeringsteknik med C och Matlab

Programmeringsteknik med C och Matlab Programmeringsteknik med C och Matlab Kapitel 2: C-programmeringens grunder Henrik Björklund Umeå universitet Björklund (UmU) Programmeringsteknik 1 / 32 Mer organisatoriskt Imorgon: Datorintro i lab Logga

Läs mer

OOP Objekt-orienterad programmering

OOP Objekt-orienterad programmering OOP F6:1 OOP Objekt-orienterad programmering Föreläsning 6 Mer om klasser och objekt Hantera många objekt ArrayList tostring() metoden this Vi vill ofta hantera många objekt i ett program: OOP F6:2 public

Läs mer

1 Funktioner och procedurell abstraktion

1 Funktioner och procedurell abstraktion 1 Funktioner och procedurell abstraktion Det som gör programkonstruktion hanterlig och övergripbar och överhuvudtaget genomförbar är möjligheten att dela upp program i olika avsnitt, i underprogram. Vår

Läs mer

Tentamen OOP 2015-03-14

Tentamen OOP 2015-03-14 Tentamen OOP 2015-03-14 Anvisningar Fråga 1 och 2 besvaras på det särskilt utdelade formuläret. Du får gärna skriva på bägge sidorna av svarsbladen, men påbörja varje uppgift på ett nytt blad. Vid inlämning

Läs mer

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling metoder Föreläsning 2 Objektorienterad programmering DD1332 Array [modifierare] String metodnamn (String parameter) Returtyp (utdata typ) i detta fall String Indata typ i detta fall String 1 De får man

Läs mer

Introduktion till arv

Introduktion till arv Introduktion till arv 6 INTRODUKTION TILL ARV Arv Generell-Speciell Arv för att utnyttja det vi redan gjort Återanvändning Basklass Härledd klass Varför arv? Inför en subklass för att uttrycka specialisering

Läs mer

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson Grundläggande C-programmering del 2 Pekare och Arrayer Ulf Assarsson Läromoment: Pekare Absolutadressering (portar): typedef, volatile, #define Arrayer av pekare, arrayer av arrayer Hemuppgifter: v2. Föregående

Läs mer

Föreläsning 4: Poster

Föreläsning 4: Poster Föreläsning 4: Poster Följande är genomgånget: type Person_Type is Namn : String(30); Skonr : Float; Kon : Boolean; Diskussion runt detta med olika typer m.m. Har tagit upp vilka operationer man kan göra

Läs mer

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson Grundläggande C-programmering del 2 Pekare och Arrayer Ulf Assarsson Läromoment: Pekare Absolutadressering (portar): typedef, volatile, #define Arrayer av pekare, arrayer av arrayer Hemuppgifter: v2. Föregående

Läs mer

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition. Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Vem är vem på kursen Objektorienterad programvaruutveckling GU (DIT011) Kursansvarig : Katarina Blom, tel 772 10 60 Rum: 6126 (E-huset)

Läs mer

Föreläsning 6: Introduktion av listor

Föreläsning 6: Introduktion av listor Föreläsning 6: Introduktion av listor Med hjälp av pekare kan man bygga upp datastrukturer på olika sätt. Bland annat kan man bygga upp listor bestående av någon typ av data. Begreppet lista bör förklaras.

Läs mer

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 - Inbyggda system - Analog till digital signal - Utvecklingssystem, målsystem - Labutrustningen - Uppbyggnad av mikrokontroller - Masinkod, assemblerkod

Läs mer

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 3-4 Repetition Datatyper Uttryck Operatorer Satser Algoritmer Programmeringsteknik VT05 2 Repetition Repetition - Programmering i

Läs mer

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet 1 Texthantering I detta avsnitt tas det upp två sätt att arbeta med text i C++ program. Det första sättet som behandlas är hanteringen av textfält. Texter i C++ består utav en serie med enstaka tecken

Läs mer

Hantering av textsträngar och talsträngar. William Sandqvist

Hantering av textsträngar och talsträngar. William Sandqvist Hantering av textsträngar och talsträngar Strängen Hello world! PIC-processorerna lagrar strängkonstanter med bokstäverna inbakade i en följd av instruktioner (en tabell). Man hämtar en bokstav genom att

Läs mer

Föreläsning 3.1: Datastrukturer, en översikt

Föreläsning 3.1: Datastrukturer, en översikt Föreläsning.: Datastrukturer, en översikt Hittills har vi i kursen lagt mycket fokus på algoritmiskt tänkande. Vi har inte egentligen ägna så mycket uppmärksamhet åt det andra som datorprogram också består,

Läs mer

Föreläsning 6 pekare och pekare tillsammans med arrayer

Föreläsning 6 pekare och pekare tillsammans med arrayer Föreläsning 6 pekare och pekare tillsammans med arrayer Vi ska nu undersöka vad pekare egentligen är och hur de relaterar till arrayer. Det är ett centralt tema i C-programmering. Vi följer boken och går

Läs mer

4 Sammansatta datatyper

4 Sammansatta datatyper 4 Sammansatta datatyper De enkla datatyper som vi hittills använt är otillräckliga när man ska hantera stora datamängder. Vill man exempelvis läsa in 100 reella mätvärden, som man tillfälligt vill spara

Läs mer

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen

Läs mer

Objektorienterad programmering i Java

Objektorienterad programmering i Java Objektorienterad programmering i Java Föreläsning 4 Täcker i stort sett kapitel 6 i kursboken Java Software Solutions 1 Läsanvisningar Den här föreläsningen är uppbyggd som en fortsättning av exemplet

Läs mer

#include <stdio.h> #include <string.h>

#include <stdio.h> #include <string.h> #include #include void fun(char s[]) int i=-1; while(s[++i]!=0) if('a'

Läs mer

Det finns många flaggor till g++,

Det finns många flaggor till g++, C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se Inge Frick, inge@nada.kth.se Alexander Baltsatsis hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m.

Läs mer

C-programmering, föreläsning 2 Jesper Wilhelmsson

C-programmering, föreläsning 2 Jesper Wilhelmsson C-programmering, föreläsning 2 Jesper Wilhelmsson Funktioner void Globala och lokala variabler, scope static Arrayer Strängar ASCII, ANSI Argument till main Slumptal Funktioner Nu är det dags att börja

Läs mer

Föreläsning 1 & 2 INTRODUKTION

Föreläsning 1 & 2 INTRODUKTION Föreläsning 1 & 2 INTRODUKTION Denna föreläsning Vad händer under kursen? praktisk information Kursens mål vad är programmering? Skriva små program i programspråket Java Skriva program som använder färdiga

Läs mer

Grunderna i stegkodsprogrammering

Grunderna i stegkodsprogrammering Kapitel 1 Grunderna i stegkodsprogrammering Följande bilaga innehåller grunderna i stegkodsprogrammering i den form som används under kursen. Vi kommer att kort diskutera olika datatyper, villkor, operationer

Läs mer

Föreläsning 5: Introduktion av pekare

Föreläsning 5: Introduktion av pekare Föreläsning 5: Introduktion av pekare Det bör påpekas att det som tas upp i introduktionen inte är reella exempel på kod. Man anväder inte pekare till att peka på enstaka heltal som i exemplen nedan, men

Läs mer

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare Vad är en pekare? Varför använder vi pekare? Hur används pekare? Hur deklarerar vi pekare i C? Hur kommer vi åt pekarvärdet? DAVA07/08 JE,MG,MG,PS 2 DAVA07/08 JE,MG,MG,PS Vad är en pekare? En pekare är

Läs mer

SMD 134 Objektorienterad programmering

SMD 134 Objektorienterad programmering SMD 134 Objektorienterad programmering Dagens agenda: Typer i Java: primitiva datatyperna, referenstyper Variabler och variabeltilldelningar med primitiva typer Konstanter av de olika typerna. Heltalsräkning

Läs mer

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm. Algoritmanalys Analys av algoritmer används för att uppskatta effektivitet. Om vi t. ex. har n stycken tal lagrat i en array och vi vill linjärsöka i denna. Det betyder att vi måste leta i arrayen tills

Läs mer

Javisst! Uttrycken kan bli komplicerade, och för att få lite överblick över det hela så gör vi det så enkelt som möjligt för oss.

Javisst! Uttrycken kan bli komplicerade, och för att få lite överblick över det hela så gör vi det så enkelt som möjligt för oss. 8-2 Förenkling av uttryck. Namn: eller Konsten att räkna algebra och göra livet lite enklare för sig. Inledning I föregående kapitel lärde du dig vad ett matematiskt uttryck är för någonting och hur man

Läs mer

Digital Display VDS / Bus2

Digital Display VDS / Bus2 3-7449 Digital Display & 3-7447 Digital Knappsats (ref.99622) Se hemsida / support för senaste manualerna. http://www.axema.se/ Ver. 1.2 axema Sida 1 Ändra språk till Svenska. Tryck 0 och efter det ange

Läs mer

Föreläsning 2: Avlusning och antilustekniker

Föreläsning 2: Avlusning och antilustekniker 2D1458, Problemlösning och programmering under press Föreläsning 2: Avlusning och antilustekniker Datum: 2007-09-11 Skribent(er): Emil Hesslow, Stefan Pettersson Föreläsare: Per Austrin Föreläsningen handlade

Läs mer

Chapter 3: Using Classes and Objects

Chapter 3: Using Classes and Objects Chapter 3: Using Classes and Objects I dessa uppgifter kommer du att lära dig om hur man använder klasser och metoder från java biblioteket. Du kommer inte att förstå allt som händer bakom metod anrop

Läs mer

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment: Grundläggande C-programmering del 2 Pekare och Arrayer Ulf Assarsson Läromoment: Pekare Absolutadressering (portar): typedef, volafle, #define Arrayer av pekare, arrayer av arrayer Hemuppgi9er: v2. Föregående

Läs mer

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe Pekare och Arrayer Viktor Kämpe Pekare Pekarens värde är en adress. Pekarens typ berättar hur man tolkar bitarna som finns på adressen. unsigned char* pek 0x3026 0x3026 0110 0001 typ värdet är en adress...

Läs mer

LEU240 Mikrodatorsystem

LEU240 Mikrodatorsystem Institutionen för data- och informationsteknik 2011-10-11 LEU240 Mikrodatorsystem Vi har tidigare i olika sammanhang sett att det är önskvärt att kunna använda ett högnivåspråk som C för att skriva program

Läs mer

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010 Föreläsning 6 Kapitel 5 5.1 switch-satsen Vi ser på ett par exempel ur boken: int a; srand(time(0)); a=rand()%6+1; if(a==1) printf("hej Du glade\n"); else if(a==2) printf("god dag\n"); else if(a==3) printf("är

Läs mer

trafiksimulering Intro OU5 trafiksimulering

trafiksimulering Intro OU5 trafiksimulering Presentation av obligatoriska uppgiften trafiksimulering Ett lite större program med flera klasser Hur man designar ett system Hur man gör simuleringar 1 Valsätr ravägen Korsningen Dag hammarsköldsväg

Läs mer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs TDIU01 - Programmering i C++, grundkurs Underprogram - Funktioner Eric Elfving Institutionen för datavetenskap 18 september 2014 Översikt 2/22 Återblick till satsblocken Funktioner - Namngivna satsblock

Läs mer

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa Lena Kallin Westin 2005-08-22 Institutionen för datavetenskap Umeå universitet TENTAMEN Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa Inlämnad Poäng Kurs : Programmeringsteknisk

Läs mer

Programmering A C# VT 2010. Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08

Programmering A C# VT 2010. Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08 Programmering A C# VT 2010 Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08 Innehåll Hjälp och referenser... 3 Kap 1 Introduktion... 3 Steg för steg... 3 Kapitel 2 Variabler...

Läs mer

Effektpedal för elgitarr

Effektpedal för elgitarr EITF11 - Digitala Projekt Effektpedal för elgitarr Handledare: Bertil Lindvall Ivan Rimac (I05) Jimmy Lundberg (I08) 2011-05-10 Contents Bakgrund... 3 Kravspecifikation... 3 Kravspecifikation Effektpedal...

Läs mer

Föreläsning 7 Strängar

Föreläsning 7 Strängar Föreläsning 7 Strängar I C använder vi strängar för att lagra text. Strängar kommer in ganska sent i kursen, det är jag inte så glad över, men det finns också fördelar, vi har grundat oss rejält nu i funktioner,

Läs mer

Felsökning av mjukvara

Felsökning av mjukvara KUNGLIGA TEKNISKA HÖGSKOLAN Felsökning av mjukvara Programmering av en NXT-robot Max Kufa [03/08-13] mkufa@kth.se Introduktionskurs i datateknik (II1310) Sammanfattning Syftet med laborationen var att

Läs mer

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära

Läs mer

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Inledande programmering med C# (1DV402) 27+15=42 1 (22) 27+15=42 1 (22) Variabler Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så här: Allt innehåll

Läs mer

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4 Modul 2 Byggstenar PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4 Byggstenar 4 Nyckelord 4 Tecken 4 Syntax 5 Standardbibliotek 5 Vårt första program 5 Variabler 6 Konstanter 9 Operatorer 9 Övningar 9 Mer operatorer

Läs mer

Skizz till en enkel databas

Skizz till en enkel databas Skizz till en enkel databas Data: Register En vektor Funktioner: Databas Initiera huvudloop Avsluta Poster (struct( struct) val Mata in Skriv ut Spara Hämta Ändra Radera Enligt diskussion 1999-11-23 Bertil

Läs mer

Sätt att skriva ut binärträd

Sätt att skriva ut binärträd Tilpro Övning 3 På programmet idag: Genomgång av Hemtalet samt rättning Begreppet Stabil sortering Hur man kodar olika sorteringsvilkor Inkapsling av data Länkade listor Användning av stackar och köer

Läs mer

Tentaupplägg denna gång

Tentaupplägg denna gång Några tips på vägen kanske kan vara bra. Tentaupplägg denna gång TIPS 1: Läs igenom ALLA uppgifterna och välj den du känner att det är den lättaste först. Det kan gärna ta 10-20 minuter. Försök skriva

Läs mer

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl 9.00 14.

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl 9.00 14. Tentamen 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl 9.00 14.00, sal E33 Tentan har en teoridel och en problemdel. På teoridelen är inga hjälpmedel

Läs mer

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser Föreläsning 1 Innehåll Introduktion till objektorientering OOP (objektorienterad programmering) Objekt, instanser, klasser C++ OO i C++ Standardbibliotek Utökningar från C (syntaktiskt socker) Introduktion

Läs mer

Datorteknik 2 (AVR 2)

Datorteknik 2 (AVR 2) Namn: Laborationen godkänd: Digitala system 15 hp Datorteknik 2 (AVR 2) LTH Ingenjörshögskolan vid Campus Helsingborg Enkel in- och utmatning. Drivrutiner. Bithantering. I denna laboration ska vi förbättra

Läs mer

TDDC76 - Programmering och Datastrukturer

TDDC76 - Programmering och Datastrukturer TDDC76 - Programmering och Datastrukturer Pekare och Listor Eric Elfving Institutionen för datavetenskap 1 / 20 Översikt Internminne Pekare Dynamiska datastrukturer (Enkellänkade) listor 2 / 20 Internminne

Läs mer

Minnestilldelning (allokering) och frigörande (avallokering) av minne

Minnestilldelning (allokering) och frigörande (avallokering) av minne Pekare i C++ Pekare används mycket i C++. De är bra både för att de tillåter dynamisk minnesallokering och för att de är referenser. En pekarvariabel innehåller en adress till ett element, den pekar på

Läs mer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs TDIU01 - Programmering i C++, grundkurs Sammanfattning period 1 Eric Elfving Institutionen för datavetenskap 1 oktober 2013 Översikt Ett C++-programs uppbyggnad Variabler Datatyper Satser Uttryck Funktioner

Läs mer

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C 1 of 7 Örebro universitet Institutionen för naturvetenskap och teknik Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se) Tentamen i Programmering grundkurs och Programmering C för D1 m fl, även distanskursen

Läs mer

Objektorienterad programmering D2

Objektorienterad programmering D2 Objektorienterad programmering D2 Laboration nr 2. Syfte Att få förståelse för de grundläggande objektorienterade begreppen. Redovisning Källkoden för uppgifterna skall skickas in via Fire. För senaste

Läs mer

Användarhandledning Version 1.2

Användarhandledning Version 1.2 Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...

Läs mer

Grundläggande programmering med C# 7,5 högskolepoäng

Grundläggande programmering med C# 7,5 högskolepoäng Grundläggande programmering med C# 7,5 högskolepoäng Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Omtentamen DE13, IMIT13 och SYST13 samt öppen för alla (Ifylles av student) (Ifylles av student)

Läs mer

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek De åtta primitiva typerna Java, datatyper, kontrollstrukturer Skansholm: Kapitel 2) Uppsala Universitet 11 mars 2005 Typ Innehåll Defaultvärde Storlek boolean true, false false 1 bit char Tecken \u000

Läs mer

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen

Läs mer

Hjälpmedel för kompilatorkonstruktion, DVB004

Hjälpmedel för kompilatorkonstruktion, DVB004 Hjälpmedel för kompilatorkonstruktion, DVB004 Version 4.2 021104 Göran Fries 031104 GF Kompilatorn kan lämpligen konstrueras i tre ganska fristående pass (p1,p2,p3). Första passet gör en lexikalisk analys,

Läs mer

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk

Läs mer

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då Agenda Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer Övningar nu och då 1 Motivering I de flesta problem ingår att hantera multipla data I de

Läs mer

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 3-4 Repetition Datatyper Uttryck Operatorer Satser Algoritmer Programmeringsteknik för ingenjörer, VT06 2 Repetition Repetition -

Läs mer

TUTORIAL: SAMLING & KONSOLL

TUTORIAL: SAMLING & KONSOLL TUTORIAL: SAMLING & KONSOLL Denna tutorial är en fortsättning på den tutorial där vi skapade klassen Car och sedan objekt av denna klass. Vi skall nu lära oss att lagra dessa objekt i en samling och även

Läs mer

Lathund. C för inbyggda system

Lathund. C för inbyggda system Lathund C för inbyggda system Revision 1 2000-09-21 Anders Arvidsson Jonny Martinsson Synpunkter välkomnas! Innehållsförteckning 1 Introduktion...3 1.1 Assembler kontra C...3 1.2 Kodexempel...3 1.3 MPLAB...4

Läs mer

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00 TENTAMEN CD5250 Objektorienterad programutveckling med C++, 5p Max poäng: 40 Betygsgränser: 3: 20 4: 28 5: 36 Datum: 1999-06-01, Tid: 14:00-19:00 Ansvarig: Ivica Crnkovic Upp till 5 poäng kan komma från

Läs mer

Instruktion för att slutföra registreringen

Instruktion för att slutföra registreringen Instruktion för att slutföra registreringen Introduktion Vi antar i den här instruktionen att du redan har registrerat sig. Du kan också ha klickat på aktiveringslänken i mailet. Vi använder ett fiktivt

Läs mer

C++ Lektion Tecken och teckenfält

C++ Lektion Tecken och teckenfält C++ Lektion Tecken och teckenfält Teori Hittills har alla variabler du jobbat med varit olika typer av tal, men du kan också deklarera variabler som håller bokstavstecken. Denna variabeltyp kallas för

Läs mer

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare Funktionspekare, inledning: funktionsanropsmekanismen Vid funktionsanrop läggs aktuella argumentvärden och återhoppsadressen på stacken, därefter sker ett hopp till adressen för funktionens första instruktion.

Läs mer

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305 Klass Object, instans av klass public/private Klassvariabler och klassmetoder 1 Array och ArrayList Arrayer och ArrayList är till för att innehålla

Läs mer

Tentaupplägg denna gång

Tentaupplägg denna gång Några tips på vägen kanske kan vara bra. Tentaupplägg denna gång TIPS 1: Läs igenom ALLA uppgifterna och välj den du känner att det är den lättaste först. Det kan gärna ta 10-20 minuter. Försök skriva

Läs mer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner 732G11 Linköpings universitet 2011-01-21 1 2 3 4 5 6 Skapa program Kompilera: Källkod Kompilator bytekod Köra: Bytekod Virtuell maskin Ett riktigt program Hej.java class Hej { public static void main (

Läs mer

Ekvationssystem - Övningar

Ekvationssystem - Övningar Ekvationssystem - Övningar Uppgift nr 1 y = 5x x + y = 54 Uppgift nr 2 y = 2x x + y = 12 Uppgift nr 3 y = 3x + 7 4x + y = 35 Uppgift nr 4 y = 4x - 18 3x + y = 38 Uppgift nr 5 2x - 2y = -4 x - 3y = 4 Uppgift

Läs mer

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar Dynamiskt minne Agenda Vad är dynamiskt minne Motivering Hur gör man i C Övningar Minne Datorns primärminne används till olika ändamål De flesta system partitionerar minnet efter användningen: Programkoden

Läs mer

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken. Tentamen Programmeringsteknik I 2015-01-10 Skrivtid: 8.00 13.00 Hjälpmedel: Java-bok Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till

Läs mer

HI1024 Programmering, grundkurs TEN2 2014-03-13

HI1024 Programmering, grundkurs TEN2 2014-03-13 HI1024 Programmering, grundkurs TEN2 2014-03-13 KTH STH Haninge 13.15-18.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King

Läs mer

Lathund. C för inbyggda system

Lathund. C för inbyggda system Lathund C för inbyggda system Revision 2 2001-04-13 Anders Arvidsson Jonny Martinsson Synpunkter välkomnas! Innehållsförteckning 1 Introduktion... 3 1.1 Assembler kontra C... 3 1.2 Kodexempel... 3 1.3

Läs mer

Föreläsning 6: Metoder och fält (arrays)

Föreläsning 6: Metoder och fält (arrays) TDA 545: Objektorienterad programmering Föreläsning 6: Metoder och fält (arrays) Magnus Myréen Chalmers, läsperiod 1, 2015-2016 I (föregående och) denna föreläsning Läsanvisning: kap 2 & 13 meddelanden

Läs mer

Programmering B med Visual C++ 2008

Programmering B med Visual C++ 2008 Programmering B med Visual C++ 2008 Innehållsförteckning 1 Repetition och lite nytt...5 I detta kapitel... 5 Programexekvering... 5 Loop... 5 Källkod... 6 Verktyg... 6 Säkerhetskopiera... 6 Öppna, kompilera,

Läs mer

DELPROV 1 I DATAVETENSKAP

DELPROV 1 I DATAVETENSKAP Umeå Universitet Datavetenskap Marie Nordström 070502 DELPROV 1 I DATAVETENSKAP Uppgift (poäng) 1 () 2 () 3 () 4 () 5 () 6 () Summa (xx) Inlämnad Poäng Kurs : Datum : 070502 Namn (texta) : Personnummer

Läs mer

CPU. Carry/Borrow IX. Programräknare

CPU. Carry/Borrow IX. Programräknare Laboration:. Jämförelser mellan assembler och C. CPU ACCA ACCD ACCB 8-bitars ackumulatorer eller 16- bitars ackumulator CCR 1 1 1 SXH I NZVC Flaggregister Carry/Borrow IX IY PC Indexregister X Indexregister

Läs mer

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp Dataingenjörsprogrammet, elektroingenjörsprogrammet och medicinsk teknik KTH Skolan för Teknik och Hälsa Redovisning: Se Kurs-PM om hur redovisningen

Läs mer

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Lösningsförslag, tentamen FYTA11 Javaprogrammering Lunds universitet FYTA11 Institutionen för Astronomi och Teoretisk fysik HT 12 Lösningsförslag, tentamen FYTA11 Javaprogrammering Onsdag 9 januari 2013, 10:15 14:15 Instruktioner Hjälpmedel: Papper och

Läs mer

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList. Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar

Läs mer

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C#

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C# PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C# Vi gör ett enkelt glosförhör Allt det du gör idag ska ligga i samma projekt (och mapp). Du kan om du tycker det behövs använda flera forms

Läs mer

Funktionens deklaration

Funktionens deklaration Funktioner - 1 Teknik för stora program #include #include......... cout

Läs mer

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe Pekare och Arrayer Ulf Assarsson Originalslides av Viktor Kämpe Pekare Pekarens värde är en adress. Pekarens typ berä>ar hur man tolkar bitarna som finns på adressen. char str[] = "apa"; char* p = &str[0];

Läs mer

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1 IS1200 Datorteknik Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1 1 4.1 Little och big endian 2 Nios II? Nios II är Little-endian (men eftersom det är en soft-processor

Läs mer

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc Föreläsning 5 (6) Metoder Metoder Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc Metoder Deklarera public void setnamn(string n) Åtkomstmodifierare Returtyp

Läs mer

NXT LEGO-robot laboration Programmering och felsökning av en LEGOrobot

NXT LEGO-robot laboration Programmering och felsökning av en LEGOrobot KUNGLIGA TEKNISKA HÖGSKOLAN NXT LEGO-robot laboration Programmering och felsökning av en LEGOrobot Gabriel Vilén 30/8-2012 gvilen@kth.se Introduktionskurs i datateknik II1310 Sammanfattning Vi har programmerat

Läs mer

SORTERING OCH SÖKNING

SORTERING OCH SÖKNING Algoritmer och Datastrukturer Kary FRÄMLING Kap. 9, Sid 1 C-språket 2/Kary Främling v2000 och Göran Pulkkis v2003 SORTERING OCH SÖKNING Sortering är ett av de bästa exemplen på problem där valet av lösningsalgoritm

Läs mer

grundläggande C++, funktioner m.m.

grundläggande C++, funktioner m.m. C++, Övning 1 Jonas Sjöbergh, jsh@nada.kth.se hur man kompilerar och kör make preprocessor minnesallokering, pekare grundläggande C++, funktioner m.m. ett exempel Ett enkelt program i C++, hello.cpp #include

Läs mer

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010 Programsystemkonstruktion med C++: Övning 1 Karl Palmskog palmskog@kth.se september 2010 Programuppbyggnad Klassens uppbyggnad en C++-klass består av en deklaration och en definition deklaration vanligtvis

Läs mer