Strukture podataka i algoritmi |
2.7.6 Kako manipulisati greskama u C-u? |
Sta mozemo da uradimo u C-u?
Cesto postoji vrednost koju funkcija moze da vrati,
a koja se moze iskoristiti za oznacavanje greske.
Konstruktori vracaju pointere na blokove memorije alocirane za objekat:
NULL pointer oznacava gresku.
int f( ... ) {
X a;
a = ConsX( ... );
if ( a != NULL ) {
/* Nema greske */
....
return 1;
}
else
{
/* vrati kod za gresku na visi nivo */
return 0;
}
}
/* vector.h */ typedef struct vector_t *vector; typedef enum( BezGreske, PogresnaDimenzija, NemaMemorije, LosVektor ) vector_error; double AddVector( vector a, vector b, vector_error *error );Implementacija:
#include "vector.h" double DotProduct( vector a, vector b, vector_error *error ) { if ( LengthVector(a) == LengthVector(b) ) { .... } else { *error = PogresnaDimenzija; return 0.0; } }Ovo resenje bi se verovatno smatralo glomaznim, iako se njime postize cilj robustnog koda. Dodatni argument takodje povecava vreme izvrsenja.
/* vector.h */ typedef struct vector_t *vector; typedef enum( BezGreske, PogresnaDimenzija, NemaMemorije ) vector_error; vector ConsVector( int dimension ); vector_error DeleteVector( vector a ); vector_error VectorError(); double DotProduct( vector a, vector b );Implementacija je jednostavna:
#include "vector.h" static vector_error ve = BezGreske; vector_error VectorError() { vector_error err; err = ve; ve = BezGreske; return err; } char *VectorErrorString( vector_error ve ) { switch( ve ) { case BezGreske: return "Bez greske"; case PogresnaDimenzija: return "Pogresna dimenzija vektora"; case NemaMemorije: return "Nedovoljno memorije za vektor"; default: return "Nepoznata greska za vektor"; } } double DotProduct( vector a, vector b ) { if ( LengthVector(a) == LengthVector(b) ) { .... } else { ve = PogresnaDimenzija; return 0.0; } }Primetite dodatni (opcioni) VectorErrorString metod koji daje razumljiv string sa objasnjenjem greske. Ovo je slicno perror() metodu koji na izlazu daje poslednju I/O gresku u obliku stringa. (Ali primetite da perror() krsi pravilo o visestrukoj iskoristivosti koje predlazemo ovde, s obzirom da se string stampa na standardnom izlazu, pa je stoga beskorisna u okruzenjima u kojima pojam stdout moze biti besmislen, npr. vecina GUI okruzenja.)
U ovom slucaju, metod VectorError()
moze da se pozove sa bilo kog mesta u programu,
nakon sto je pozvan neki vektorski metod,
u trenutku kada je okruzenje dovoljno poznato da
moze da se odredi kakvu akciju treba sprovesti kao odgovor na gresku.
double dp;
...
dp = DotProduct( a, b );
if( (ve = VectorError()) != Bez greske ) {
printf("Greska sa skalarnim proizvodom: %s\n", VectorErrorString( ve ) );
}
Dalje na Par napomena o C-u Nazad na Sadrzaj |