next up previous contents
Next: Lucrul în modul "project" Up: Structurarea programelor C pe Previous: De ce mai multe   Cuprins


Reguli de structurare pe mai multe fisiere

Vom prezenta în continuare anumite reguli general acceptate pentru structurarea unui program pe mai multe fisiere.

În general, se alege un fisier care va fi fisierul principal, în acest fisier fiind implementata functia main(); în celelalte fisiere nu va mai fi implementata aceasta functie. În fisierul antet se vor trece definitia tipurilor de date folosite si declaratiile (prototipurile) functiilor. Nu se vor trece în fisierul antet declaratii de variabile si implementari de functii (este perfect "legal" sa apara declaratii de variabile si implementari de functii, fisierul antet fiind tratat ca orice fisier C, dar aceasta maniera de programare distruge conceptul de modularizare a programelor si de încapsulare a datelor). În fisierul auxiliar antetului (cu acelasi nume si extensia .c) se va trece implementarea functiilor definite în fisierul antet. În acest fisier nu se va implementa functia main(). Atât fisierul principal cât si cel auxiliar vor include fisirul antet. Astfel se realizeaza încapsularea tipurilor de date si a functiilor în fisiere separate.

Aceasta maniera de structurare a programelor este folosita în scrierea unor biblioteci de functii. Programatorul care doreste sa furnizeze o biblioteca de functii va scrie fisierul antet si fisierul auxiliar antetului, care va include fisierul antet. În fisierul antet vor fi trecute functiile si tipurile de date oferite de biblioteca, iar în fisierul auxiliar vor fi implementate aceste functii. Aceste fisiere se compileaza împreuna, rezultând un fisier obiect (nu executabil), iar biblioteca va oferi acces la aceste functii prin includerea în orice program a fisierului antet si prin linkeditarea cu fisierul obiect. Programatorul acestei biblioteci nu va oferi spre utilizare decât fisierul antet si fisierul obiect, astfel maniera de implementare a functiilor oferite de biblioteca ramâne invizibila pentru utilizatorul bibliotecii.

Pentru a exemplifica aceste reguli, consideram un program pentru calculul sumei a doua numere complexe. Pentru aceasta, se va defini o functie suma. De asemenea, vor fi definite si doua functii pentru citirea, respectiv afisarea numerelor complexe.

Programul va fi structurat pe trei fisiere: calcule.c - care contine functia main, operatii.h - fisierul antet unde sunt declarate principalele tipuri de date si functii si operatii.c - implementarea functiilor.

Fisierele sursa sunt prezentate în continuare.



Fisierul calcule.c

#include <stdio.h>
#include "operatii.h"

void main(void)
{
  complex x,y;

  printf("introduceti primul numar\n");
  x=citire();
  printf("introduceti al 2-lea numar\n");
  y=citire();

  printf("\nsuma: ");
  afisare(suma(x,y));

  printf("\n");
}

Fisierul operatii.h

/* definire tip de date complex */
typedef struct nr_complex
  {
    double p_real;
    double p_imag;
  } complex;

/* prototipuri functii exportate */
complex citire(void);
void afisare(complex);
complex suma(complex,complex);

Fisierul operatii.c

#include <stdio.h>
#include "operatii.h"

/* implementare functii exportate */
complex citire(void)
{
  complex nr;

  printf("Partea reala: ");
  scanf("%lf",&nr.p_real);
  printf("Partea imaginara: ");
  scanf("%lf",&nr.p_imag);

  return nr;
}



void afisare(complex nr)
{
  if (nr.p_imag<0)
    printf("%lf%lfi\n",nr.p_real,nr.p_imag);
  else
    printf("%lf+%lfi\n",nr.p_real,nr.p_imag);
}

complex suma(complex nr1, complex nr2)
{
  complex rezult;

  rezult.p_real=nr1.p_real + nr2.p_real;
  rezult.p_imag=nr1.p_imag + nr2.p_imag;

  return rezult;
}


next up previous contents
Next: Lucrul în modul "project" Up: Structurarea programelor C pe Previous: De ce mai multe   Cuprins
Cristian Gavrila 2001-10-02