Document, comentariu, eseu, bacalaureat, liceu si facultate
Top documenteAdmitereTesteUtileContact
      
    


 


Ultimele referate adaugate

Adauga referat - poti sa ne ajuti cu un referat?

Politica de confidentialitate



Ultimele referate descarcare de pe site
  CREDITUL IPOTECAR PENTRU INVESTITII IMOBILIARE (economie)
  Comertul cu amanuntul (economie)
  IDENTIFICAREA CRIMINALISTICA (drept)
  Mecanismul motor, Biela, organe mobile proiect (diverse)
  O scrisoare pierduta (romana)
  O scrisoare pierduta (romana)
  Ion DRUTA (romana)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  COMPORTAMENT PROSOCIAL-COMPORTAMENT ANTISOCIAL (psihologie)
  Starea civila (geografie)
 

Ultimele referate cautate in site
   domnisoara hus
   legume
    istoria unui galban
   metanol
   recapitulare
   profitul
   caract
   comentariu liric
   radiolocatia
   praslea cel voinic si merele da aur
 
despre:
 
Liniile de control ale compilatorului limbajului de programare C
Colt dreapta
Vizite: ? Nota: ? Ce reprezinta? Intrebari si raspunsuri
 

Limbajul C ofera o facilitate de extensie a limbajului cu ajutorul unui preprocesor de macro-operatii simple. Folosirea liniilor de forma: v5y9yc
#define
#include este cea mai uzuala metoda pentru extensia limbajului, caracterul ’#’ (diez) indicind faptul ca aceste linii vor fi tratate de catre preprocesor. Liniile precedate de caracterul ’#’ au o sintaxa independenta de restul limbajului si pot aparea oriunde in fisierul sursa, avind efect de la punctul de definitie pina la sfirsitul fisierului.

8.l. Inlocuirea simbolurilor; substitutii macro

O definitie de forma:
#define identificator sir-simboluri determina ca preprocesorul sa inlocuiasca toate aparitiile ulterioare ale identificatorului cu sir-simboluri dat (sir-simboluri nu se termina cu ’;’ deoarece in urma substitutiei identificatorului cu acest sir ar aparea prea multe caractere ’;’).
Sir-simboluri sau textul de inlocuire este arbitrar. In mod normal el este tot restul liniei ce urmeaza dupa identificator. O definitie insa poate fi continuata pe mai multe linii, introducind ca ultim caracter in linia de continuat caracterul ’\’ (backslash).
Un identificator care este subiectul unei linii #define poate fi redefinit ulterior in program printr-o alta linie #define. In acest caz, prima definitie are efect numai pina la definitia urmatoare. Substitutiile nu se realizeaza in cazul in care identificatorii sint incadrati intre ghilimele. De exemplu fie definitia:
#define ALFA 1
Oriunde va aparea in programul sursa identificatorul ALFA el va fi inlocuit cu constanta 1, cu exceptia unei situatii de forma: printf("ALFA");
in care se va tipari chiar textul ALFA si nu constanta 1, deoarece identificatorul este incadrat intre ghilimele.
Aceasta facilitate este deosebit de valoroasa pentru definirea constantelor simbolice ca in:
#define TABSIZE 100 int tabaTABSIZEi; deoarece intr-o eventuala modificare a dimensiunii tabelului tab se va modifica doar o singura linie in fisierul sursa. O linie de forma:
#define identif(identif-1,..., identif-n) sir-simboluri
in care nu exista spatiu intre primul identificator si caracterul ’(’ este o definitie pentru o macro-operatie cu argumente, in care textul de inlocuire (sir-simboluri) depinde de modul in care se apeleaza macro-ul respectiv. Ca un exemplu sa definim o macro-operatie numita max in felul urmator:
#define max(a,b) ((a)>(b) ? (a) : (b)) atunci linia dintr-un program sursa: x = max(p+q,r+s); va fi inlocuita cu: x = ((p+q)>(r+s) ? (p+q) : (r+s));
Aceasta macro-definitie furnizeaza o „functie maximum” care se expandeaza in cod, in loc sa se realizeze un apel de functie. Acest macro va servi pentru orice tip de date, nefiind nevoie de diferite tipuri de functii maximum pentru diferite tipuri de date, asa cum este necesar in cazul functiilor propriu-zise.
Daca se examineaza atent expandarea lui max se pot observa anumite probleme ce pot genera erori, si anume: expresiile fiind evaluate de doua ori, in cazul in care ele contin operatii ce genereaza efecte colaterale (apelurile de functii, operatorii de incrementare) se pot obtine rezultate total eronate.
De asemenea, trebuie avuta mare grija la folosirea parantezelor pentru a face sigura ordinea evaluarii dorite. De exemplu macro-operatia square(x) definita prin:
#define square(x) x*x care se apeleaza in programul sursa sub forma: z = square(z+1); va produce un rezultat, altul decit cel scontat, datorita prioritatii mai mari a operatorului * fata de cea a operatorului +.




8.2. Includerea fisierelor

O linie de forma:
#include "nume-fisier" realizeaza inlocuirea liniei respective cu intregul continut al fisierului nume-fisier. Fisierul denumit este cautat in primul rind in directorul fisierului sursa curent si apoi intr-o succesiune de locuri standard, cum ar fi biblioteca I/O standard asociata compilatorului. Alternativ, o linie de forma:
#include ?nume-fisier? cauta fisierul nume-fisier numai in biblioteca standard si nu in directorul fisierului sursa.
Deseori, o linie sau mai multe linii, de una sau ambele forme apar la inceputul fiecarui fisier sursa pentru a include definitii comune (prin declaratii #define si declaratii externe pentru variabilele globale).
Facilitatea de includere a unor fisiere intr-un text sursa este deosebit de utila pentru gruparea declaratiilor unui program mare. Ea va asigura faptul ca toate fisierele sursa vor primi aceleasi definitii si declaratii de variabile, in felul acesta eliminindu-se un tip particular de erori. Daca se modifica un fisier inclus printr-o linie #include, toate fisierele care depind de el trebuie recompilate.

8.3. Compilarea conditionata

O linie de control a compilatorului de forma:
#if expresie-constanta verifica daca expresia constanta este evaluata la o valoare diferita de zero.
O linie de control de forma:
#ifdef identificator verifica daca identificatorul a fost subiectul unei linii de control de forma #define.
O linie de control de forma:
#ifndef identificator verifica daca identificatorul este nedefinit in preprocesor.
Toate cele trei forme de linii de control precedente pot fi urmate de un numar arbitrar de linii care, eventual, pot sa contina o linie de control forma:
#else si apoi de o linie de control de forma:
#endif
Daca conditia supusa verificarii este adevarata, atunci orice linie intre #else si #endif este ignorata. Daca conditia este falsa atunci toate liniile intre testul de verificare si un #else sau in lipsa unui #else pina la #endif sint ignorate.
Toate aceste constructii pot fi imbricate.

8.4. Utilizarea dirctivelor de compilare

Prezentam in continuare un exemplu didactic de utilizare a directivelor de compilare in dezvoltarea unor proiecte.
Se citeste de la tastatura o pereche de numere naturale p si q. Sa se determine daca fiecare din cele doua numere este prim sau nu, si sa se calculeze cel mai mare divizor comun.
Sa rezolvam aceasta problema folosind doua fisiere sursa. Primul contine functia main si apeleaza doua functii: eprim si cmmdc. Al doilea fitier implementeaza cele doua functii.
Prezentam mai intii un fisier header (numere.h) care contine definitiile celor doua functii.

#ifndef _Numere_H
#define _Numere_H unsigned eprim(unsigned n); unsigned cmmdc(unsigned p, unsigned q);
#endif

Fisierul sursa princ.c este foarte scurt.

#include <stdio.h>
#include "numere.h" static void citire(unsigned *n) A scanf("%u",n); if (eprim(*n)) printf("%u e prim\n",*n); else printf("%u nu e prim\n",*n);
S int main() A unsigned p,q,k; citire(&p); citire(&q); k=cmmdc(p,q); printf("Cmmdc: %u\n",k); return 0;
S

Fisierul sursa numere.c este prezentat in continuare.

#include "numere.h" unsigned eprim(unsigned n) A unsigned i,a,r; if (n==0) return 0; if (n<4) return 1; if ((n&1)==0) return 0; for (i=3; ; i+=2) A r=n%i; if (r==0) return 0; a=n/i; if (a<=i) return 1;
S
S unsigned cmmdc(unsigned p, unsigned q) A
while ((p>0) && (q>0)) if (p>q) p%=q; else q%=p; if (p==0) return q; else return p;
S

Pentru a obtine un program executabil din aceste doua fisiere se poate utiliza o singura comanda de compilare:
Cc princ.c numere.c optiuni-de-compilare unde Cc este numele compilatorului folosit (exemplu: bcc, gcc). Optiunile de compilare (atunci cind sint necesare) sint specifice mediului de programare folosit.

Proiectele -; programe de dimensiuni mari -; sint compuse de cele mai multe ori din module care se elaboreaza si se pun la punct separat. Uneori pot fi identificate functii care prezinta un interes general mai mare, si care pot fi utilizate in elaborarea unor tipuri de aplicatii foarte diverse. Acestea sint dezvoltate separat si, dupa ce au fost puse la punct in totalitate, se depun intr-o biblioteca de functii in format obiect. In momentul in care acestea sint incluse in proiecte nu se mai pierde timp cu compilarea modulelor sursa. In schimb modulele care le apeleaza au nevoie de modul cum sint descrise aceste functii, si acesta se pastreaza in fisiere header.


Colt dreapta
Creeaza cont
Comentarii:

Nu ai gasit ce cautai? Crezi ca ceva ne lipseste? Lasa-ti comentariul si incercam sa te ajutam.
Esti satisfacut de calitarea acestui document, eseu, cometariu? Apreciem aprecierile voastre.

Nume (obligatoriu):

Email (obligatoriu, nu va fi publicat):

Site URL (optional):


Comentariile tale: (NO HTML)


Noteaza documentul:
In prezent fisierul este notat cu: ? (media unui numar de ? de note primite).

2345678910

 
Copyright© 2005 - 2024 | Trimite document | Harta site | Adauga in favorite
Colt dreapta