| 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 |