You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 5 Next »

Ciele cvičenia

Cvičenie je zamerané na prácu s kompilačným nájstrojom make.  Tento nástroj slúži na kompiláciu zložitejších projetov, pozostávajúcich z niekoľkých súborov zdrojových kódov, vlastných hlavičkových súborov a podobne. Také projekty sa skladajú z takzvaných modulov, ktorých kombináciou a kompiláciou vzniká finálny softvérový produkt.  Po osvojení si problematiky študent dokáže pracovať s nástrojom make, dokáže generovať konfiguračné súbory Makefile a rozumie filozofii modulárneho programovania. 

  • Modulárne programovanie
  • Kompilácia zdrojového kódu do súboru objektu 
  • make a Makefile

Odporúčaná literatúra a dôležité odkazy

[1] KPI-FEI-TUKE: Prednáška č. 1

[2] KPI-FEI-TUKE: Prednáška č. 2

[3] KPI-FEI-TUKE:  Cvičenie č. 3 - Introduction to Modular Programming

[4] Umberto Salsi: Modular programming in C

[5] Kovač, O.: ZAP -  Cvičenie č. 2


Modulárne programovanie

Modulárne programovanie je technika softvérového dizajnu, pri ktorej sa na výsledný program nepozeráme ako na monolit ale ako na celok zložený zo separátnych častí - modulov. Modulárne programovanie oproti klasickému - "monolitickému" vnáša do vývoja softvéru ako aj do finálneho produktu prehľadnosť. Táto prehľadnosť je zavedená tým, že za rôzne funkcionality programu sú zodpovedné rôzne moduly. Výhodou modulov je tiež to, že je možné pracovať na vylepšeniach alebo opravách (bugfix) programu bez toho, bolo potrebné kompilovať celý projekt. Jednotlivé časti programu môžu byť v jazyku C predkompilované do takzvaných objektových súborov a tieto sa následne spoja - "zlinkujú" do výsledného programu. Takýto prístup pri ozaj rozsiahlych projektoch výrazne šetrí čas. V prípade veľkých projektov je modulárne programovanie doslova nutnosťou. Bližšie si kompiláciu zdrojového kódu (.c) do objektového súboru (.o) popíšeme v ďalšej časti textu.





Kompilácia zdrojového kódu do objektu 

Ako už bolo uvedené vyššie, v jazyku C sa pri modulárnom programovaní zdrojové súbory najprv kompilujú do objektových súborov (.o) a až následne sa spoja do výsledného spustiteľného programu.  Na nasledujúcom príklade ukážeme tento postup s využitím nástroja gcc, ktorý už veľmi dobre poznáme [5]. Len pre pripomenutie tento nástroj/príkaz používame nasledovne:

// použitie gcc všeobecne 
$ gcc -prepinac1 -prepinac2 ... -prepinacN zdrojovy_kod_1.c zdrojovy_kod_2.c obejkotvy_subor_1.o -kniznica1 -kniznica2 -o nazov_programu

// praktický príklad
$ gcc -Werror -Wall program.c -lkarel -lcurses -o PROGRAM
// -Werror znamená, že každé upozornenie (warning) sa vyhodnotí ako chyba (error)
// -Wall zobraziť všetky upozornenia 

Príklad:

Vytvorte program pre zobrazenie zadanej matice a výpočet nasledovných parametrov matice: stredná hodnota, disperzia, maximum, minimum. Využite pritom zásady modulárneho programovania!  

Riešenie:

Jedno z možných riešení je nasledovné:

  • Program bude pozostávať z dvoch zdrojových súborov - hlavny.c a funkcie.c
  • Program bude obsahovať jeden vlastný hlavičkový súbor - funkcie.h 
  • Modul funkcie.c bude prv skompilovaný na objektový súbor - funkcie.o
  • Použite kostru programu ktorá je zobrazená nižšie! V poskytnutom kóde je už vyriešené zobrazenie matice a tiež výpočet strednej (priemernej) hodnoty. 

Nástrojom gcc objektový súbor vytvoríme nasledovne:

// použitie gcc všeobecne 
$ gcc -prepinac1 -prepinac2 ... -prepinacN zdrojovy_kod.c -c 

// praktický príklad
$ gcc -Werror -Wall funkcie.c -c

V pracovnom priečinku by mal vzniknúť súbor s názvom funkcie.o. Teraz je možné pristúpiť ku kompilácii a zlinkovaniu celého programu: 

$ gcc -Werror -Wall hlavny.c funkcie.c -o PROGRAM

poznámka: aj súbor hlavny.c by mohol byť vopred skompilovaný na objektový súbor. 

Pokiaľ nenastala žiadna chyba aktuálny priečinok by mohol vyzerať nasledovne:

ab123cd@zapfei:MODULAR$ ls -l
total 36
-rw-rw-r-- 1 ok876zd ok876zd   547 Mar  3 10:15 funkcie.c
-rw-rw-r-- 1 ok876zd ok876zd    93 Mar  3 09:46 funkcie.h
-rw-rw-r-- 1 ok876zd ok876zd  2128 Mar  3 10:15 funkcie.o
-rw-rw-r-- 1 ok876zd ok876zd   312 Mar  3 09:46 hlavny.c
-rwxrwxr-x 1 ok876zd ok876zd 16896 Mar  3 10:21 PROGRAM

Výpis z terminálu po spustení programu, bude vyzerať nasledovne:

ab123cd@zapfei:MODULAR$ ./PROGRAM

 1  2  3
 4  5  6
 7  8  9

Stredna hodnotoa matice = 5.000000

Kostra úlohy

hlavny.c
#include <stdio.h>
#include "funkcie.h"
int main()
{
  int matica[3][3] = { {1, 2, 3},
                       {4, 5, 6},
                       {7, 8, 9} };
  // Volanie funkcie pre vykreslenie matice        
  vykreslenie(matica, 3);   
  printf("\nStredna hodnotoa matice = %f \n \n", priemer(matica,3));          
  // tu budú ostatné výpočty a zobrazenie ich výsledkov	
  return 0;
}


funkcie.h
void vykreslenie(int matica[][3], int velkost);
float priemer(int matica[][3], int velkost);
// tu budú deklarácie ostatných funckii

funkcie.c
#include <stdio.h>
void vykreslenie(int matica[][3], int velkost)
{
  printf("\n");                     
  for(int i = 0; i < velkost; i++)
   {
     printf("\n");
     for(int ii = 0; ii<velkost; ii++)
       printf(" %d ", matica[i][ii]);
   } 
       printf("\n");       
}
// Výpočet strednej (priemernej) hodnoty
float priemer(int matica[][3], int velkost)
{      
  int suma = 0;             
   for(int i = 0; i < velkost; i++)
     for(int ii = 0; ii<velkost; ii++)
        suma = suma + matica[i][ii];
      
  return suma/(velkost*velkost);            
}
// tu budú definície ďalších funkcii - Disperzia, Max, Min, 




  • No labels