Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
}<br />
sprintf (result, "%.3s %.3s%3d %.2d:%.2d:%.2d %d\n",wday[tp→tm_wday],<br />
mon[tp→tm_mon], tp→tm_mday, tp→tm_hour, tp→tm_min, tp→tm_sec,<br />
1900 + tp→tm_year);<br />
return result;<br />
Pe de altã parte, functiile cu argumente pointeri la structuri, ca si functiile cu<br />
argumente de orice tip pointer, pot produce efecte secundare (laterale) nedorite, prin<br />
modificarea involuntarã a unor variabile din alte functii (pentru care s-a primit adresa).<br />
Structuri cu continut variabil<br />
Cuvântul cheie union se foloseste la fel cu struct, dar defineste un grup de variabile<br />
care nu se memoreazã simultan ci alternativ. In felul acesta se pot memora diverse<br />
tipuri de date la o aceeasi adresã de memorie. Alocarea de memorie se face (de cãtre<br />
compilator) <strong>în</strong> functie de variabila ce necesitã maxim de memorie. O uniune face parte<br />
de obicei dintr-o structurã care mai contine si un câmp discriminant, care specificã<br />
tipul datelor memorate (alternativa selectatã la un moment dat). Exemplul urmãtor<br />
aratã cum se poate lucra cu numere de diferite tipuri si lungimi, reunite <strong>în</strong>tr-un tip<br />
generic :<br />
// numar de orice tip<br />
struct numar {<br />
char tipn; // tip numar (un caracter)<br />
union {<br />
int ival; long lval; float fval; double dval;<br />
} v;<br />
};<br />
// afisare numar<br />
void write (struct numar n) {<br />
switch (n.tipn) {<br />
case 'i': printf ("%d ",n.v.ival);break;<br />
case 'l': printf ("%ld ",n.v.lval);break;<br />
case 'f': printf ("%f ",n.v.fval);break;<br />
case 'd': printf ("%.15lf ",n.v.dval);break;<br />
}<br />
}<br />
int main () {<br />
struct numar a,b,c,d;<br />
a = read('i'); b=read('l');<br />
c = read('f'); d=read('d');<br />
write(a); write(b); write(c); write(d);<br />
}<br />
Pentru câmpul discriminant se poate defini un tip prin enumerare, împreunã cu<br />
valorile constante (simbolice) pe care le poate avea. Exemplu: