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

Relevanta dokument
Att använda pekare i. C-kod

Övning från förra gången: readword

Lathund. Pacific C för MS-DOS

*Pekarvärden *Pekarvariabler & *

C. Språket för inbyggda system. Maskinnära De flesta datorresurser åtkomliga för programmeraren Samma operatorer som Java (som ni redan kan)

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Strängar. Strängar (forts.)

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Tecken & Strängar. Kapitel 7

2 Pekare och dynamiska variabler.

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

En kort text om programmering i C.

Enkla datatyper minne

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Programmering i C, 7,5 hp

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

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

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Programmeringsteknik med C och Matlab

Lathund. C för inbyggda system

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Föreläsning 10. Pekare (Pointers)

4 Sammansatta datatyper

C-programmering. Målsättning Introducera programmering i C för de som inte har någon erfarenhet av C eller C++. Litteratur

Föreläsning 11. Strängar

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

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

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

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

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

Lathund. C för inbyggda system

Poster ( structar ) Postdeklarationer

GPT- föreläsning 10. För en vecka sedan Problemlösning på lägre nivå kan sortera funktioner Förra gången

C konstruerades i början på sjuttiotalet av Dennis Ritchie vid Bell Laboratories.

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

TDIU01 - Programmering i C++, grundkurs

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

TDIU01 - Programmering i C++, grundkurs

Kontrollskrivning Mikrodatorteknik CDT S2-704

Assemblerprogrammering för ARM del 2

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

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Assemblerprogrammering för ARM del 3

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

6.1 Kompilering och lite grundläggande information

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

Lösningar till tentamen i EIT070 Datorteknik

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Exempelsamling Assemblerprogrammering

Digital- och datorteknik

Användarhandledning Version 1.2

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

C++ Lektion Tecken och teckenfält

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

1 Funktioner och procedurell abstraktion

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

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

Föreläsning 8: Structar

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

Assemblerprogrammering - fördjupning

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Planering Programmering grundkurs HI1024 HT data

Föreläsning 13. In- och utmatning

TDDC76 - Programmering och Datastrukturer

Pekare och arrayer. Indexering och avreferering

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Funktioner och programstruktur. Föreläsning 5

Heltal(int) Programmeringsteknik 54

Programmering Grundkurs (HI1900) Teoridel

Objektorienterad programmering i Java

Assemblerprogrammering, ARM-Cortex M4 del 3

Laborera med SmartCard

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

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

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

C++-programmets beståndsdelar

Planering Programmering grundkurs HI1024 HT TIDAA

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

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

Att komma igång. Föreläsning 1

6 Lågnivåprogrammering

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

LEU240 Mikrodatorsystem

Introduktionslaboration

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Föreläsning 3. Programmering, C och programmeringsmiljö

Om pekare och minneshantering i C, relaterat till operativsystem och särskilt konstruktionen fork() execvp().

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

Funktioner och programstruktur. Föreläsning 5

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Datorteknik ERIK LARSSON

Transkript:

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 först ladda W-registret med bokstavens ordningsnummer och därefter göra ett subrutinanrop, tex CALL text1. Tabellen text1 börjar med instruktionen ADDWF som innebär att hoppet går vidare till önskat ordningsnummer i tabellen ( enligt talet i W-registret ). Där finner man instruktionen RETLW som innebär återhopp, men nu med den önskade bokstaven i W-registret. Assemblerkod: text1 addwfpc ; jump indirect W retlw 0x48 ; 'H retlw 0x65 ; 'e retlw 0x6c ; 'l retlw 0x6c ; 'l retlw 0x6f ; 'o - - - - - - - - - - Detta kallas för computed goto

Cc5x C-sträng computed goto Som funktion med computed goto. char text1( char W) skip(w); Skip-funktionen hoppar W stycken C-instruktioner (special för Cc5x) return h ; return e ; return l ; return l ; return o ; return w ; return o ; return r ; return l ; return d ; return \r ; return \n ; return \0 ; Eller samma sak med ett förenklat skrivsätt ( pragma = special ). char text1( char W) skip(w); #pragma return[] = "hello world" \r \n \0

Skriva ut en sträng char i, k; for(i = 0 ; ; i++) k = text1(i); if( k == \0 ) break; putchar(k); hämta bokstav tills strängen är slut // found end of string skriva ut bokstav char text1( char W) skip(w); #pragma return[] = "hello world" \r \n \0

( C pekare * adress & och avreferering * ) Kort om C-språkets pekare kommer Du ihåg? int b; Deklaration av heltalsvariabeln b. Plats reserveras. b = 18; Definition av variabeln b. Nu innehåller den talet 18. &b Adressoperatorn. Adressen till variabeln b. int * c; Deklaration av int-pekarvariabeln c. c = &b; Nu pekar c på b. ( 18 ) 18 *c Avrefereringsoperatorn. Det som c pekar på. ( ) 18 *c = 19; Talet 19 lagras på den plats som c pekar ut. Nu innehåller b = 19. ( ) 19

C-språkets strängar const char text1[]= hello world\r\n ; En sträng är en char-array som avslutats med \0 &text1[0]=text1 Arrayens namn är också strängens startadress! text1[0]= h Index börjar med 0 text1[13]= \0

Adresser lagras i pekarvariabler char * a; text1[0] h a = &text1[0]; text1[4] o Indexstegning eller Pekarstegning Avreferering med Index: Avreferering av Pekare: a[4] o *(a+4) o

Adresser som funktionsparametrar Om en funktion ska kunna skriva ut olika strängar behöver man kunna skicka med strängens startadress Funktionsdeklaration: void string_out( const char * ); Plats för startadressen

Adresser som funktionsparametrar Funktionsdefinition: void string_out( const char * s ) char i,k; for(i = 0 ; ; i++) k = s[i]; ( ) if( k == \0 ) return; putchar(k); Här sker avreferering med index

Adresser som funktionsparametrar Funktionsanrop: skicka med startadressen string_out( &text1[0] ); eller så också så här string_out( hello world\r\n ); Med detta skrivsätt lagras först strängkonstanten i minnet (som computed goto-tabell) men sedan är det bara startadressen som skickas som parameter till funktionen.

Inte mycket att peka på? const char text1[]= hello world\r\n ; Det finns inte mycket att peka på i en midrange PIC-processor. Kompilatorn Cc5x tillåter trots detta att man använder pekare och viss C-syntax för pekare. Detta är bara för syns skull. Konstanta strängar lagras som computed goto i programminnet, och strängvariabler som arrayer i registerarean.

Inte mycket att peka på? const char text1[]= hello world\r\n ; text1 blir en computed goto tabell med 14 stycken retlw instruktoner i program minnet char buffer[21]; buffer blir 21 stycken gpr-register i registerfile

hello.c void main(void) char i; initserial(); /* Initialize serial port */ string_out( hello world\r\n ); while(1) nop(); void string_out( const char * s ) char i,k; for(i = 0 ; ; i++) k = s[i]; if( k == \0 ) return; putchar(k);

Mata in en sträng char s[11]; /* room for 10 charachters and \0 */ void string_in( char * str ) char n, c; for(n = 0; ; n++ ) c = getchar( ); /* input 1 character */ str[n] = c; /* store the character */ putchar( c ); /* echo the character */ if( (n == 10) (c=='\r' )) /* end of input */ str[n] = '\0'; /* add "end of string" */ return; Anrop: string_in( &s[0] ); string_in() matar in bokstäver till buffern s tills enter (eller max antal tecken, 10 st).

comp_str() bit comp_str( char * in_str, const char * ref_str ) char i, c, d; for(i=0; ; i++) c = in_str[i]; d = ref_str[i]; comp_str() jämför två strängar med varandra, om de är lika returneras en bitvariabel = 1 if(d!= c ) return 0; /* no match */ if( d == '\0' ) return 1; /* exact match */ Lösenordskontroll!

Formaterad utskrift printf() ANSI-C har funktionen printf() %d utskrift av heltalsvariabel %x utskrift av heltalsvariabel men hexadecimalt %f utskrift av flyttalsvariabel \n nyradstecken \t tabulatortecken ANSI-C För att använda printf() #include <stdio.h>

printf() -lookalike Standard ANSI-C har in och utmatningsfunktionerna printf() och scanf() i standardbiblioteket stdio.h. Detta är alldeles för omfattande och komplicerade funktioner för en PIC-processor. För den som är van vid C vore åtminstone en funktion som liknar printf() bra att ha. Speciellt vid avlusningen av programkoden. void printf(const char *str, char var); printf("hello World!\n\r", 0); printf("number 234 as unsigned: %u\n\r", 234); printf("number 234 as signed: %d\n\r", 234); printf("number 234 as binary: %b\n\r", 234); printf("print a char: %c\n\r", 'W'); Hur ser utskriften ut?

printf() -lookalike Så här blev utskriften! Hello World Number 234 as unsigned: 234 Number 234 as signed: -022 Number 234 as binary: 11101010 Print a char: W

Från binärt till ASCII Ex talet 123 s[3]= \0 ; s[2] = 123%10 + 0 = 3 123/10 = 12 s[1] = 12%10 + 0 = 2 12/10 = 1 S[0] = 1%10 + 0 = 1 En konverteringsalgoritm. Efter tre steg innehåller s[] de ASCII-tecken som ska skrivas ut. s[]= 1, 2, 3, \0

void printf(const char *str, char var) char i, k, m, a, b; for(i = 0 ; ; i++) k = str[i]; if( k == '\0') break; // at end of string if( k == '%') // insert variable in string i++; k = str[i]; switch(k) case 'd': // %d signed 8bit if( variable.7 ==1) putchar('-'); else putchar(' '); if( variable > 127) variable = -variable; // no break! case 'u': // %u unsigned 8bit a = variable/100; putchar('0'+a); // print 100's b = variable%100; a = b/10; putchar('0'+a); // print 10's a = b%10; putchar('0'+a); // print 1's break;... Omvandling till decimaltal är krävande.

Att skriva ut variabler binärt tar inte speciellt mycket resurser... case 'b': // %b BINARY 8bit for( m = 0 ; m < 8 ; m++ ) if (variable.7 == 1) putchar('1'); else putchar('0'); variable = rl(variable); break; case 'c': // %c 'char' putchar(variable); break; case '%': putchar('%'); break; default: // not implemented putchar('!'); else putchar(k); I praktiken tar man bara med de talomvandlingar man verkligen behöver allt tar plats och tar exekveringstid.