|
#error -este comanda pentru generarea unor mesaje de eroare
|
səhifə | 11/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| #error -este comanda pentru generarea unor mesaje de eroare
Se utilizeaza pentru a detecta si semnala erorile survenite in etapa de
preprocesare.Sintaxa este: #error token-string(element-sir)
EXEMPLU: #if !defined(__cplusplus) //verifica o definitie
#error C++ compiler required //mesajul de eroare returnat
#endif
La intalnirea unui mesaj de eroare,procesul de compilare este incheiat.
#if,#elif,#else si #endif -controleaza compilarea expresiilor respec-
tive din fila sursa.Se utilizeaza pentru a selecta conditional,una sau
mai multe dintre expresiile controlate,in functie de un anumit parametru.
De exemplu,la un joc de platforma,incarca in memorie un anumit nivel al
jocului.Daca expresia ce urmeaza dupa #if este evaluata a fi diferita de
zero,atunci datele respective vor putea fi compilate,iar in caz contrar
vor fi excluse din procesul de compilare(eliminate din program).
Fiecare comanda inceputa cu #if trebuie sa se termine cu #endif.Pentru a
include mai multe conditii,se pot utiliza mai multe comenzi #elif,intre
#if si #endif sau o singura comanda #else.
Sintaxa generala este: #if constant-expression(constanta sau expresia)
#elif (constanta sau expresia)
... //oricate alte #elif
#else
#endif
EXEMPLU: #if DLEVEL==0 //prima conditie
#define STACK 0
#elif DLEVEL==1 //alta conditie optionala
#define STACK 100
#elif DLEVEL==2 //alta conditie optionala
#define STACK 200
#else //alternativa
#define STACK 300
#endif //iesirea din comanda
Fiecare comanda conditionala #if trebuie sa fie terminata prin #endif,in
caz contrar se va returna un mesaj de eroare(atentie mai ales atunci cand
utilizati un numar mare de comenzi si bucle intricate una in alta).
#ifdef si ifndef se utilizeaza la fel ca si #if,atunci cand identi-
ficatorul este predefinit si are semnificatia #if 1 daca identificatorul
a fost definit(cu #define) sau #if 0 daca identificatorul nu este definit
fost utilizat cu #undef.Comanda este aplicabila numai pentru identifica-
torii definiti cu #define,nu si pentru cei declarati in codul sursa C/C++.
Se utilizeaza pentru a identifica prezenta sau absenta identificatorilor
respectivi,declarati cu #define.
-71-
Comanda #ifndef actioneaza exact invers respectiv returmeaza 1 daca inden-
tificatorul nu a fost definit sau 0 daca a fost definit.
EXEMPLU: #ifdef test //verifica prezenta identificatorului test
#define rutina
#endif
#import(doar in C++)-se utilizeaza pentru a incorpora informatii din o
biblioteca tipizata.Continutul bibliotecii va fi convertit in clase C++
(obiecte C++).Sintaxa generala este:
#import [attributes]
este numele filei care contine informatiile si poate fi o
biblioteca tipizata(o fila .TLB sau .ODL),o fila executabila(.EXE),o bi-
blioteca de file legate dinamic(.DLL) sau de file de resurse(.OCX) sau un
document sau fisier continut intr-o biblioteca cu conditia sa fie in
format interpretabil de catre LoadTypeLib API.
Optional se poate include si directorul in care se gaseste biblioteca(ca-
lea de acces),dar trebuie sa contina numele unei file exis-
tente in biblioteca respectiva.
Daca numele filei este inclus intre paranteze ascutite() atunci
preprocesorul va cauta fila in directorul curent sau in cel specificat,
iar daca numele filei va fi inclus intre ghilimele("numele"),atunci pre-
procesorul va cauta initial in fila sursa,apoi in filele specificate prin
#include si abea apoi in directorul curent sau in cel specificat.
Atributele modifica biblioteca de date auxiliare adaugand sau eliminand
selectiv unele date.Argumentele accepate sunt:exclude,high method prefix,
high property prefix,implementation only,include(...),inject statement,
named guids,no auto exclude,no implementation,no namespace,raw disprinter-
faces,raw interfaces only,raw method prefix,raw native types,raw property
prefixes,rename,rename namespace.
EXEMPLU: #import "c:\path\type lib0.tlb"
#include-comanda procesorului sa trateze continutul filei respective
ca si cand ar fi fost incorporat in fila sursa a programului.Cu ajutorul
acestei comenzi,puteti grupa constante si functii in file separate pe
care le puteti utiliza ulterior in orice program(cu #include numele filei)
Sintaxa este: #include "calea-numele filei" sau #include
Calea de acces la fisier,respectiv numele directorului in care este cont-
tinuta fila este optionala.Daca se specifica intre ghilimele,procesorul va
cauta initial in directorul curent si apoi in calea de acces specificata,
iar daca se specifica intre paranteze ascutite(<>),procesorul va cauta
initial in calea specificata si apoi in calea inclusa in variabila INCLUDE
EXEMPLU: #include
Comenzile de tip #include pot fi intricate pana la maximum 10 nivele.
#line -este comanda prin care se schimba in registrul procesorului
numarul de linie si numele filei de la adresa respectiva,prin numarul de
linie si numele filei specificate in comanda.
EXEMPLU: #line 151 "copy.c" //"copy.c" va fi arhivat pe linia 151
#undef -este comanda prin care se sterge un identificator definit cu
#define(numele respectiv va fi nedefinit).Se poate aplica si pentru un
identificator ce nu a fost definit(pentru a va asigura ca este nedefinit).
EXEMPLU: #define WIDTH 80
#undef WIDTH
-72-
#pragma -sunt comenzi specifice pentru fiecare tip de procesor sau
de sistem de operare,prin care se precizeaza modul de control asupra arii-
lor de memorie si modul in care functiile primesc parametrii.Sunt diferite
de la un calculator la altul si de la un compilator la altul,dar toate
sunt astfel concepute incat sa fie compatibile cu C si cu C++.
# -este directiva nula (un semn # singular).Nu are nici un efect.
Gramatica preprocesorului este urmatoarea:
Conventiile de preprocesor privitoare la atributele fonturilor sunt urma-
toarele:
ATRIBUT DESCRIERE
nonterminal Indica tipul italic nonterminal
#include Tipul bold terminal se utilizeaza pentru cuvinte
cheie si trebuie respectat ca atare
opt Caractere neterminale intotdeauna optionale
default typeface Caracterele din setul descris ca typeface pot fi
utilizate ca terminale in expresii
: dupa caractere neterminale specifica inceputul
unei definitii.Definitiile alternative se trec
sub forma de lista pe linii diferite
Terminalele(caracterele terminale) sunt caracterele cu care se termina
sintaxa unei definitii.Caracterele neterminale sunt cele din interiorul
unei expresii(constante,identificator,cuvant cheie,operator,punctuator).
Preprocesorul recunoaste si expandeaza si o serie de macrodefinitii.
Macro-urile curente sunt:
__DATE__ -contine data curenta (Mmm dd yyyy)
__FILE__ -contine numele filei curente
__LINE__ -contine numarul liniei din fila sursa(un numar intreg zecimal)
__STDC__ -contine standardul ANSI C
__TIME__ -contine timpul inregistrat la ultima compilare (hh:mm:ss)
__TIMESTAMP__ -contine date si ora ultimei modificari a filei sursa
Compliatoarele Microsoft recunosc si urmatoarele macrouri:
_CHAR_UNSIGNED(default char is unsigned),__cplusplus(definitie C++ ),
_CPPRTTI(runtime type information),_CPPUNWIND(enable exception handling),
_DLL(multithread DLL),_M_ALPHA(1 doar pt.compilatorul ALPHA),_M_IX86(tipul
de procesor),_M_MPPC(tipul de procesor Macintosh),_M_MRX000(tipul MIPS),
_M_PPC(tipul PowerPC),_MFC_VER(versiunea MFC),_MSC_EXTENSIONS(este 1),
_MSC_VER(versiunea VisualC++),_MT(multithread DLL),_WIN32(aplicatii WIN32)
Cu ajutorul comenzilor de preprocesor,limbajul C isi extinde si mai
mult gama de optiuni,prin includerea functiilor din biblioteca standard
(peste 500) si a eventualelor functii definite de catre utilizator si
salvate in biblioteca.Puteti sa va formati o biblioteca proprie din
functiile preferate editate de d-voastra.In plus,versiunile C++ adauga si
biblioteca MFC pentru clasele de obiecte predefinite si bibliotecile de
tip Template,pentru obiectele predefinite parametrizate.
Toate aceste facilitati,permit o deosebita suplete in formularea
expresiilor si a functiilor,dar in acelasi timp se preteaza la nenumarate
erori de editare sau de conceptie a expresiilor.Este bine sa incepeti cu
expresii cat mai simple(ca si cele care urmeaza pentru exemplificarea
functiilor standard),abea apoi sa incercati formualari savante,complexe.
-73-
BIBLIOTECA DE FUNCTII STANDARD (ANSI C)
Textul urmator si exemplele se refera la versiunea Turbo C 2.0 care
insoteste manualul,dar majoritatea versiunilor de programe si compilatoare
in limbaj C vor recunoaste aceleasi functii.Este bine sa verificati totusi
utilitarul Help al programului de care dispuneti.
Pentru instalarea programului (Turbo C 2.0) copiati pe unitatea C,
intr-un director denumit USR,toate filele si fisierele programului.Apoi
lansati programul cu dublu click pe Tc.exe.Tastati Esc pentru iesire din
fereastra de dialog,apoi selectati meniul programului cu tasta F10.Folo-
siti sagetile dreapta-stanga si respectiv tasta Enter,pentru a vedea
toate meniurile si submeniurile programului.Eventual modificati din
optiuni(doar daca stiti exact ce anume doriti sa faceti).
In versiunile mai recente,o parte dintre functii au fost abandonate,
sau inlocuite cu altele mai performante.In cazul incompatibilitatii cu
versiunile recente,inlocuiti functia cu cea corespunzatoare din versiunea
d-voastra(verificati indexul din Help).
Biblioteca de functii este subimpartita in mai multe file,denumite
file de antet.Atunci cand editati un program,selectati cu atentie doar
acele file care contin functiile necesare pentru executarea aplicatiei.
Nu are rost sa incarcati memoria cu file care nu vor fi executate nicio-
data.Filele de antet sunt denumite "header" si sunt notate cu extensia
.h (de la header).Pentru incarcarea lor in memorie se utilizeaza comanda
de preprocesor #include .
Filele antet din Turbo C 2.0 sunt:alloc.h,assert.h,bios.h,conio.h,
ctype.h,dir.h,dos.h,errno.h,fcntl.h,float.h,graphics.h,io.h,limits.h,
math.h,mem.h,process.h,setjmp.h,share.h,signal.h,stdarg.h,stddef.h,stdio,h
stdlib.h,string.h,sys\stat.h,sys\timeb.h,sys\types.h,time.h,values.h.
Filele (fisierele) antet contin declaratia functiilor si a tipurilor
de date asociate lor.Filele nu vor fi prezentate in ordine alfabetica si
este probabil ca exemplele vor contine functii din toate filele(dupa nece-
sitati).Pentru intelegerea lor,consultati manualul la functia respectiva.
Manualul prezent nu este de fapt decat o traducere sumara a ghidului
de referinte anexat programului(utilitarul Help),la care se adauga un
numar de exemple simpliste,cat mai intuitive si comentariile autorului.
Deoarece toate exemplele prezentate vor necesita si functii de intrare
iesire,prima fila antet va fi stdio.h(standard input-output),care contine
functiile de baza pentru comunicarea om-masina.
BIBLIOTECA C -FILA ANTET stdio.h
Contine urmatoarele functii:clearerr,fclose,fcloseall,fdopen,feof,
ferror,fflush,fgetc,fgetchar,fgetpos,fgets,fileno,flushall,fopen,fprint,
fputc,fputchar,fputs,fread,freopen,fscanf,fseek,fsetpos,ftell,fwrite,getc,
getchar,gets,getw,perror,printf,putc,putchar,puts,putw,remowe,rename,
rewind,scanf,setbuf,setvbuf,sprintf,sscanf,_strerror,strerror.
Asadar fisierul contine 45 de functii destinate special pentru comuni-
carea utilizatorului cu calculatorul(introducerea de comenzi si mesaje de
la tastatura,afisarea pe ecran,imprimarea datelor,scrierea si preluarea
datelor din fisiere etc.).Aceste functii sunt indispensabile pentru apli-
catii(cu exceptia celor in care calculatorul lucreaza independent de om).
-74- [ stdio.h-printf() ]
FUNCTIA printf()
Este functia care permite afisarea datelor pe ecran,sau imprimarea lor.
Functia timite datele formatate spre stdout(standard output device),adica
spre dispozitivul curent de afisare a datelor.
SINTAXA GENERALA este: int printf(const char *format,...);
Prin format se poate preciza tipul de format dupa cum urmeaza:
d signed decimal int
i signed decimal int
o unsigned octal int
u unsigned decimal int
x unsigned hexadecimal int
X unsigned hexadecimal int
X hexadecimal long (pentru functia scanf)
f floating point [-]dddd.ddd
e floating point [-]d.ddd e[+/-]ddd
g floating point(tip e sau f in functie de precizie)
E la fel ca si e dar exponentul se noteaza cu E in loc de e
G la fel ca si g dar exponentul se noteaza cu E
c single character
% caracterul %
p pointer: near-YYYY;far-XXXX:YYYY
n numarul de caractere salvat la locatia din pointer
none aliniaza la dreapta
- aliniaza la stanga
blank afiseaza semnul pentru valorile negative
# conversteste la valorile alternative:
c,s,d,i,u nici un efect
o 0 asumat pentru argumentele nonzero
x sau X 0x sau 0X pentru argumente
e,E,f utilizeaza punctul decimal
g sau G ca mai sus dar fara zerouri
[width]
n cel putin n caractere
0n cel putin n caractere,cu 0 la stanga
* urmatorul argument din lista este width
[.prec]
none precizia implicita
.0 d,i,o,u,x precizia implicita
e,E,f fara punct decimal
.n la majoritatea dintre n caractere
* urmatorul argument din lista este precizia
[modificatori]
F argumentul este un pointer far (adresa indepartata)
N argumentul este un pointer near (adresa apropiata)
h d,i,o,u,x,X argumentul este short int
l d,i,o,u,x,X argumentul este long int
l e,E,f,g,G argumentul este double (pentru functia scanf)
L e,E,f,g,G argumentul este long double
Cele trei puncte specifica faptul ca functia poate avea un numar variabil
de argumente.Dupa executie,functia returneaza numarul de caractere afisate
iar in caz de eroare returneaza EOF(end of file).
-75- [stdio.h-printf]
Functii cu actiune asemanatoare sunt:ecvt,fprintf,putc,puts,scanf si
vprint.
Pentru exemplificarea functiei editati urmatorul exemplu:
#include
volatile int x;
volatile int y;
int main()
{
do {
printf("Love...don't come easy...");
for (y=0;y<90;y++)
printf(" ");
x++;
} while (x<500);
}
Pentru editarea unei aplicatii,lansati programul cu Tc.exe,selectati
meniul cu F10,alegeti File,tastati Enter,alegeti New si tastati Enter.
Dupa redactarea aplicatiei(ca mai sus),tastati F10 pentru a selecta me-
niul,alegeti Compile,selectati Compile to OBJ si apoi Enter.In cazul in
care exista cumva greseli de editare,corectati greselile pana cand com-
pilatorul returneaza mesajul: Succes-Press any key
Dupa compilarea programului,tastati din nou F10,selectati Run,alegeti
Run si apoi Enter pentru a executa programul.
Daca doriti sa salvati aplicatia,tastati F10,alegeti Save si apoi
introduceti numele dorit(si calea de acces) in fereastra de dialog+Enter.
In continuare puteti utiliza aplicatia,ori de cate ori doriti dupa
ce selectati din meniu File,alegeti Load,apoi in fereastra de dialog va
apare "Load File Name *.C",tastati Enter,apoi alegeti fila dorita din
fereastra de dialog si tastati Enter.
In exemplul de mai sus,textul continut in functia fprint este prelu-
crat de doua instructiuni conditionale.Pentru exercitiu si pentru a obser-
va diferite variante ale celor doua instructiuni,modificati valorile
pentru x si y in cele doua conditii (y<90 si x<500),de exemplu y<20 si
x<900.Experimentati mai multe metode de afisare a unui mesaj simplu.
Daca nu se specifica altfel,functia printf afiseaza toate datele,una
dupa alta,fara spatii libere.Pentru a scrie un text cu paragrafe,sau
pentru tabele sau orice alt fel de format se pot utiliza secventele de
scapare,care permit trecerea la un rand nou,spatii de tabulare,semne de
citat,scrierea de caractere ASCII etc.
In exemplul urmator,functia printf este utilizata pentru redactarea
unui tabel,utilizand secventele de scapare(prezentate anterior pg.48).
Pentru a stopa executia programului timp de 10 secunde,am adaugat in
program si functia sleep() din fila de antet dos.h,iar pentru a sterge
ecranul de eventualele caractere reziduale am adaugat si functia clrscr()
din fila de antet conio.h.In interiorul tabelului am introdus cateva
caractere specificate ca ASCII,pentru a exemplifica modul de selectare
a lor,atunci cand aveti nevoie de caractere speciale ($,%,@ etc.)
Dupa modelul prezentat,incercati sa realizati un tabel in care sa
afisati cateva date utile (nume,adrese,numere de telefon etc.).Nu va
descurajati la aparitia mesajelor de eroare.Corectati pana cand progra-
mul este editat corect.Compilati si apoi rulati programul.
-76- [stdio.h-printf]
EXEMPLU:
/* Exercitiu de editare tip text */
#include
#include
#include
void sleep();
void clrscr();
void main()
{
clrscr();
printf(" \n");
printf("\nTABEL DEMONSTRATIV\n");
printf(" \n");
printf("(text afisat pe linia urmatoare)\n");
printf("Titlul1\tTitul2\tTitlul3\tTitlul4\n");
printf("===============================================\n");
printf("\nCaractere ASCII:\n");
printf("\122\t\155\t\200\t\210\t\n");
printf("\164\t\180\t\150\t\144\t\n");
printf("\166\t\180\t\153\t\144\t\n");
printf("\77\t\81\t\95\t\101\t\n");
printf(" ");
sleep(10);
}
Pentru a modifica durata (in secunde) de afisare a datelor,puteti schimba
cifra din functia sleep().
Incercati sa redactati cateva texte,de exemplu poezia preferata,eti-
chete de produse sau reclame,anunturi,mesaje etc.
Nu uitati sa declarati functia main() care poate fi de tip void si nu
uitati sa declarati variabilele in afara functiei main().Nu uitati sa
adaugati punct si virgula dupa fiecare expresie.Incepeti cu un singur
rand si apoi adaugati restul textului.Daca nu utilizati o functie de
intarziere de tipul functiei sleep(),programul se va derula atat de repede
incat nu poate fi sesizat.Salvati toate aplicatiile redactate corect.Nu se
stie cand va vor fi utile.Nu salvati aplicatiile aberante sau defective.
In cazul in care filele antet nu pot fi accesate( mesaj de eroare),
verificati in meniul,la Options,optiunea Linker,daca accesul la biblioteci
este setat On(in caz contrar modificati setarea tastatand ENTER).
Pentru definirea si intelegerea functiilor de intrare-iesire,sunt
necesare notiunile de "stream"(flux-curent-impulsuri) si cea de memorie de
operare si respectiv de memorie suport.Memoria suport este cea in care se
20>90>
Dostları ilə paylaş: |
|
|