IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí



Podobné dokumenty
Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

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

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

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

Programovací jazyk C++ Hodina 1

Rozsáhlé programy = projekty

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

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.

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

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

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

PROGRAMOVÁNÍ V C++ CVIČENÍ

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

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Operační systémy. Cvičení 4: Programování v C pod Unixem

Jazyk C++ I. Šablony 2

PREPROCESOR POKRAČOVÁNÍ

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Funkční objekty v C++.

PB161 Programování v jazyce C++ Přednáška 10

Operační systémy. Cvičení 3: Programování v C pod Unixem

PROGRAMOVÁNÍ V C++ URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH ROSTISLAV FOJTÍK

IRAE 07/08 Přednáška č. 1

Algoritmizace a programování

x86 assembler and inline assembler in GCC

IUJCE 07/08 Přednáška č. 1

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

IUJCE 07/08 Přednáška č. 6

Více o konstruktorech a destruktorech

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

Opakování programování

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

IPA - Lab.1 Úvod do programování v ASM

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

PB161 Programování v jazyce C++ Přednáška 7

PB161 Programování v jazyce C++ Přednáška 7

Struktura programu v době běhu

Základy programování (IZP)

David Bednárek Jakub Yaghob Filip Zavoral.

dostat zdroják Petr Zemek Fakulta informačních technologií VUT v Brně izemek

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Jazyk C++ II. Šablony a implementace

Úvod do programovacích jazyků (Java)

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

Konstruktory překladačů

Dědičnost (inheritance)

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Generické programování

Programování v Javě I. Leden 2008

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Programování v jazyce JavaScript

dovolují dělení velkých úloh na menší = dekompozice

PB161 Programování v jazyce C++ Přednáška 4

Algoritmizace a programování

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

přetížení operátorů (o)

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

PB161 Programování v jazyce C++ Přednáška 9

Abstraktní třídy, polymorfní struktury

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Jazyk C++ I. Šablony

Programování v Javě I. Únor 2009

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

PB161 Programování v jazyce C++ Přednáška 9

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Programování MCU ve vyšších programovacích jazycích

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

Množina čísel int stl-set-int.cpp

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Prostory jmen. při vkládání několika hlavičkových souborů může vzniknout kolize. logika.h const int x=5; typedef struct {...

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

Úvod do OpenMP. Jiří Fürst

- jak udělat konstantu long int: L long velka = 78L;

- tzv. standardní vstupní a výstupní proud (input / output stream)

Zápis programu v jazyce C#

Algoritmizace a programování

PB161 Programování v jazyce C++ Přednáška 10

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

8 Třídy, objekty, metody, předávání argumentů metod

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Rozšiřování a upravování stávající funkcionality PLToolbox, Orafce

Př. další použití pointerů

Transkript:

Velké projekty v C velký = 100ky a více řádek udržovatelnost, bezpečnost, přehlednost kódu rozdělení programu do více souborů další prvky globální proměnné, řízení viditelnosti proměnných, funkcí Globální proměnné opakování: lokální proměnné o definované uvnitř těla funkce (bloku) o viditelné pouze uvnitř těla funkce (bloku), ve kterém byly definovány Definice mimo tělo funkce Viditelné v jakékoliv funkci, jejíž definice se nachází za definicí globální proměnné void TiskGlobal(void); int GlobalProm; // globalni promenna int LokalProm = 10; GlobalProm = 2*LokalProm; TiskGlobal(); // vytiskne: "Hodnota = 20" scanf("%d", &GlobalProm2); // CHYBA!!! int GlobalProm2; void TiskGlobal(void) printf("hodnota je %d\n", GlobalProm); implicitně inicializovány na 0 (dle typu 0, 0.0, '\0', 0,0, atd.) Používat s rozvahou!! o zhoršují udržovatelnost kódu (na PC prvotní hledisko) funkce nejsou samostatné jednotky (viz. např. TiskGlobal() výše) o omezují paměťové nároky a mohou zvýšit rychlost aplikace (na PC podružné, u MCU někdy nutnost) o pouze pro sdílená data 1

Příklad dobrého využití aplikace pracující se sériovým portem (nefunkční!!!) // globalni promenne int Pristupu = 0; int JePripojen = 0; // 0 = nelze komunikovat, 1 = port pripraven // deklarace funkci void WriteCOM(int co); int ReadCOM(void); void InitCOM(void); void CloseCOM(void); int temp; InitCOM(); WriteCOM('A'); WriteCOM('h'); temp = ReadCOM(); WriteCOM('o'); temp = ReadCOM(); WriteCOM('j'); temp = ReadCOM(); temp = ReadCOM(); CloseCOM(); printf("pristupu: %d", Pristupu); void InitCOM(void) // inicializace komunikace if (SePodarila) JePripojen = 1; void CloseCOM(void) // uzavreni portu JePripojen = 0; void WriteCOM(int co) if (JePripojen) // ochrana pred komunikaci s neinit portem COM = co; // COM je pouze abstrakce serioveho portu Pristupu++; int ReadCOM(void) if (JePripojen) // ochrana pred komunikaci s neinit portem Pristupu++; return COM; // COM je pouze abstrakce serioveho portu // pokud nejsme pripojeni k portu 2

Viditelnost proměnných překrývání proměnných int x; // 1 void f(void); int x; // 2 x = 10; // do 2 int x; // 3 x = 20; // do 3 printf("x = %d\n", x); // 3 printf("x = %d\n", x); // 2 f(); void f(void) x = 33; // do 1 Atributy datových objektů Paměťové třídy datový objekt proměnné, funkce datový objekt = identifikátor + atributy atribut = upřesnění vlastností datového objektu o explicitní určuje programátor o implicitní určuje překladač (programátor může změnit) atributy: o datový typ známe o rozsah platnosti scope o doba existence duration o viditelnost z dalších modulů programu linkage upravují rozsah platnosti a dobu existence určuje umístění datového objektu v paměti 3

třída auto o objekty uloženy na zásobníku o implicitně pro lokální proměnné vzniká při vstupu končí s příklad: void Funkce(void) auto int lokprom; // auto není nutne třída static o mění duration lokálních proměnných o statická lokální proměnná: vzniká při spuštění programu zachovává hodnotu i po opuštění funkce inicializována na 0 o příklad: počet volání funkce void Funkce(void) static int pocet; // impl. init na 0 printf("%d. volani fce\n", ++pocet); Funkce(); Funkce(); Funkce(); o pozor na static u globálních proměnných o je uložena v datovém segmentu třída register o překladač umístí proměnnou do registru, nikoli do RAM rychlejší třída extern o viz. později programy z více modulů Typové modifikátory typový modifikátor const o definice tzv. konstantních proměnných = po inicializace nelze měnit const int max = 100; max = 200; // error kompilátoru o omezení oproti #define: nelze použít do konstantních výrazů (inicializace globálních proměnných, definice velikosti polí atd ) 4

o nejčastější použití volání odkazem beze změny parametru uvnitř fce int hledej(const char *str, char co) Příklad #include <string.h> // Funkce najde znak c a vrati pozici int Hledej(const char *str, char c) // nejaky kod strcpy(str,"cau"); // pokus o zmenu retezce /* kompilator vypise error: error C2664: 'strcpy' : cannot convert parameter 1 from 'const char *' to 'char *' */ // nejaky kod return -1; typový modifikátor volatile o info pro kompilátor: proměnná může být modifikována pomocí nějaké asynchronní události např. pomocí přerušení o úsek programu, ve kterém se tato proměnná nachází, nebude překladačem optimalizován. o příklad zápisu: Projekt z více souborů možnosti: volatile int i; i = 0; while (i == 0); /* smycka se ukonci az po prichodu nejake vnejsi udalosti, ktera zmeni promennou i */ 1. include do jednoho překlad 2. oddělený překlad samostatných jednotek + linker 5

Ad 1. include opakování #include soubor nepoužívat Ad 2. Samostatný překlad každý soubor *.c (*.cpp) lze přeložit samostatně (*.obj) spolupráce modulů (na úrovni ZK) soubory) export, import proměnných a funkcí (hlavičkové viditelnost identifikátorů mimo soubor se ZK globální proměnné + označené funkce (viz. dále další podmínky) extern deklarace o = export import funkcí o import globálních proměnných o může sloužit i jako interní deklarace hlavičkové soubory = protředek pro sdílení informací mezi moduly o XXX.c: definice všech funkcí, neexportované deklarace funkcí, #define, typedef... o XXX.h: deklarace exportovaných funkcí, exportované #define, typedef... o Ostatní.c pokud nutné něco z XXX.C #include "XXX.h" o XXX.c doplnění deklarací exportovaných funkcí taktéž #include "XXX.h" o nutno zabránit vícenásobným vložením (možné problémy) ochrana přes definici makra JMENOSOUBORU_H viz. příklad níže. 6

Příklad 1 o předpoklady: 2 moduly + main() modul 1 interní f2(), exportovaná f1() o výpis funkce1.c #include "modul1.h" #include "modul2.h" // nutne - funkce volaji printf() void f2(void); int f1(void) int a; a = f3(); f2(); printf("f1\n"); return a; void f2(void) printf("f2\n"); // deklarace f2 - nebude videt zvenku // definice f1 // volani importovane funkce // volani lokalni funkce // definice f2 o výpis funkce1.h #ifndef MODUL1_H #define MODUL1_H // symbol plati až do konce souboru (kam byl h soubor vložen!) extern int f1(void); #endif o výpis funkce2.c #include " modul2.h" // deklarace void f4(void); // import extern int gp1; // export f1 // volaji printf() // deklarace f4 // deklarace gp1 Co je v projektu, to se překládá int f3(void) // definice f3 f4(); printf("f3\n"); return gp1 + 10; // lokalni pomocna funkce void f4(void) // definice f4 printf("f4\n"); *.h pouze pro přehlednost. Důležité je #include 7

o výpis funkce2.h #ifndef MODUL2_H #define MODUL2_H extern int f3(void); // export f3 #endif o výpis main.c #include "modul1.h" #include "modul2.h" // definice GP int gp1; // možno dát jako extern int gp1 do dalšího h int a, b; gp1 = 5; a = f1(); b = f3(); Static u globálních proměnných a funkcí velké projekty možné kolize identifikátorů problém: lze importovat neexportované globální proměnná nebo funkce řešení: všechny lokální globální proměnné nebo funkce označit static o zcela něco jiného než u lokálních proměnných!!! Příklad: o výpis main.cpp static int prom; static void f1(void); // chci lokalni glob. prom // chci jako lokalni funkci int main(int argc, char* argv[]) void f1(void) printf("f1()"); o výpis funkce.cpp extern int prom; extern void f1(void); // ERROR: unresolved ext. symbol // ERROR: unresolved ext. symbol void f2(void) prom = 10; f1(); 8

pokus o použití neexportovaného symbolu chyba linkeru neoznačí místo chyby!!! funkce2.obj : error LNK2019: unresolved external symbol "int cdecl f2(void)" (?f2@@yahxz) referenced in function "void cdecl f4(void)" (?f4@@yaxxz) C:\dokumenty\ucim\iujce\přednášky\pr07\pr07pokusy\Debug\pr07pokusy.exe : fatal error LNK1120: 1 unresolved externals Velké projekty shrnutí globální proměnné používat co nejméně projekt rozdělit do funkcí spolu související = 1 soubor o lokální funkce a lokální globální proměnné v jednom souboru označit static o vše, co se exportuje deklarace do hlavičkového souboru o *.h zamezit vícenásobnému vložení pokud v X.c, potřebuji funkci z Y.c #include "X.h" 9