Sunteți pe pagina 1din 33

Programare procedurala C4

Limbajul C: Functii, clase de memorare, tipuri de date


structurate, directive de preprocesare

Grigore Albeanu
http://www.ad-astra.ro/galbeanu/

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 1
Functii C
z Structura
proiectelor C
complexe
z Functia main()
z Functii C

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 2
Prototipul unei functii C/C++
z Funciile sunt ntotdeauna definite la nivelul cel mai
exterior al programului i au asociate adrese fixe de
memorie. Sunt implicit n clasa extern, deci sunt
vizibile n modulul n care sunt definite, de la locul de
definire spre sfritul fiierului, ca i n toate celelalte
module de program. Nu sunt permise imbricri precum
n limbajul Pascal (funcie local unei alte funcii!- NU).
z Pentru a limita vizibilitatea numai la modulul n care
sunt definite, se pune cuvntul cheie static (clasa
static extern !!!).
z De obicei la nceputul fiierului se pune prototipul
funciei:
Tip_rezultat id_functie(tip1, tip2, , tipn);

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 3
Declaratii/Definitii
z O declaraie C specific atributele unui identificator sau mulime de identificatori.
z Regulile sintactice ce stau la baza scrierii declaraiilor sunt redate prin:
<declaraie> ::= <specificator declaraie> [<list declaratori de iniializare>];
<specificator declaraie> ::=
<clasa de memorare> [<specificator declaraie>] |
<specificator tip> [<specificator declaraie>] |
<calificator tip> [<specificator declaraie>]
<list declaratori de iniializate> ::= <declarator iniializare> |
<list declaratori iniializare>, <declarator iniializare>
<declarator iniializare> ::= <declarator> | <declarator> = <iniializare>
z A face o declaraie nu presupune i alocarea memoriei pentru indentificatorul declarat.
Exist situaii cnd alocarea se realizeaz n alt unitate de translatare (cazul datelor
externe).
z Tipuri de variabile: locale, globale. Variabile locale (se declar la nceputul funciilor, n
blocul funciei sau blocuri ale instruciunilor! ) Variabile globale (se declar n exteriorul
tuturor funciilor)
z Se precizeaz: clasa de alocare, tipul, numele i o eventual iniializare.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 4
Atributele datelor
z Declaraia unui identificator asociaz numelui n mod explicit sau implicit
o serie de atribute din mulimea urmtoare:
Clasa de memorare - localizeaz zona de memorie n care este plasat
elementul declarat (zona de date, un registru al procesorului, stiva
mediului de programare, zona de alocare dinamic) i delimiteaz durata
alocrii (ntreg timpul de executare a programului, executarea unei funcii
sau a unui bloc etc.)
Domeniul numelui - reprezint poriunea din program n care poate fi
utilizat identificatorul pentru accesarea informaiei asociate i este
determinat de poziia declaraiei.
Durata de stocare - reprezint perioada ct elementul asociat exist efectiv
n memorie.
Legtura - indic modul de asociere a unui identificator cu un anumit obiect
sau funcie, n procesul de editare a legturilor (rezolvare a referinelor
externe).
Tipul datei (standard sau definit de utilizator) - descrie informaia coninut
de elementul definit de identificator.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 5
Clasa de alocare/memorare
z determin unde se va rezerva spatiu pentru variabil
z determin durata de viat, vizibilitatea si modalitatea de
initializare.
z clase de alocare: auto(matic), register, static (intern) si
static extern
z Variabilele din clasa automatic sunt definite n interiorul
funciilor, fiind locale functiei n care au fost definite (nu
pot fi accesate din alte functii).
z Durata de viat a variabilelor din clasa automatic este durata
de executare a functiei respective, aceste variabile
<disprnd> la ncheierea executrii functiei.
z !!! Variabilelor auto li se aloc spatiu folosind stiva
programului, la intrarea n functie, iar la iesirea din functie
stiva este descrcat.
G. Albeanu, Programare procedurala -
Versiunea 2009-2010 C4 6
Clasa auto
z Clasa auto este implicit: dac nu este specificat nici o
clas de alocare, declaraiile din interiorul unei funcii
creeaz variabile n clasa automatic, deci n mod implicit,
toate variabilele sunt memorate n memoria volatil
gestionat ca o stiv.
z Parametrii funciilor sunt transmii, de asemenea, prin
stiv (de la dreapta la stnga! A se urmri lecia
despre MMIX).
z Clasa automatic se poate specifica prin cuvntul cheie
auto.
z Exemplu: int f(int *x, int *y){ auto int t; t=*x; *x=*y; *y=t;}

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 7
Clasa register
z Variabilele definite n interiorul unei funcii, cu clasa de alocare
register sunt asemntoare celor din clasa auto, cu excepia
faptului c, dac e posibil!, ele vor fi memorate n registrele UC
(procesorului) i nu n memoria volatil (RAM Random Access
Memory).
z * Nu exist adres de memorie asociat.
z Numai un numr limitat de variabile pot fi inute n registre. Cnd
nu mai sunt registre disponibile, compilatorul le trece n clasa
auto, dar cu pstrarea restriciei *
z Variabilele parametri formali pot fi declarate n clasa register, de
exemplu: void f(register int x); aceasta neafectnd modul lor de
transmitere ctre funcie (se face tot prin stiv), ci numai faptul ca
vor fi inute n registrele mainii pe durata executrii funciei.
z Variabilele din clasele auto i register nu i pstreaz valoarea
de la un apel la altul al funciei n care sunt definite. Dac sunt
iniializate, iniializarea are loc la fiecare nou intrare n funcie.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 8
Clasa static intern
z Variabilele din clasa static intern sunt memorate n
locaii fixe de memorie (au permanent asociat
aceeai adres).
z Durata de via a datelor statice - pe parcursul
executrii ntregului program.
z O variabil n clasa static, definit n interiorul unei
funcii (este n clasa static intern), este specificat prin
cuvntul cheie static. Dac static nu apare, se
consider clasa auto.
z O variabil din clasa static intern (obligatoriu trebuie
initializata) se iniializeaz numai la primul apel (prin
codul generat!)

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 9
Cuvntul cheie extern
z Pentru a accesa o variabil definit la nivel
exterior n alt modul (fiier) dect cel curent,
se declar variabila explicit folosind cuvntul
cheie extern.
z Pentru a accesa funcii definite n alt modul
(de exemplu funcii de bibliotec !) este
suficient prezena prototipului n modulul n
care este folosit funcia, dar se poate declara
i explicit folosind cuvintul cheie extern.
z O variabil (chiar i o funcie) poate fi
declarat n mai multe module (cu extern), dar
trebuie definit ntr-un singur modul.
G. Albeanu, Programare procedurala -
Versiunea 2009-2010 C4 10
Aplicatii multi-fisier in C/C++

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 11
Concluzii domenii de vizibilitate
z n C declaraia unei variabile trebuie s precead orice referire a ei. Ea poate
aprea n exteriorul oricrei funcii, n lista de parametri formali a unei funcii sau
la nceputul unui bloc. Domeniul numelui este regiunea dintr-un program C n
care identificatorul este vizibil. Poziia declaraiei determin urmtoarele
domenii:
Domeniul bloc - caracterizeaz identificatorii locali (identificatorii declarai n
interiorul unui bloc au domeniul cuprins ntre declaraie i sfritul blocului;
parametrii formali din definiia unei funcii au ca domeniu blocul funciei).
Domeniul fiier - caracterizeaz identificatorii declarai n exteriorul oricrei
funcii - numii identificatori globali - i care au domeniul cuprins ntre
declaraie i sfritul fiierului.
Domeniul funcie - aplicabil pentru etichetele instruciunilor i este blocul
funciei.
Domeniul prototip - definit pentru identificatorii specificai n lista de parametrii
din prototipul unei funcii - i care au domeniul limitat la acel prototip.
z Partea din domeniu n care informaia asociat este accesibil se numete zon
de vizibilitate. O declaraie a unui identificator este vizibil n tot domeniul su mai
puin blocurile sau funciile n care identificatorul este redeclarat. Pentru
identificatorii globali se poate repeta declaraia, dar iniializarea trebuie s se fac
o singur dat.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 12
Concluzii durata de stocare
Din punct de vedere al duratei de stocare, sunt posibile trei situaii:

z Durat static: Obiectele cu durat static au alocat zona de memorie


pe toat durata de executare a programului. Toate variabilele globale au
durat static. Alte variabile pot avea aceast calitate prin utilizarea
specificatorilor static sau extern.

z Durat local: Obiectele cu durat local sunt cele automatice - spaiul


de memorare se aloc (n stiv sau n registru) la intrarea n executare a
blocului sau funciei i este eliberat la ieirea din bloc sau din funcie. n
concluzie, orice obiect automatic dispare la ncheierea duratei sale de
via, deci informaia coninut de acesta se pierde.

z Durat dinamic: Pentru obiectele cu durat dinamic, zona de


memorie este alocat i eliberat la iniiativa programatorului prin
apelarea unor funcii C (de exemplu: malloc, free).

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 13
Tipuri de date structurate
struct - este cuvnt cheie pentru
construirea unui tip nregistrare;
<id_tip> - este un identificator ce
desemneaz numele tipului structuri care
este declarat;
<tip_cmp_i> - tipul cmpului i;
<id_cmp_i> - identificatorul cmpului i
(cmpurile se mai numesc i membrii);
<list identificatori de tip struct> - lista
identificatorilor declarai.
Dac numele tipului <id_tip> lipsete, structura se numete anonim. Dac lista identificatorilor
declarai lipsete, s-a definit doar tipul structur. Cel puin una dintre aceste specificaii trebuie s
existe.
Dac <id_tip> este prezent, ulterior, se pot declara noi variabile de tip structur prin intermediul
declaraiei: struct <id_tip> <lista noilor identificatori>;
Referirea unui membru al unei variabile de tip structur se face folosind operatorul de selecie (.)
ntr-o expresie care precizeaz identificatorul variabilei i al cmpului.
G. Albeanu, Programare procedurala -
Versiunea 2009-2010 C4 14
struct exemple (1)
#include <stdio.h>
struct student { struct tnode { /* the tree node: */
int id; char *word; /* points to the text */
char *nume; int count; /* number of occurrences */
float p; struct tnode *left; /* left child */
} s1, s2, s3; struct tnode *right; /* right child */
int main(void) { };
struct student st;
s1.id=1;
s2.nume = Ada";
s3.p = 90.5;
printf(" Nr matricol: %d \n", s1.id);
printf(" Numele: %s \n", s2.nume);
printf(" Media: %f \n", s3.p);
return 0;
}
G. Albeanu, Programare procedurala -
Versiunea 2009-2010 C4 15
struct exemple (2)

struct tm{
int tm_sec; /* Seconds: 0-59 (K&R says 0-61?) */
int tm_min; /* Minutes: 0-59 */
int tm_hour; /* Hours since midnight: 0-23 */
int tm_mday; /* Day of the month: 1-31 */
int tm_mon; /* Months *since* january: 0-11 */
int tm_year; /* Years since 1900 */
int tm_wday; /* Days since Sunday (0-6) */
int tm_yday; /* Days since Jan. 1: 0-365 */
int tm_isdst; /* +1 Daylight Savings Time, 0 No DST,
* -1 don't know */
};

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 16
Cmpuri de bii (1)
z Structurarea datelor la nivel de bit este posibil, n limbajul C, prin
definirea de cmpuri de bii. Aceast facilitate este util pentru
scrierea aplicaiilor de control al dispozitivelor fizice (driver-e)
comunicare cu sisteme industriale, .a. Cmpurile de bii se pot
declara ca membrii ai unei structuri astfel:
struct <id_tip> {
<tip_camp_1> <id_camp_1>:lungime_1;
<tip_camp_2> <id_camp_2>:lungime_2;
...
<tip_camp_i> <id_camp_i>:lungime_i;
...
<tip_camp_n> <id_camp_n>:lungime_n;
} <lista identificatori de tip struct>;

z Totui, pentru cmpurile de biti, <tip_camp_i> poate fi doar int,


signed sau unsigned, lungime_i este o constant ntreag cu
valoarea n domeniul 0-15 (!).

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 17
Cmpuri de bii (2)
z In exemplul:
struct s_bit {
unsigned a:1;
unsigned b:3;
unsigned :4;
unsigned c:3;
unsigned d:2;
} s;
pentru variabila s se vor aloca 16 bii
(numerotai 0-15), ce pot fi accesai prin: s.a
(bitul 0); s.b (biii 1-3); s.c (biii 8-10); s.d (biii
11,12). Observm c biii 4-7 nu pot fi
accesai, pentru ei nu s-a specificat nici un
identificator de cmp. Alocarea cmpurilor
poate ridica probleme de portabilitate,
deoarece organizarea memoriei depinde de
sistemul de calcul (BIG endian, LITTLE
endian).

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 18
Cmpuri de bii exemple (2)
typedef unsigned int boolean_t;
#define FALSE 0
struct { #define TRUE !FALSE
unsigned f1 : 4; typedef union {
unsigned : 3; struct {
signed f2 : 1; boolean_t user:1;
unsigned : 0; /* aliniere */ boolean_t zero:1;
unsigned f3 : 6; boolean_t force:1;
}sb; int :28; /* unused */
boolean_t compat:1; /* bit 31 */
};
int raw;
} flags_t;

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 19
Uniuni union (1)
z Uniunile sunt entiti care pot conine (la momente de timp diferite) obiecte de
tipuri diferite. Practic, mai multe variabile sunt suprapuse n acelai spaiu de
memorie. Sintaxa declaraiei este similar cu cea a structurii, dar identificatorii
declarai ca membrii reprezint numele cu care sunt referite diferitele tipuri de
variabile ce ocup aceeai zon de memorie:
<declaraie uniune> ::=
union <id_tip> { EQUIVALENCE
<tip_var_1> <id_var_1>;
<tip_var_2> <id_var_2>; (FORTRAN)
...
<tip_var_i> <id_var_i>; REDEFINES
... (COBOL)
<tip_var_n> <id_var_n>;
} <lista identificatori de tip union>;
z Spaiul alocat n memorie corespunde tipului cu dimensiune maxim.
Tipurile uniune sunt utile pentru conversii de date, n implementarea programelor
de comunicaie etc.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 20
Uniuni (2)
http://www.cs.utt.ro/~gabia/ /*

TP/2008/L02- C: The Complete Reference, 4th Ed. (Paperback)


by Herbert Schildt

UniBiti.htm ISBN: 0072121246


Publisher: McGraw-Hill Osborne Media; 4 edition (April 26, 2000)
*/
typedef struct { #include <stdio.h>
char tip; #include <stdlib.h>
union pw {short int i; char ch[2];};
union cap{ int putw(short int num, FILE *fp);
int nr_locuri; int main(void){
FILE *fp; fp = fopen("test.tmp", "wb+");
float tonaj; if(fp == NULL) {printf("Cannot open file.\n"); exit(1);}
} capacitate; putw(1025, fp); /* write the value 1025 */
fclose(fp); return 0;
int km_p; }
char diesel; int putw(short int num, FILE *fp){
float consum; union pw word; word.i = num;
putc(word.ch[0], fp); /* write first half */
}autoturism; return putc(word.ch[1], fp); /* write second half */
}

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 21
Enumerarea constantelor
z Tipul enumerare const dintr-un ansamblu de constante ntregi (cel puin una),
fiecare fiind asociat cte unui identificator. Constanta unui element al enumerrii
este fie asociat implicit, fie explicit. Implicit, primul element are asociat valoarea
0, iar pentru restul este valoarea_precedent+1.
z In limbajul C, valorile asociate identificatorilor pot fi sub controlul total al
programatorului, precum in exemplul:
enum {v1 = -100, v2 = 5, v3 = 7, v4 = -10 };
z permitnd astfel o nou metoda de definire a constantelor. Unii identificatori pot fi
initializai de ctre programator urmnd ca ceilali s primeasc valori n urma
compilrii.

z In descrierea
enum {a, b = 6, c, d };
vom avea a = 0, b = 6, c = 7, d = 8.
z Componentele de tip enumerare nu pot fi citite de la un mediu de intrare i nici
afiate deoarece este reinut numai poziia lor n enumerare. Un identificator
prezent intr-o lista nu poate fi prezent i ntr-o alt list.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 22
Enum
[http://www.c.happycodings.com/code_snippets/code30.html]
#include <stdio.h>
int main(){
enum Days{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};
Days TheDay;
int j = 0;
printf("Please enter the day of the week (0 to 6)\n");
scanf("%d",&j);
TheDay = Days(j);
if(TheDay == Sunday || TheDay == Saturday)
printf("Hurray it is the weekend\n");
else
printf("Curses still at work\n");
return 0;
}

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 23
Specificatorul typedef
z Specificatorul typedef indic faptul c nu se
declar o variabil sau o funcie de un anumit
tip, ci se asociaz un nume (sinonimul) tipului
de date.
z Sintaxa este:
typedef <definiie tip> <identificator>;
z Exemple:
typedef unsigned int natural;
typedef long double tablou [100] ;
tablou a, b, c;
natural m,n,i;
G. Albeanu, Programare procedurala -
Versiunea 2009-2010 C4 24
Preprocesare (directive, exemple)

z software
multiplatforma,
z software multi-
interface

http://www.cs.bilkent.edu.tr/~kdincer/teaching/spring2000/metu-ceng332/lectures/pdf-files/ceng332-chp4.pdf

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 25
Definirea entitilor expandabile

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 26
#define exemple (1)

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 27
#define exemple (2)

/* Flags for the iobuf structure */


#define _IOREAD 1 /* currently reading */
#define _IOWRT 2 /* currently writing */
#define _IORW 0x0080 /* opened as "r+w" */
#ifndef _FILE_DEFINED
#define _FILE_DEFINED
typedef struct _iobuf{
char* _ptr;
int _cnt;
#ifndef SEEK_SET char* _base;
#define SEEK_SET (0) int _flag;
#endif int _file;
int _charbuf;
int _bufsiz;
#ifndef SEEK_CUR char* _tmpfname;
#define SEEK_CUR (1) } FILE;
#endif /* Not _FILE_DEFINED */
#endif

#ifndef SEEK_END
#define SEEK_END (2)
#endif
G. Albeanu, Programare procedurala -
Versiunea 2009-2010 C4 28
#include

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 29
Fisier .h utilizator

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 30
Compilare condiionat - sintaxa

z Permite crearea
de programe
multi-platform
sau multi-client
z Permite
delimitarea
poriunilor de
cod care se vor
compila cnd
anumite condiii
sunt ndeplinite
z Notaie: Prin
newline indicm
trecerea la
rndul urmtor,
la nceput.

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 31
Compilare conditionata exemple

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 32
Alte directive

#include <stdio.h>
#define LINE200 200

int main(void){
func_1(); func_2();
}

#line 100
func_1(){
printf("Func_1 - the current line
number is %d\n",_ _LINE_ _);
}

#line LINE200
func_2(){
printf("Func_2 - the current line
number is %d\n",_ _LINE_ _);
}

G. Albeanu, Programare procedurala -


Versiunea 2009-2010 C4 33

S-ar putea să vă placă și