14 UKAZATELE A ØETÌZCE

Podobné dokumenty
11 Elektrické specifikace Mezní parametry* Okolní teplota pøi zapojeném napájení 40 C až +125 C Skladovací teplota 65 C až +150 C Napájecí napìtí na V

1.2 Realizace èekání pomocí jednoduché programové smyèky Pøíklad 3: Chceme-li, aby dítì blikalo baterkou v co nejpøesnìjším intervalu, øekneme mu: Roz



Spínaèe jsou elektrické pøístroje, které slouží k zapínání, pøepínání a vypínání elektrických obvodù a spotøebièù. Podle funkce, kterou vykonávají, je

VLASTNOSTI PLOŠNÝCH SPOJÙ

12 15 Instalace mikroturbíny v blokové plynové výtopnì " ZADÁNO: Instalace mikroturbíny v blokové plynové výtopnì Zjistìte: 1 Zda je ekonomicky výhodn

3/ %,1'(& 83'1 &( &3 )XQNFH. + ; ; ; ; / ; ; + ; EH]H]PuQ\



:5$ =islv GDW V DOWHUQDFt QHMY\ããtKRELWX


2.4 Cykly 2. ZÁKLADY JAZYKA C

9. Harmonické proudy pulzních usměrňovačů

Vytváøení sí ového diagramu z databáze: pøíklad

NULOROVÉ MODELY Spokojíme-li se pouze se základní analýzou elektronického obvodu s ideálními prvky, osvìdèuje se èasto užití nulorových modelù aktivní



2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Skládaèka Obr 48 G15 VBP Co to dìlá: Naète vybraný obrázek (vybraný pomocí CommonDialog1), vytvoøí MxN komponent PictureBox obsahujících odpovídající


3.1 Útlum atmosférickými plyny Rezonance molekul nekondenzovaných plynù obsažených v atmosféøe zpùsobuje útlum šíøících se elektromagnetických vln. Ab


Izolaèní zesilovaèe s IL300 Zapojení izolaèních zesilovaèù s IL300 se liší pøedevším režimem v nichž pracují interní fotodiody Podle toho zda interní


IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje


0RW\O3LFWXUH%R[ 7LPHU7LPHU

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu




Práce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')







PDWHULiO FS>-NJ ±. FS>NFDONJ ± ƒ& VW teur åhoh]r FtQ KOLQtN N HPtN. OHG DONRKRO ROHM FFD FFD SHWUROHM UWX YRGD Y]GXFK YRGQtSiUD KHOLXP



kap..2 Plochy (Surfaces) Plochy jsou rozšíøením NURBS køivek. Zatímco køivka NURBS používala jednorozmìrnou interpolaci (U), u ploch je navíc pøidán d

Základy programování (IZP)

nažhavováním elektronek, takže nedochází k neúmìrnému pøetìžování filtraèních kondenzátorù pøi nábìhu anodového proudu. Polovodièový usmìròovaè vytvoø

/2*,.$ 5(6(7 Ë=(1Ë +$/7 *(1(5È ',129é & 6./ $/8. ' /,ý. ýë7$ý 5(*,675 5(*, é. 6e5,29é 5(*,675 * $.808/È725 5:0. %8',ý(/ 45(*,675 5(*

2 PARALELNÍ ROZHRANÍ Paralelní rozhraní realizuje pøenos dat mezi vnitøní sbìrnicí øídicího systému a vnìjším prostøedím po znacích, neboli po slabiká

baspelin KTR baspelin RPS Popis komunikaèního protokolu


CTR pro optoèlen s LED a tranzistorem:,& &75 = [%] U, CE = const ) Obvykle CTR urèíme pøi I F = 10 ma a U CE = 5 V. Hodnoty zjistíme z tabulky.,& &75


červená LED 1 10k LED 2


baspelin CPM Popis komunikaèního protokolu CPM KOMPR



Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

než je cca 5 [cm] od obvodu LT1070, doporučuje se blokovat napětí U IN

D DE = = + [ + D[ [ D = - - XY = = + -

NOiYHVQLFH SVDFtKR VWURMH Í (Q Ï Á. (VF ) )SURJUDPRYDWHOQpNOiYHV\) ) 3VF 6F/ 3DX NRQWURON\ ,QV +RPH 3J8S 7DE 'HO (QG 3J'Q &DSV/ (QWHU Í 6KLIW


8. ZÁKLADNÍ ZAPOJENÍ SPÍNANÝCH ZDROJŮ

28/40VÝVODOVÝ, 8BITOVÝ CMOS MIKROKONTROLÉR S A/D PØEVODNÍKEM, FLASH PAMÌTÍ PRO PROGRAM A SRAM/EEPROM PRO DATA VLASTNOSTI Velmi výkonný kontrolér s arc


Pointery II. Jan Hnilica Počítačové modelování 17

10 Práce s řetězci - pokračování

PESexcl. PODPORA PRO VÝMÌNU DAT S APLIKACÍ MICROSOFT EXCEL s využitím DDE serveru PESdde

4.8 Jak jsme na tom v porovnání s jinými přístupy

P P P ) Mw Mj = = + ,P H,P H H,P H H. ww j ww j ww = + , P H j

Pole a Funkce. Úvod do programování 1 Tomáš Kühr


MU-411/412 MU-811/812. 4x AIN (12 bitù), RS-485

MICROPEL všechna práva vyhrazena kopírování publikace dovoleno pouze bez zmìny textu a obsahu




KOMUNIKAÈNÍ DDE SERVER PRO AUTOMATY MICROPEL VERZE 2.3 POPIS ROZHRANÍ A OVLÁDÁNÍ



Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

2kapitola 2 ŠÍØENÍ VLN V ZÁSTAVBÌ PRO MOBILNÍ BUÒKOVÉ SYSTÉMY 2.1 Šíøení vln v pásmu UHF Mobilní spoj Šíøení v poloprostoru

OHGHQ ~QRU E H]HQ GXEHQ NY WHQ þhuyhq. SROROHWt


Mělká a hluboká kopie


Kapitola 3 UNIPOLÁRNÍ TRNZISTORY 3.1 Obecný popis Unipolární tranzistory s pøechodovým hradlem (JFET) MOSFET MOSFET zvláštní k


29 PØÍKLAD È. 11 VÝPIS ÈÍSLA POMOCÍ PRINTF NA MLCDGEN Nyí si ukážeme, jak upravit pøíklad è. 10 tak, abychom mohli používat fukci pritf pro výpis text


Programování v jazyce C pro chemiky (C2160) 7. Ukazatele, Funkce pro práci s řetězci



4x kombinovaný analogový vstup s vysokou pøesností (0..10V, R, C)

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

TERM 4MK. Univerzální regulaèní systém. Charakteristika. ZPA EKOREG s.r.o. Ústí nad Labem


1. test z PJC Jméno studenta: Pocet bodu: Varianta 37: příklad 5 (5 bodů)


Algoritmizace a programování

Programování v C++, 2. cvičení

Transkript:

Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv. copyright. To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne). Z toho vyplývá, že není dovoleno tuto ukázku jakýmkoliv zpùsobem dále šíøit, veøejnì èi neveøejnì napø. umis ováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod. redakce nakladatelství BEN technická literatura redakce@ben.cz

14 UKAZATELE A ØETÌZCE

V této kapitole budou probrány zbývající datové typy jazyka C: ukazatel a øetìzec. 14.1 UKAZATEL (POINTER) Obsahem promìnné typu ukazatel není hodnota èísla, znaku nebo nìco podobného, ale adresa jiné promìnné. Definice ukazatele Pro definici ukazatele se používá symbol *. Níže je uveden pøíklad definice promìnných i, j, p. Promìnné i, j jsou obyèejná celá èísla (typ int), p je typu int* (ukazatel na celoèíselnou promìnnou). Také mùžeme definovat nový typ ukazatel (zde je oznaèen pint): LQWLSM W\SHGHILQWSLQW Obr. 14.1 Definice ukazatele Unární operátor & (reference) Unární operátor & získá adresu promìnné. Zapisuje se v prefixové podobì, tedy &x. Tento operátor mùžeme použít na libovolnou promìnnou (každá promìnná má svou adresu v pamìti). Zápis p = &i získá adresu promìnné i a uloží ji do ukazatele p. Øíkáme: p ukazuje na i. Viz obr. 14.2. W\SHGHILQWSLQW W\SXND]DWHOQDFHOpþtVOR LQWL M SLQWS S L SMHXND]DWHO SREVDKXMHDGUHVXSURP QQpL SXND]XMHQDL FHORþtVHOQpSURP QQpLM S SDP L M Obr. 14.2 Pøíklad použití operátoru reference & Unární operátor * (dereference) Unární operátor * zajistí pøístup k promìnné pøes ukazatel. Zapisuje se v prefixové podobì, tedy *p. Tento operátor lze použít pouze na promìnné typu ukazatel. 162 C pro mikrokontroléry ATMEL AT89S52 A

S S QDVWDYSURP QQRXS HVXND]DWHOQDQL ]P DGUHVXXORåHQRXYXND]DWHOLS QHO]HQHQtW\SXLQW S SDP L M Obr. 14.3 Pøíklad použití operátoru dereference * Typ void* Obvyklé je používat ukazatel stejného typu, jakého je promìnná, na kterou ukazuje. Pokud ale vyžadujeme adresu bez ohledu na typ dat, mùžeme použít tzv. obecný ukazatel typu void*. Ovšem vzhledem k tomu, že typ void nemá urèenu velikost, nelze ukazatel typu void* dereferencovat! Hodnota NULL Existují situace, kdy potøebujeme stanovit, že ukazatel neobsahuje adresu žádné promìnné. Pro tyto pøípady je definován symbol NULL, který pøedstavuje adresu hodnoty 0. Nulovou adresu nemùže mít žádná promìnná. Když ukazatel obsahuje hodnotu NULL, bereme to tak, že není nastaven na žádnou promìnnou. Symbol NULL je definován napøíklad v hlavièkovém souboru stdlib.h. Velikost ukazatelù Jako každá jiná promìnná, je ukazatel uložen do pamìti. Mìlo by nás tedy zajímat, kolik bajtù v pamìti zabírá. Zajímavé je, že všechny ukazatele mají stejnou velikost, která není závislá na jejich typu. Tato velikost je urèena adresovacími schopnostmi použitého mikrokontroléru. Vzhledem k šíøi adresové sbìrnice (16 bitù) je jasné, že ukazatele jsou realizovány jako 2bajtové promìnné. Platí to i pro typ void*. Volání parametrù funkce pøes ukazatel Jedno ze základních použití ukazatelù spoèívá ve volání parametrù pøes ukazatel. Takto lze realizovat parametry funkcí, které lze mìnit. Jako první pøíklad si uvedeme funkci vymena, která má dva parametry typu ukazatel na celé èíslo. Jedná se o funkci, která má zajistit výmìnu obsahu dvou celoèíselných promìnných. Viz obr. 14.4. Pro pøípad funkce, do které se parametry pøedávají pøes ukazatel, musí být formální parametry typu ukazatel daného typu. V našem pøíkladu jsou parametry oznaèeny pa a pb a jsou typu int*. Pro vlastní výmìnu je nutné mít jednu pomocnou promìnnou typu celé èíslo, je definována jako c. Výmìna probíhá takto: n hodnotu první promìnné uložíme do c, pøístup k první promìnné pøes ukazatel pa obdržíme pomocí operátoru dereference (tedy *pa), A C pro mikrokontroléry ATMEL AT89S52 163

n n nyní již mùžeme obsah první promìnné (*pa) pøepsat hodnotou druhé promìnné (*pb), nakonec do druhé promìnné (pøístup je pøes *pb) uložíme pùvodní hodnotu první promìnné (c). YRLGY\PHQDLQWSDLQWSE ^ SDP LQWF SRPRFQiSURP QQi F SD SD SE SE F ` LQWD E Y\PHQD D E DGUHVDD W\SXND]DWHOQDFHOpþtVOR XORåSDGRF XORåSEGRSD XORåFGRSE DGUHVDE SD SE D E F """ S HG YêP QRX SD SE SDP D E F SR YêP Q Obr. 14.5 Funkce soucet a její použití Všimnìte si, jaký je význam promìnných pa, pb, a, b. Promìnné a, b jsou celá èísla a mají svou adresu v pamìti. Promìnné pa, pb na nì ukazují. Pøed výmìnou ukazuje pa na a, pb na b. Po výmìnì se situace nezmìní (pa stále ukazuje na a, pb na b), pouze obsahy promìnných a, b jsou vzájemnì vymìnìny. Všimnìte si také, že pøi volání funkce vymena musíme pøedat adresy promìnných a, b (uloží se do ukazatelù pa, pb). Adresa promìnné je získána pomocí operátoru &. Souvislost ukazatele s polem Název pole pøedstavuje ukazatel na jeho zaèátek (prvek s indexem 0). Adresu libovolného prvku lze získat pomocí operátoru reference (&). Výše uvedené informace lze zužitkovat, pokud zapisujeme funkci s parametrem typu pole. Pole bude pøedáváno pomocí ukazatele. Jelikož uvnitø funkce již nelze velikost pole zjistit (uvnitø pole máme pouze informaci o adrese pole, nikoli o poli samotném; i když mùžeme pøistupovat k jeho prvkùm), musíme ještì pøedávat maximální poèet prvkù pole. 164 C pro mikrokontroléry ATMEL AT89S52 A

Jako pøíklad si uvedeme funkci soucet, která stanoví souèet hodnot všech prvkù pole celých èísel. Prvním parametrem je ukazatel typu int*, druhým parametrem je celé èíslo poèet prvkù pole. Viz obr. 14.5. DGUHVDSROH LQWVRXFHWLQWSLQWQ ^ LQWVXPD LQWL IRUL LQL VXPD S>L@ S LþWLSUYHN SRþHWSUYN UHWXUQVXPD ` LQWSROH>@ LQWV V VRXFHWS YUDFtVRXþHW Qi]HYSROH MHMHKRDGUHVRX SRþHWSUYN Obr. 14.5 Funkce soucet a její použití Práce s polem uvnitø funkce je velmi jednoduchá. Dokonce nemusíme používat ani operátor dereference k prvkùm pøistupujeme indexováním. Také pøi volání funkce soucet, je vše také snadné. Neobjeví se dokonce ani zápis operátoru reference (název pole je rovnou jeho adresou). 14.2 ØETÌZEC Øetìzec je pole znakù, se kterými se pracuje najednou. Øetìzec je reprezentován jako jednorozmìrné pole znakù, èili jako typ: char[ ]. V souvislostmi s pomocnými funkcemi se bude objevovat i zápis char*. Již ale víme, že název pole odpovídá jeho adrese. Pøipomeòme, že pole se v jazyce C++ indexuje vždy od nuly. To znamená, že první znak øetìzce je uložen v prvku s indexem 0. Další znaky jsou pak uloženy v následujících prvcích. A C pro mikrokontroléry ATMEL AT89S52 165

Délka øetìzce není stanovena pøímo, ale pomocí tzv. zarážky. Zarážka je znak s ASCII kódem 0, tedy '\0'. Jedná se o znak, který nelze zobrazit na výstupním zaøízení nebo jej pøeèíst ze vstupního zaøízení. Pøi definici øetìzce je tøeba uvážit, že zarážka samotná zabírá také jednu pozici. Pokud chceme, aby promìnná r typu øetìzec obsahovala text AT89S52, musíme ji definovat jako alespoò 8prvkové pole znakù. Viz obr. 14.6. U $ 7 6? DGUHVD Obr. 14.6 Jednotlivé znaky øetìzce r Øetìzcový literál a inicializace øetìzce Øetìzcový literál se zapisuje mezi uvozovky (pøipomeòme, že znakový literál se zapisuje mezi apostrofy). Literál je chápán jako celý øetìzec, to znamená, že za poslední znak je automaticky pøipojena zarážka. Inicializaci øetìzce pøi definici je možno provádìt podobnì, jako u prostého pole: char r[20]="at89s52"; Také mùžeme využít skuteènosti, že pøekladaè poèet znakù spoèítá (nyní je fyzická délka 8 prvkù): char r[]="at89s52"; Poslední variantou je využití souvislosti pole s ukazatelem. Níže uvedený zápis je rovnìž možný, nepreferujeme jej však: char *r="at89s52"; Operace pøiøazení (=) není pro øetìzec definována. Takže pøiøadit hodnotu lze pouze v rámci inicializace. Jinak musíme používat funkci strcpy. Podobnì operátory <, <=, >, >= také nejsou definovány. Jejich použití vede k porovnání adres øetìzcù. Korektní porovnání musíme provést pomocí funkce strcmp. Pomocné funkce pro práci s øetìzci Pomocné funkce pro práci s øetìzci jsou k dispozici v podobì hlavièkového souboru string.h. Zde je seznam nejpoužívanìjších funkcí vèetnì krátkého popisu: n unsigned strlen(const char *s) vrátí délku øetezce s, n char* strcpy(char *dest, const char *src) zkopíruje znaky øetìzce src do øetìzce dest, n char* strcat(char *dest, const char *src) spojí dva øetìzce, tedy pøipojí øetìzec src za øetìzec dest, 166 C pro mikrokontroléry ATMEL AT89S52 A

n char* strchr(const char *s, int c) vyhledá první výskyt znaku c v øetìzci s, pokud je znak nalezen, vrátí jeho adresu, pøi nenalezení vrátí NULL, n char* strstr(const char *s1, const char *s2) vyhledá první výskyt podøetìzce s2 v øetìzci s1, pokud je podøetìzec nalezen, vrátí jeho adresu, pøi nenalezení vrátí NULL, n int strcmp(const char *s1, const char *s2) porovná abecednì dva øetìzce: je-li s1<s2, vrátí výsledek <0, je-li s1==s2, vrátí výsledek 0, je-li s1>s2, vrátí výsledek >0. Ukázka použití øetìzcových funkcí: LQFOXGHVWULQJK! KODYLþNRYêVRXERUVWULQJK YRLGPDLQ ^ FKDUU>@ FKDUU>@ FKDUU>@ LQWG GHILQLFHW t HW ]F VWUFS\UPLNURNRQWUROHU VWUFS\U$76 UREVDKXMHPLNURNRWUROHU UREVDKXMH$76 G VWUOHQU VWUFS\UU VWUFDWU VWUFDWUU G VWUFPSUU ` GMHGpOND HW ]FHUWHG\ UREVDKXMHPLNURNRQWUROHU UREVDKXMHPLNURNRQWUROHUPH]HUD UREVDKXMHPLNURNRQWUROHU$76 GMHYêVOHGHNSRURYQiQtUU WHG\GSURWRåHUMHDEHFHGQ S HGU A C pro mikrokontroléry ATMEL AT89S52 167