Doriți să reacționați la acest mesaj? Creați un cont în câteva clickuri sau conectați-vă pentru a continua.

Capitolul 6.4. Pointeri la structuri

In jos

Capitolul 6.4. Pointeri la structuri Empty Capitolul 6.4. Pointeri la structuri

Mesaj  zooky Mier Mar 18, 2009 1:53 pm

Pentru a ilustra citeva din consideratiile referitoare la pointeri si tablouri de structuri sa rescriem programul de contorizare a cuvintelor cheie, de data aceasta folosind pointerii in loc de indici.

Declaratia externa "keytab" nu necesita modificari, dar "main" si "binary" necesita.

main() /* count keywords; pointer version */
{
int t;
char word[MAXWORD];
struct key *binary() *p;
while ((t = getword(word, MAXWORD)) != EOF)
if (t == LETTER)
if ((p = binary(word, keytab, NKEYS)) != NULL)
p->keycount++;
for (p = keytab; p < keytab + NKEYS; p++)
if (p->keycount > 0)
printf("%4d %s/n", p->keycount, p->keyword);
}
struct key *binary(word, tab, n) /* find word */
char *word; /* in tab[0]...tab[n-1] */
struct key tab[];
int n;
{
int cond;
struct key *low = detab[0];
struct key *high = ftab[n-1];
struct key *mid;
while (low <= high) {
mid = low + (high - low) / 2;
if ((cond = strcmp(word, mid->keyword)) < 0)
high = mid - 1;
else if (cond > 0)
low = mid + 1;
else
return(mid);
}
return(NULL);
}
Aici sint mai multe chestiuni de notat. Prima, declaratia "binary" trebuie sa indice ca e returneaza un pointer structurii tip "key" in locul unui intreg. Acesta este declarat in "main" cit si in "binary". Daca "binary" gaseste cuvintul, returneaza un pointer; daca acesta lipseste, returneaza NULL.

A doua, orice acces la elementele lui "keytab" sint facute prin pointeri. Aceasta determina o schimbare semnificativa in "binary calculul poate fi simplu.

mid = (low + high) / 2

deoarece adunarea a doi pointeri nu va produce nici un fel de raspuns utilizabil si de fapt este ilegala. Aceasta trebuie schimbata in

mid = low + (high - low) / 2

care seteaza "mid" in punctul de la jumatatea intre "low" si "high".

Ar trebui sa studiati si initializatorii pentru "low" si "high" Este posibil sa se initializeze un pointer la adresa unui obiect definit dinainte; aceasta am facut noi aici.

In "main" am scris:

for (p = keytab; p < keytab + NKEYS; p++)

Daca p este un pointer la structura, orice operatie aritmentica asupra lui p tine cont de dimnesiunea actuala a structurii, astfel p++ incrementeaza p cu cantitatea corecta pentru a obtine urmatorul element al tabloului de structuri. Dar sa nu credeti ca dimensiunea structurii este suma dimensiunilor membrilor sai deoarece aliniamentul cerut pentru diferiti membri pot determina aparitia de "gauri" in structura.

Si in final o consideratie asupra formatului programului.
Cind o functie f returneaza un tip complicat ca in:

struct key *binary(word, tab, n)

numele functiei este dificil de vazut si de gasit cu un editor de texte De aceea un alt stil este citeodata folosit.

struct key *
binary(word, tab, n)

Aceasta este mai mult o chestiune de gust personal; luati forma pe care o doriti si tineti-va de ea.
zooky
zooky
Moderator
Moderator

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

https://e-learning.forumgratuit.ro

Sus In jos

Sus

- Subiecte similare

 
Permisiunile acestui forum:
Nu puteti raspunde la subiectele acestui forum