Автор |
Съобщение |
Ugeen
Ранг: Новодошъл
Регистриран на: Пон Яну 16, 2006 4:20 pm Мнения: 122 Местоположение: гр. Горна Оряховица
|
Struct and Union в С
Колеги ,от година се занимавам със С,а преди това пишех само на асемблер.Толкова ли съм тъп,не мога да ги схвана тия Struct и Union и каква е разликата между тях.Ясно е че се групират и дефинират променливи които са свързани с едно и,също нещо например като времена на часовник при които да се задейства аларма.Дали ще ползвам структура или не аз задължително
трябва да дефинирам някакви области които съдържат тези времена.Не мога ли да си ползвам много по -пряк начин, например:
int i;
for (i = 0; v < 10; i++)
{
if(Alarm_hour[i]==Hour && Alarm_min[i]==Min) {................................}
}
..................................
(Същото може да се направи и с пойнтери)
отколкото да си отварям работа да пиша от коя структура е елемента и кой е той.Не е ли това излишно усложнение на програмата и напълно безмислено.
ще ви бъда благодарен ,ако някой ми разясни същността на тези Struct и Union и да даде пример с какво могат да са полезни те.
|
Пон Яну 30, 2006 12:19 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 8097 Местоположение: София
|
Re: Struct and Union в С
Юниъна е структура, на която всички мембъри почват от един и същ адрес. Докато при нормална структура са наредени последователно.
|
Пон Яну 30, 2006 12:39 pm |
|
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 9:28 am Мнения: 2658
|
той реконструктора го каза ясно технически, обаче да вметна каква е идеята на цялата далавера.
приложението на унионите е доста различно от структурите, и обикновено се ползват вътре във структура, рядко съм виждал извън. идеята е че данните понякога е удобно да се виждат по различен начин. например може да искаш да виждаш един мембър от тип вектор, или 3 мембъра от тип флот, които са всъщност полетата на вектора. аз лично, ползвам унионите почти изцяло за съвместимост със стари структури и класове. често става така, че имам някакви полета в старите структури, за които после поради честата употреба съм направил отделен пакетиращ клас/структура, който си има разни автоматики с които се ползва суперудобно. как да стане така, че старите ми структури, които съдържат полетата разхвърляно, да могоат да се ползват от новите благинки? точно униона му е майката. ето един пример, който си е напълно реален:
|
Пон Яну 30, 2006 7:23 pm |
|
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 3:11 pm Мнения: 3744 Местоположение: София
|
Друго "полезно" приложение е да си направиш една цяла структура с най-разни типове променливи да се вижда и като масив от байтове. Губи се пригледността, но пък е много лесно да се предава / приема побайтово, например по сериен канал. Не че със поинтери няма да стане, ама така по-бързо се пише.
|
Пон Яну 30, 2006 7:28 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 8097 Местоположение: София
|
Уцели десятката. Точно за това се използва най-често, да може да една структура да изглежда като масив. Една извадка от комуникационния ми модул:
|
Пон Яну 30, 2006 7:38 pm |
|
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 9:28 am Мнения: 2658
|
sizeof това онова не ползваш ли?
|
Пон Яну 30, 2006 7:58 pm |
|
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 3:11 pm Мнения: 3744 Местоположение: София
|
char zaphod[sizeof(some_struct)]; // За това ли става дума?
Иначе, ако се усетиш, че в структурата трябва да вмъкнеш още един int и трябва да преглеждаш и редактираш целия си сорс.
|
Пон Яну 30, 2006 8:06 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 8097 Местоположение: София
|
To e C++ specific бе.
|
Пон Яну 30, 2006 8:15 pm |
|
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 3:11 pm Мнения: 3744 Местоположение: София
|
А моето ANSI си го вдява без да му е грижа.
Дали пък не е "миропомазано" още от Кънигам и Ричи?
|
Пон Яну 30, 2006 8:43 pm |
|
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 8:19 pm Мнения: 4411 Местоположение: Stara Zagora
|
и в IAR става катo пишеш на чисто C
|
Пон Яну 30, 2006 9:28 pm |
|
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 11:32 am Мнения: 8097 Местоположение: София
|
Да бе, верно. Нещо съм се ошашкал.
|
Пон Яну 30, 2006 9:49 pm |
|
|
the_real_maniac
Ранг: Почетен член
Регистриран на: Пет Авг 19, 2005 10:38 am Мнения: 978 Местоположение: Europe -> BG
|
глупости ! (отбелязвам факта).
sizeof въобще не е C++ specific. влиза си и в ANSI C стандарта.
|
Вто Яну 31, 2006 12:12 am |
|
|