Capitolul 4.9. Initializare

Vezi subiectul anterior Vezi subiectul urmator In jos

Capitolul 4.9. Initializare

Mesaj  zooky la data de Mier Mar 18, 2009 12:21 pm

Initializarea a fost mentionata in trecere de mai multe ori pina acum, dar intodeauna in trecere si in legatura cu alte subiecte. Aceasta sectiune rezuma unele din reguli, dat fiind faptul ca pina acum am discutat mai multe clase de tipuri de memorari.

In absenta initializarii explicite, variabilele externe si statice se initializeaza pe zero; variabilele automate si de registru sint nedefinite (i.e. gunoi, ramasita). Variabilele simple ( nu tablourile sau structurile ) pot fi initializate cind se declara, punind in continuarea numelui lor semnul egal si o expresie constanta:

int x = 1;
char squote = '\";
long day = 60 * 24; /* minute intr-o zi */

Pentru variabilele externe si statice, initializarea se face o data ,la compilare. Pentru variabilele automate si registru, initializarea se face de fiecare data cind functia sau blocul se executa .
Pentru variabilele automate si de registru valoarea de initializare nu trebuie sa fie o constanta: poate fi de fapt orice expresie valida implicind valori definite anterior, chiar si de apeluri de functii. De exemplu initializarile din programul de cautare binara din capitolul 3 pot fi scrise astfel :

binary (x, v, n)
int x, v[], n;
{
int low = 0;
int high = n - 1;
int mid;
...
}

in loc de:

binary (x, v, n)
int x, v[], n;
{
int low, high, mid;
low = 0;
high = n - 1;
...
}

In fapt, initializarile de variabile automate sint prescurtari pentru instructiunile de asignare. Care forma este de preferat este in ultima instanta o chestiune de gust. In general noi am preferat asignarile explicite, deoarece initializarile in declaratii sint mai greu de vazut.
Tablourile automate nu pot fi initializate. Tablourile externe si statice pot fi initializate punind dupa declaratie o lista de valori de initializare inclusa intre paranteze si separate prin virgule. De exemplu programul de contorizare caractere dat in capitolul 1, care incepea

main() /* contorizeaza cifre, blancuri, altele */
{
int c, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; i++)
ndigit[i] = 0;
...
}

poate fi scris si astfel:

int nwhite = 0;
int nother = 0;
int ndigit[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ;
main() /* contorizeaza cifre, blancuri, altele */
{
int c, i;
...
}

Aceste initializari sint de fapt necesare deoarece sint toate zero dar este o buna practica de programare de a le da explicit.
Daca valorile de initializare specificate sint mai putine decit marimea specificata, restul valorilor vor fi zero. Daca ele sint mai multe se provoaca eroare . Este regretabil insa faptul ca nu putem specifica nicicum repetitia unei valori de initializare si nici sa initializam un element din mijlocul unui tablou fara a initializa si toate elementele care-l preced.
Tablourile de caractere sint un caz special de initializare.
In locul notatiei cu paranteze si virgule se poate folosi un sir de caractere:

char pattern[] = "the"

Aceasta este o prescurtare pentru forma echivalenta dar mai lunga:

char pattern[] = { 't', 'h', 'e', '\0' };

Cind marimea unui tablou de orice tip este omisa, compilatorul va calcula lungimea contorizind valorile de intializare. In acest caz specific marimea tabloului este 4 (trei caractere plus terminatorul \0).
avatar
zooky
Moderator
Moderator

Numarul mesajelor : 147
Data de inscriere : 15/03/2009
Varsta : 24
Localizare : Cernatesti City

Vezi profilul utilizatorului http://e-learning.forumhit.ro

Sus In jos

Vezi subiectul anterior Vezi subiectul urmator Sus


 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum