Tablouri multi-dimensionale
C este prevazut cu probabilitatea de a lucra cu tablouri multidi-
mensionale, cu toate ca in practica exista tendinta ca ele sa
fie mult mai putin utilizate decit tabloutile de pointeri. In
aceasta sectiune vom da citeva dintre proprietatile lor.
Sa reluam problema de conversia datei, zi-in-luna in zi-in-
an si viceversa. De exemplu, 1 martie este a 60-a zi dintr-un an
nebisect si a 61-a dintr-un an bisect. Sa definim doua functii
care sa faca conversia "day_of_year" converteste luna si ziua in
ziua din an si luna, iar "month_day" converteste ziua din an in
luna si ziua. Daca aceasta din urma functie returneaza doua va-
lori, argumentele "luna si ziua" vor fi pointeri:
month day (1977, 60, &m, &d)
puna pe m pe 3 si pe d pe 1.
Aceste functii au nevoie de aceasi informatie, o tabela cu numarul
zilelor din fiecare luna ("30 zile are septembrie"). Din moment
ce numarul de zil/luna difera in functie de an bisect sau an
nebisect, este mai usor sa separam aceste informatii pe doua
linii ale unui tablou bidimensional; apoi sa incercam sa tinem
cont de ce se intimpla cu februarie in timpul calcului.
Tabloul si functia pentru rezolvarea transformarilor sint dupa cum
urmeaza:
static int day_tab[2][13] = ,
};
day-of-year(year, month, day) /* pune nr zilei in an */
int year, month, day; /* din luna &an */
month_day(year, yearday, pmonth, pday) /*pune luna, zi */
int year, yearday, *pmounth, *pday; /* din ziua in an */
Tabloul day-tab trebuie sa fie extern ambelor functii
"day_of_year" si "month_day", in asa fel incit ambele sa-l poata
utiliza.
"day-tab" este primul tablou bidimensional cu care avem de
a face in C, Prin definitie un tablou bidimensional este de
fapt un tablou unidimensional alei carei elemente sint fiecare
in parte cite un tablou. Prin uramre, indicii se scriu astfel
day_tab[i][j]
in loc de
day_tab[i, j]
ca in majoritatea limbajelor in plus un tablou bidimensional paote
fi tratat in mai multe moduri decit in alte limbaje. Elementele
sint memorate pe linii, ceea ce inseamna ca indicele din deapta
varaiaza primul in asa fel incit elementele sint accesate in
ordinea memoriei.
Un tablou se initializeaza printr-o lista de initiali-
zatori scrisi intre acolade; fiecare liniea unui tablou bidimen-
sional este initializata printr-o sublista corspondenta. Am ince-
put tabloul day-tab cu o coloana de zero, in asa fel incit numero-
tarea liniilor poate fi facuta de la 1 la 12 in loc de 1 0-11.
Daca exista spatiu suficient, este mai usor sa se procedeze
innmodul mai sus aratat in loc sa se ajusteze indicii.
In cazul in care un tablou bidimensional trebuie transmis
unei functii, declararea argumentelor in funtie trebuie sa includa
dimensiunea coloanei, dimensiunea liniei este irelevanta deoarece
unei functii i se transmite ca si in cazurile anterioare, uh
pointer. In cazul de fata este vorba de un pointer care parcurge
obiecte care sint tablouri de cite 13 int. Astfel daca trebuie
transmis tabelul day-tab unei functii f, declararea lui f va fi
f(day_tab)
int day_tab[2][13];
Declararea argumentului in f va fi deasemenea
int day-tab[][13];
din moment ce nr liniilor este irelevant, sau ar putea fi
int (*day-tab)[13];
care spune ca argumentul este un pointer pe un tablou de 13 in-
tregi. Sint necesare parantezele pentru ca crosetele au prioritate
mai mare decit *, fara paranteze; declararea
int *day-tab[13];
este un tablou de 13 pointeri pe intregi, dupa cum se va vedea
in sectiunea urmatoare.