Ú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 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).  

Linker - 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.