[ OTAC_XXL @ 13.03.2007. 10:57 ] @
Pozdrav,

Ako bi mi neko mogao objasniti sta radi ovaj dio koda:

FILE *outfile=(FILE*)NULL;

Znam da FILE *outfile pravi pokazivac na FILE tip radi kasnijeg kreiranja filea, ali mi nije jasno sta uradio ovaj dio iza znaka =

[ Mali Misha @ 13.03.2007. 11:46 ] @
Deo iza = inicijalizuje polazivač na NULL vrednost. Stvar koja ne mora biti eksplicitno napisana je "(FILE*)" deo, koji makro NULL (koji je u stvari nula) 'kastuje' na tip FILE*. U praksi može da se kaže i:

Code:
FILE *outfile = NULL;
ili samo
Code:
FILE *outfile = 0;

Znači, opet, "(FILE*)" je samo eksplicitni 'kast' vrednosti koju nosi NULL na tip FILE*. Ovo se dešava pre dodele vrednosti sa "=".
[ X Files @ 13.03.2007. 11:49 ] @
Citat:

Znam da FILE *outfile pravi pokazivac na FILE tip radi kasnijeg kreiranja filea, ali mi nije jasno sta uradio ovaj dio iza znaka =

Pre poziva fopen(), FILE *outfile je običan pokazivač koji ne pokazuje ninašta validno,
a jeste predviđen da pokazuje na neki fajl stream, i to u slučaju uspešnog izvršenja fopen().

Ukoliko kao rezultat fopen() vrati neku vrednost različitu od NULL, ta vrednost će označavati
adresu fajl stream-a odakle se može čitati. Ukoliko vrati NULL, došlo je do greške u pristupu fajlu, i pointer
nije validan (biće postavljen na NULL od strane fopen).

Citat:

FILE *outfile=(FILE*)NULL;

Osnovni uzrok ovakvih izraza je što C++ ne definiše koju vrednost će imati outfile pre fopen(), tj. pri deklaraciji
generalno.

Ovde je autor eksplicitno dodelio NULL pointeru outfile, najverovatnije bespotrebno (treba videti veće
parče koda), jer po standardu svakako će vrednost biti NULL ako dođe do greške. Ono (FILE*) je cast-ovanje,
tj. izjednačavanje po tipu sa leve strane izraza, da se kompajler ne bi (eventualno) pobunio.
Dakle, moglo je i:
Code:

FILE *outfile=NULL;
// ili:
FILE *outfile=0;
// ili samo:
FILE *outfile; // <-- u slučaju fopen greške, svakako će biti NULL.


Doduše, ja takođe volim da koristim eksplicitne dodele NULL pointera (mada nije po principima), pogotovo kada
imam puno pointera u nizu koji se instanciraju jer imam veću slobodu da kasnije za sobom počistim smeće ako
slučajno dođe do greške usred procedure, npr:

// PSEUDO
Code:

// ...
FILE *p1 = NULL;
FILE *p2 = NULL;
FILE *p3 = NULL;
// ...
{
p1 = fopen()
// neki break u slučaju greške koji zaobilazi p2 i p3
p2 = fopen()
// neki break u slučaju greške koji zaobilazi p3
p3 = fopen()
// neki break u slučaju greške koji zaobilazi ostatak koda koji se oslanja na ispravnost pointera
}
// ...
ciscenje()
// ...
void ciscenje()
{
   if ( p1 )
      fclose( p1 );
   if ( p2 )
      fclose( p2 );
   if ( p3 )
      fclose( p3 );
}

... ovim se kao osigurava da neka slučajna vrednost p1 ili p2 ili p3 dođe na fclose(), što dovodi do greške.
[ OTAC_XXL @ 13.03.2007. 12:08 ] @
Hvala puno svima na iscrpnim odgovorima, puno mi je pomoglo da razjasnim sebi ovaj pristup programiranja.

Tnx :-)