Unia (programowanie): Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
dodałem szablon typy danych w c++
Paweł Ziemian BOT (dyskusja | edycje)
m Zamieniam przestarzały tag 'source' na 'syntaxhighlight'
Linia 6:
 
Przykładowo unia:
<sourcesyntaxhighlight lang="c">
union nazwa_unii {
char tablica_znakowa[4];
int wartosc;
} u;
</syntaxhighlight>
</source>
 
tworzy zmienną ''u'', do której można mieć dostęp albo jako do liczby (''u.wartosc''), albo jako do tablicy znaków (''u.tablica_znakowa'').
Linia 29:
Elementami unii mogą być [[struktura (programowanie)|struktury]], co czasem jest przydatne:
 
<sourcesyntaxhighlight lang="c">
union liczba {
struct {
Linia 45:
unsigned int liczba;
};
</syntaxhighlight>
</source>
 
== Unie anonimowe ==
[[C++]] dopuszcza tzw. '''unie anonimowe''' w których nie ma ani nazwy unii, ani nazwy zmiennej:
 
<sourcesyntaxhighlight lang="c">
union {
int liczba;
char znak;
};
</syntaxhighlight>
</source>
 
Do pól takiej unii można dostawać się bezpośrednio używając ich nazw (np. ''liczba'' lub ''znak'' z przykładu powyżej). Czasem ten mechanizm jest stosowany przy umieszczaniu unii anonimowej jako pola struktury.
Linia 72:
Również atrybuty, definiowane we [[Fraza (programowanie)|frazach]] konkretnej [[Deklaracja (informatyka)|deklaracji]], określające położenie zmiennej w pamięci, umożliwiają uproszczoną i luźną [[Implementacja (informatyka)|implementację]] mechanizmów oferowanych przez unię. W tym przypadku działanie jest identyczne z unią, jednak [[Kod źródłowy|kodzie źródłowym]] nie jest widoczne powiązanie poszczególnych "pól" (w tym przypadku niezależnych zmiennych, rozmieszczonych od tego samego adresu pamięci – [[Zmienna nakładana|zmiennych nakładanych]]). W działaniu tak rozumianych "pól" nie jest oczywiście wymagane, w przeciwieństwie do unii, stosowanie [[Selekcja (programowanie)|selekcji]]. Przykładem takiej implementacji jest dyrektywa <code>absolute ''adres''</code> dostępna w [[Turbo Pascal]]u. W tym przypadku <code>''adres''</code> może mieć postać adresu bezwzględnego, w postaci liczbowej, ale można się również posłużyć identyfikatorem uprzednio zdefiniowanej zmiennej, co w pewnym stopniu ukazuje powiązania między zmiennymi. Można też uzyskać efekt niedostępny w uniach, tzn. dodać przesunięcie do adresu zmiennej na którą nakładamy inną zmienną. Nałożenie może więc dotyczyć dowolnej części pewnej zmiennej, a nie tylko jej początku.
 
<sourcesyntaxhighlight lang="pascal">
var s:string[5]; {łańcuch}
len:byte absolute s; {długość łańcucha}
last:char absolute s[5]; {ostatni znak łańcucha}
</syntaxhighlight>
</source>
 
{{osobny artykuł|Atrybut rozmieszczenia}}