|
|
Úvod do Borland C
Popis prostredia Borland C
Programovať
v jazyku C (alebo v ľubovolnom inom)
znamená písať Zdrojový text programu v textovom editore
a dodržiavať syntaktické pravidlá programovacieho jazyka.
Preložiť program
znamená spustiť špeciálny program - Kompilátor, ktorý transformuje
zdrojový text programu do binárneho
vykonateľného súboru (executable = vykonateľný).
Podmienkou je, aby Zdrojový text programu nemal syntaktické chyby
t.j. formálne chyby príkazov programovacieho jazyka . V prípade syntaktickej
chyby sa vytváranie spustiteľného súboru preruší. Počas prekladu kompilátor
vytvára protokol o preklade a tento sa ukladá do osobitného súboru
odvodeného od názvu Zdrojového súboru, ale s príponou .lis (<názov>.lis).
Pri neúspešnom preklade programátor v tomto súbore nájde všetky chybové
hlásenia. Mnoho chýb vo výpise môže byť zapríčinených predchádzajúcimi chybami.
Preto je ich potrebné odstraňovať v poradí od prvého.
Vykonateľné súbory
(označované príponou .EXE
) obsahujú strojové inštrukcie v binárnom
tvare určené pre konkrétny typ procesora počítača. Operačný systém počítača
spúšťa vykonateľný program pomocou príkazu napríklad:
<názov>.exe p1 p2 ... pn
, kde <názov>
sa nahradí skutočným názvom programu (program sa môže
štartovať aj bez uvedenia prípony .exe - operačný systém si ju automaticky
doplní sám). Medzerami oddelené p1,p2
až pn predstavujú
parametre použité pri štartovaní programu. Parametre sa po štarte programu
priradia premenným zodpovedajúcim poradovému číslu parametra
a ich hodnoty môže program priamo použiť. Parametre slúžia zvyčajne na
riadenie chodu programu. Existujú aj iné metódy riadenia programov (napríklad
pomocou súborov typu .ini
a pod.) do ktorých pred štartom programu
vpíšeme údaje. Je zvykom do parametra volaného programu vložiť názov súboru
obsahujúci väčšie množstvo riadiacich údajov. Ktorá možnosť sa využije záleží
od rozhodnutia programátora.
Čo sa deje po spustení programu?
Operačný systém po zadaní príkazu na štart
vykonateľného súboru s príponou .exe najprv tento súbor vyhľadá a
skopíruje do Operačnej pamäti.
Potom obsah parametrov priradí programovým
premenným ktoré umiestni na konkrétne adresy v operačnej pamäti, kde ich neskôr
program nájde a použije . Po tejto príprave operačný systém vloží do PC
registra štartovaciu adresu programu, čím de facto predá programu riadenie.
PC register procesora ukazuje vždy na adresu operačnej pamäti v ktorej sa
nachádza aktuálna inštrukcia v strojovom kóde, ktorú procesor následne bude
vykonávať. (Program Counter - znamená doslova počítadlo inštrukcií -
avšak v tomto prípade je hlavne používaný ako register pre adresovanie
inštrukcií. Jeho obsah sa automaticky mení po každom Inštrukčnom cykle /viď.
Inštrukčný cyklus/.) Na rozdiel od počítadiel, ktoré sa zvyčajne zvyšujú
o 1, Program Counter sa počas inštrukčného cyklu zväčší o dĺžku práve
vykonávanej inštrukcie (to môže byť 1,2,3, ... podľa procesora a druhu jeho
inštrukcie ) tak, že sa v ňom nastaví adresa nasledovnej inštrukcie.
Najdôležitejšie prípony súborov v Borland C
.C zdrojový súbor, obsahuje text
programu v jazyku C
.OBJ objektový tvar časti programu
.EXE spustiteľný súbor, nečitateľný, zrozumiteľný pre daný procesor
a operačný systém.
.H hlavičkový súbor, čitateľný, zrozumiteľný pre človeka
.LIB knižnica objektových tvarov funkcií, nečitateľný, zrozumiteľný
pre daný procesor a operačný systém.
.CPP zdrojový súbor, obsahuje text programu v jazyku C++,
čitateľný, zrozumiteľný pre človeka. Je zdrojovým súborom pre preklad.
Najdôležitejšie podadresáre v Borland C:
BIN
obsahuje spustiteľné súbory ( BC.EXE,... )
INCLUDE obsahuje hlavičkové súbory ( STDIO.H,... )
LIB
knižnice objektových tvarov funkcií ( MATH.LIB,... )
BGI
grafické ovládače a fonty ( EGAVGA.BGI, SANS.CHR,... )
EXAMPLES príklady zdrojových textov a hlavičkových súborov
( HELLO.C,... )
Postup spracovania programu
Programy sú vytvárané - písané v
textovom editore. Najlepšie sa to robí v
špecializovanom vývojovom prostredí - ktoré ma
integrované HELP súbory obsahujúce príklady, popis príkazov jazyka a návody
práce. Postup činností pri spracovaní programu vyjadruje nasledovná schéma:
Editor
-
nástroj na písanie dokumentu - vytvára zdrojový
text súboru, ktorého
názov je ukončený charakteristickou príponou ( .C
, resp. Borland C++ má .CPP
).
Preprocesor
- je program, ktorý automaticky
upraví vytvorený zdrojový program, a odstráni v ňom všetky poznámky a zbytočné
medzery. Z hlavičkových súborov (.h)
skopíruje požadované deklarácie funkcií používaných v programe a nakoniec
vytvorí pracovný textový súbor
určený pre prekladač - t.j. kompilátor jazyka C.
Compiler -
Prekladač
alebo aj
Kompilátor je
program, ktorý zdrojový text prekladá do strojového kódu, ale do jeho
relatívneho formy. Vzniká súbor rovnakého názvu ale s novou príponou (.obj).
Program v relatívnom tvare je prekladaný so štartovacou adresu 0, nemá nastavené
žiadne absolútne adresy, ešte nemá doriešené adresovania na premenné a volania
funkcií náväzných modulov programu. Compiler odhaľuje chyby syntaxe príkazov
(t.j. chybne zapísané príkazy - nezodpovedajúce pravidlám) a nedoriešené vzťahy
na deklarácie externých funkcií. O zisteniach informuje v sprievodnom súbore
rovnakého názvu ale s upravenou koncovkou (.lis).
L inker
- volaný aj
zostavovací program, spája všetky relatívne
moduly do jedného uceleného programu a nahradzuje
relatívne adresy z relatívnych modulov (.obj)
absolútnymi adresami.
Z knižničných súborov (.lib),
ktoré obsahujú ďalšie relatívne moduly, pripája požadované moduly a prepája ich
s volaniami funkcií v iných, do výsledného programu pripojených, relatívnych
modulov. Vo vytváranom programe nahradzuje fiktívne volania absolútnymi
volaniami na miesta kam moduly, obsahujúce funkcie z knižničných súborov,
umiestnil. Týmto vzťahom vzájomnej komunikácie modulov hovoríme
krížové referencie. Výsledkom
činnosti linkera je spustiteľný program rovnakého názvu s príponou (
.exe ), ktorý má vyriešené všetky krížové
referencie a je bez chýb.
Debuger
- (odstraňovač chrobákov = po našom odstraňovač "múch")
je ladiaci program, ktorý
umožňuje krokovať ladený program a vyhľadať chyby
práce programu, t.j. nesprávneho algoritmu.
Umožňuje zisťovať príčiny tzv. "Runtime Errors", t.j. chyby ktoré sa prejavia až
po spustení programu v "čase jeho behu". Takýto program môže byť po formálnej
stránke v poriadku. Tomuto procesu hovoríme
ladenie. Debuger má schopnosť sledovať chod
ladeného programu po krokoch (step = krok).
, t.j zastaviť po každom riadku programu, resp. zastavovať na miestach do
ktorých sa pred spustením ladeného programu vložia tzv. STOP ZNAČKY (BREAK
POINTS) Dôvodm pre zastavenie programu môže byť
udalosť napr. zmena
hodnoty sledovanej premennej. V bodoch zastavenia nám debuger umožňuje
prekontrolovať momentálny stav premenných použitých v programe. Odhalením
odchýlky od požadovaného stavu obsahu dátových objektov programátor ďalšou
analýzou určí chybu v programe. Najčastejšou chybou je nezhoda medzi tým
čo chceme aby program robil a
tým čo a ako mu to inštrukciou prikážeme.
Proces ladenia
- je činnosť v ktorej programátor
opakovane upravuje zdrojový text programu, spúšťa proces kompilácie a odstraňuje
zistené chyby. Niektoré chyby môžu vyvolávať aj iné náväzné (tzv.
sekundárne) chyby programu,
preto nájsť skutočnú príčinu chyby býva komplikovaná činnosť vyžadujúca
trpezlivosť. Práca profesionálnych programátorov je charakteristická tým, že
množstvo chýb v porovnaní s vytvoreným množstvom programových inštrukcií býva
časom menšia a menšia. Chybovosť u profesionálov sa neskôr viac prejavuje v
zlým pochopením zadania úlohy zadávateľom, resp. chybami v analýze riešenia
úlohy ako takej. Z týchto dôvodov dolaďovanie programov by mala byť tímová práca
analytikov ale aj programátorov. Významnú úlohu majú aj
testovači.
Sú to ľudia ktorých pracovnou náplňou je
overovanie funkcie programu v každom režime práce. Vyjadrujú sa k farebnému
dizajnu aplikácií, obsahovej stránke, pracovnej pohode, prístupu k HELPom pri
riešení konkrétnych pracovných postupov v aplikácii a odhaľujú anomálie práce
aplikácie t.j. nezhody medzi tým čo má program robiť a čo skutočne robí. Všetky
takto zistené veci sú dôvodom na úpravu zdrojového textu programu. Najčastejšie
sa však prejaví problém až po nasadení aplikácie do prevádzky. Nie nadarmo sa
hovorí: "Až prax overí všetky funkcie".
Práca s preprocesorom,
kompilátorom a linkerom
| ALT + F9
|
kompiluj súbor .c v okne do
súboru .obj |
|
F9
|
kompiluj súbor .c v okne do súboru .obj, pripoj k nemu
potrebné objektové tvary funkcií z knižníc .lib a vytvor súbor
.exe. |
| CTRL+F9 |
kompiluj súbor .c v okne do súboru .obj, pripoj
k nemu potrebné objektové tvary funkcií z knižníc .lib a vytvor súbor
.exe a spusť ho. |
Práca
so schránkou ( clipboard )
Show clipboard zobraziť schránku
| COPY
|
CTRL + INS
|
kopírovať do schránky |
| PASTE
|
SHIFT + INS
|
nalepiť zo schránky |
| CLEAR
|
CTRL + DEL
|
vymazať |
| CUT
|
SHIFT + DEL
|
vystrihnúť do schránky |
Niektoré užitočné „hot keys“:
|
Ukonči
program |
ALT + X |
|
Aktivuj hlavné
menu |
F10 |
|
Aktivuj položku File, Edit,... |
ALT + F, ALT + E, ... |
|
Prepni do ďalšieho
okna |
F6 |
|
Zväčši |
F5 |
|
Uzavri
okno |
ALT + F3 |
|
Ulož
súbor |
F2 |
|
Vykonaj nasledujúci
príkaz |
F7 |
|
Vykonaj nasledujúci
riadok |
F8 |
|
Zruš krokovanie
programu |
CTRL + F2 |
|
Sleduj obsah
premennej |
CTRL + F7 |
|
Ukáž / zmeň obsah premennej |
CTRL + F4 |
Zdrojový text programu
Z
formálnej obsahovej stránky to budú nasledovné
elementy:
- volania hlavičkových súborov
#include <stdio.h>
- biele znaky -
oddeľovače t.j. existujúce ale neviditeľné
medzery, tabulátory, nový riadok, nová stránka, návrat na začiatok riadku
- ASCII znaky 0-127
pridelené základnej znakovej sade (dolná časť 256
znakovej ASCII tabuľky) je používaná na tvorbu
znakových reťazcov programu
- ASCII znaky 128-255
pridelené rozšírenej znakovej sade obsahujúcej národné znaky abecedy (
horná časť 256 znakovej ASCII tabuľky) tieto sa
maximálne objavia ako texty zobrazované pri komunikácii na obrazovke
počítača.
- identifikátory
- t.j. textové
reťazce v ktorých záleží na veľkosť písmen
(veľké a malé znaky majú rôzne ASCII kódy). Používajú sa ako názvy z ktorých
na rozlíšenie sa podľa ANSI C použije len prvých 31 znakov (Pozn.: Sú
prípady keď len 8)
- komentáre -
kompilátorom ignorované popisné texty slúžiace ako poznámky uzavreté medzi
dvojice /* a
*/ medzi ktorými sa
môžu objaviť ľubovolné znaky ASCII tabuľky t.j. aj biele znaky (odporúča sa
nepoužívať národné znaky)
Z
programátorskej stránky - to sú konštrukcie ktoré predstavujú
jednak
- deklarácie
a definície dát
ktoré názvom dátových objektov pridelia vlastnosti a adresný priestor.
- deklarácie a definície funkcií,
ktoré názvom funkcií pridelia vlastnosti, adresný
priestor a príkazové konštrukcie vykonávajúce požadované algoritmy
- výrazy a príkazy
Programátorské konštrukcie nám umožňujú budovať
algoritmické postupy využívajúce:
Dátové objekty (premenné a konštanty) nám
predstavujú identifikátory ktorým prideľujeme typ a hodnotu.
Funkcie -
predstavujú základný stavebný prvok v
jazyku C. Všetko v tomto jazyku sa skladá z
funkcií i funkcie samotné. Každá nová funkcia sa skladá z iných funkcií, takže
program v jazyku C predstavuje súbor definícií funkcií a ich používanie.
Hlavná funkcia, ktorá štartuje celý program, má
vyhradený názov main (). Táto funkcia môže volať a používať ďalšie
funkcie a definovať a používať lokálne a globálne premenné. Funkcie
a Premenné sa líšia
tým, že za identifikátorom funkcie vždy nasledujú zátvorky, či už obsahujúce
parametre alebo nie ( )
.
Premenné -
sú dátové objekty ktoré v
C jazyku sú charakterizované
typom. Dátové objekty konkrétneho typu majú
svoju veľkosť
vyjadrenú počtom slov ktoré zaberajú v Operačnej pamäti. Prístup k dátovým
objektom je jednak cez ich názvy,
a jednak cez adresy na
ktoré ukazujú tzv. pointre
na dané premenné. Jazyk C používa dva druhy
premenných a to lokálne a
globálne.
- Lokálne premenné
sú deklarované a platia v jednom bloku (t.j. v jednej funkcii). Pre ostatné
bloky (t.j. funkcie) sú neviditeľné. Lokálne môžu
byť jedine dátové objekty, nie funkcie. Rozlišujú sa:
- statické -
ktoré z časového hľadiska vytvoria sa pri vstupe do
funkcie a zrušia pri ukončení programu - viditeľné sú len vo funkcii kde
boli definované. Prekladač ich umiestňuje do dátovej oblasti pamäti.
- dynamické
- sa vytvoria pri vstupe do funkcie a skončia s ukončením funkcie.
- Globálne premenné
je možné používať vo všetkých blokoch (funkciách). Deklarujú sa pred všetkými
funkciami hneď za príkazmi preprocesora #include.
- statické - sú
také, ktorých existencia začína so spustením programu a končia s jeho
ukončením. Prekladač ich uloží do dátovej oblasti pamäti.
Globálne premenné sú jedine statické.
Príkazy
sú výrazy vytvorené podľa syntaktických pravidiel C jazyka
a ktoré sú zakončené bodkočiarkou ( ;
). Výraz bez bodkočiarky nie je príkazom. Skupina
viacerých príkazov môže byť spojená do zloženého
príkazu zloženými zátvorkami
{ a
}. Tieto zložené zátvorky
možno použiť všade tam, kde sa dá použiť aj jednoduchý výraz.
Blok príkazov
- je rovnako uzavretý medzi dve zložené zátvorky {
} , ale tesne za otváracou zátvorkou ({
) obsahuje definície premenných. Rozdiel teda medzi blokom príkazov a zloženým
príkazom je v prítomnosti definícií.
Súbory -
sú dátové objekty, ktoré uchovávajú informácie (dáta) na
jednotkách s permanentnou pamäťou. Hlavné typy súborov sú:
- textové
- obsahujú text kódovaný v znakoch kde každý znak zaberá presne 1 byte
informácie uloženej v slovách (8, 16, 32, 64, ... ) podľa triedy počítača.
Charakteristickým znakom textových súborov je tlačiteľnosť na všetkých druhoch
tlačiarní v tzv. textovom režime, kde každému kódu písmena zodpovedá grafická
prezentácia "zadrôtovaná" do hardware tlačiarne. Aj medzi textovými súbormi
existuje špeciálny "spustiteľný súbor"
s príponou .bat.
Tento súbor neobsahuje program, ale príkazy spúšťajúce programy. Takýto súbor
nazývame aj dávkový súbor, pretože môžeme doň dopredu zapísať príkazy, ktoré
by sme inak museli postupne zadávať v štartovacom riadku operačného systému.
Pri spustení dávky sa jednotlivé príkazy postupne vykonávajú bez nášho
ďalšieho zásahu.
- binárne
- sú univerzálne dátové súbory, ktoré majú informácie
kódované vlastným spôsobom, ktorému rozumie daná programová aplikácia tak ako
ju vymyslel jej programátor. Tu neexistujú normy a dohody. Binárne súbory
majú svoj obsah formálne ukladaný ako sekvenciu x-bajtových slov (kde x=8, 16,
32, ...), ale nad touto štruktúrou je logická štruktúra, ktorú si
"obhospodaruje" aplikačný program. Inak povedané program "vie" čo tam má
uložené, a vie ako sa k informácii dostane.
- a spustiteľné
- sú špeciálne binárne súbory, ktoré majú
štandardizovaný tvar podľa pravidiel ktoré používa daný Operačný systém
počítača. Jeho obsahom je presný sled počítačových inštrukcií, ktoré sa
ukladajú do spustiteľného súboru v poradí, tak ako sa budú kopírovať do
Operačnej pamäti tesne pred spustením programu.
Príkazy preprocesora
Sú to príkazy ktoré sa vykonávajú ešte pred kompiláciou. Pred samotnými
príkazmi je znak #. Príkaz preprocesora #include
vkladá do zdrojového textu obsah iných súborov, zvyčajne obsahujúce deklarácie
funkcií. Zvyčajne tieto súbory majú označenie .h čo
znamená header (hlavička). Volania majú dva možné
tvary
#include <stdio.h>
pre vkladanie systemových súborov umiestnených v
aktuálnom adresári, alebo v adresári INCLUDE.
#include "defs.f"
pre vkladanie užívateľom vytvorených súborov.
Príklady:
- #include <stdio.h>
- #include <conio.h>
- #include "kniznica.c"
Ďalší príkaz preprocesora #define slúži na zavádzanie symbolických
konštánt.
- #define MAX 100 /* definovanie
konštanty MAX nastavenú na hodnotu 100 */
]
Tieto veci budú popisované neskôr
Funkcie nesmú byť definované
vo vnútri inej funkcie, ale jedna funkcia môže volať
druhú funkciu. Problém by mohol vzniknúť keď v poradí prvá funkcia sa odvoláva
na druhú, ktorej definícia v zdrojovom texte ešte len bude nasledovať. Riešením
je informatívna deklarácia hlavičky druhej funkcie,
ktorá predchádza prvú funkciu a informuje o názve,
návratovej hodnote, type
a počte parametrov funkcie bez toho, aby definoval
jej obsah. Ak by sme funkciu prirovnali k bytu,
ktorý má dvere - interface ( interface
znamená rozhranie - jednotkou medzistyku- medzi dvomi prostrediami - exteriérom
a interiérom bytu) a vnútorný priestor bytu s vnútornou vybavenosťou, potom
deklarácia je fotografia dverí bytu a definícia je byt samý.
Deklarácie -
sú príkazy, ktoré udávajú typ a meno premenných a
funkcií ale neprideľujú žiadnu pamäť. Slúžia na
informovanie o budúcej Definícii funkcie.
Definície -
sú príkazy, ktoré pridelia premennej a funkcii konkrétneho
typu meno a pamäť. A v tomto priestore fyzicky budú
uložené detailné inštrukcie funkcie.
|