Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Erori uzuale <strong>în</strong> programe C<br />
Majoritatea erorilor de programare provin din faptul cã ceea ce executã calculatorul<br />
este diferit de intentiile programatorului. Erorile care se manifestã la executia<br />
programelor C au ca efect erori de adresare a memoriei (semnalate de sistemul de<br />
operare) sau rezultate gresite. Mesaje de eroare la executie pot fi generate de<br />
programator <strong>în</strong> urma unor verificãri prin assert sau prin instructiuni if.<br />
Descoperirea diferentelor dintre intentiile programatorului si actiunile programului<br />
sãu se poate face prin depanarea programului. Depanarea se poate face prin<br />
introducerea de instructiuni suplimentare <strong>în</strong> program <strong>în</strong> faza de punere la punct (afisãri<br />
de variabile, verificãri cu assert s.a.) sau prin folosirea unui program “debugger” care<br />
asistã executia.<br />
Existã câteva categorii de erori frecvente:<br />
- Erori de algoritm sau de <strong>în</strong>telegere gresitã a problemei de rezolvat.<br />
- Erori de exprimare a unui algoritm <strong>în</strong> <strong>limbajul</strong> de programare folosit.<br />
- Erori de utilizare a functiilor standard sau specifice aplicatiei.<br />
- Erori de preluare a datelor initiale (de citire date).<br />
Utilizarea de variabile neinitializate este o sursã de erori atunci când compilatorul<br />
nu semnaleazã astfel de posibile erori ( nu se pot verifica toate situatiile <strong>în</strong> care o<br />
variabilã poate primi o valoare). In particular, utilizarea de variabile pointer<br />
neinitializate ca adrese de siruri este o eroare uzualã.<br />
Indirectarea prin variabile pointer cu valoarea NULL sau neinitializate poate<br />
produce erori de adresare care sã afecteze si sistemul de operare gazdã.<br />
Erorile la depãsirea memoriei alocate pentru vectori (indici prea mari sau prea mici)<br />
nu sunt specifice <strong>limbajul</strong>ui C, dar nici nu pot fi detectate la executie decât prin<br />
instructiuni de verificare scrise de programator ( <strong>în</strong> Pascal si <strong>în</strong> Java aceste verificãri la<br />
indici de vectori se fac automat).<br />
O serie de greseli, care trec de compilare, se datoreazã necunoasterii temeinice a<br />
<strong>limbajul</strong>ui sau neatentiei; <strong>în</strong> aceste cazuri <strong>limbajul</strong> “trãdeazã” intentiile<br />
programatorului.<br />
Exemplul cel mai des citat este utilizarea operatorului de atribuire pentru<br />
comparatie la egalitate, probabil consecintã a obisnuintelor din alte limbaje:<br />
if ( a = b) printf (“ a=b \n”); // corect este if ( a==b ) ...<br />
Alte erori sunt cauzate de absenta acoladelor pentru grupuri de instructiuni, de<br />
absenta parantezelor <strong>în</strong> expresii pentru modificarea prioritãtii implicite de calcul, de<br />
utilizarea gresitã a tipurilor numerice si atribuirilor.<br />
Operatiile cu siruri de caractere <strong>în</strong> C pot produce o serie de erori, mai ales cã<br />
exprimarea lor este diferitã fatã de alte limbaje: prin functii si nu prin operatori ai<br />
<strong>limbajul</strong>ui. Functiile pe siruri nu pot face nici o verificare asupra depãsirii memoriei<br />
alocate pentru siruri deoarece nu primesc aceastã informatie, ci numai adresele<br />
sirurilor.