17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!