Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Struct and Union в С
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=1708
Страница 1 от 1

Автор:  Ugeen [ Пон Яну 30, 2006 1:19 pm ]
Заглавие:  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 1:39 pm ]
Заглавие:  Re: Struct and Union в С

Ugeen написа:
Колеги ,от година се занимавам със С,а преди това пишех само на асемблер.Толкова ли съм тъп,не мога да ги схвана тия Struct и Union и каква е разликата между тях.


Юниъна е структура, на която всички мембъри почват от един и същ адрес. Докато при нормална структура са наредени последователно.

Автор:  zaphod [ Пон Яну 30, 2006 8:23 pm ]
Заглавие: 

той реконструктора го каза ясно технически, обаче да вметна каква е идеята на цялата далавера.
приложението на унионите е доста различно от структурите, и обикновено се ползват вътре във структура, рядко съм виждал извън. идеята е че данните понякога е удобно да се виждат по различен начин. например може да искаш да виждаш един мембър от тип вектор, или 3 мембъра от тип флот, които са всъщност полетата на вектора. аз лично, ползвам унионите почти изцяло за съвместимост със стари структури и класове. често става така, че имам някакви полета в старите структури, за които после поради честата употреба съм направил отделен пакетиращ клас/структура, който си има разни автоматики с които се ползва суперудобно. как да стане така, че старите ми структури, които съдържат полетата разхвърляно, да могоат да се ползват от новите благинки? точно униона му е майката. ето един пример, който си е напълно реален:
Код:
class Vertex{
public:
   union{
      struct {// като числа
         float x,y,z,nx,ny,nz;
      };
      struct {// като вектори
         Vector coord,normal;//
      };
   };
   float tu,tv;
};


Автор:  bateAz [ Пон Яну 30, 2006 8:28 pm ]
Заглавие: 

Друго "полезно" приложение е да си направиш една цяла структура с най-разни типове променливи да се вижда и като масив от байтове. Губи се пригледността, но пък е много лесно да се предава / приема побайтово, например по сериен канал. Не че със поинтери няма да стане, ама така по-бързо се пише.

Автор:  Реконструктор [ Пон Яну 30, 2006 8:38 pm ]
Заглавие: 

bateAz написа:
Друго "полезно" приложение е да си направиш една цяла структура с най-разни типове променливи да се вижда и като масив от байтове. Губи се пригледността, но пък е много лесно да се предава / приема побайтово, например по сериен канал. Не че със поинтери няма да стане, ама така по-бързо се пише.


Уцели десятката. :) Точно за това се използва най-често, да може да една структура да изглежда като масив. Една извадка от комуникационния ми модул:

Код:
struct CommFrameStruct
{
  BYTE DataLen;
  BYTE DataCmd;
  BYTE Data[8];
  BYTE CheckSum;
};

union CommFrame
{
  BYTE                     Buff[11];
  struct CommFrameStruct   Frame;
};

Автор:  zaphod [ Пон Яну 30, 2006 8:58 pm ]
Заглавие: 

sizeof това онова не ползваш ли? ;)

Автор:  bateAz [ Пон Яну 30, 2006 9:06 pm ]
Заглавие: 

char zaphod[sizeof(some_struct)]; // За това ли става дума?
Иначе, ако се усетиш, че в структурата трябва да вмъкнеш още един int и трябва да преглеждаш и редактираш целия си сорс.

Автор:  Реконструктор [ Пон Яну 30, 2006 9:15 pm ]
Заглавие: 

zaphod написа:
sizeof това онова не ползваш ли? ;)


To e C++ specific бе. :)

Автор:  bateAz [ Пон Яну 30, 2006 9:43 pm ]
Заглавие: 

А моето ANSI си го вдява без да му е грижа. :lol:
Дали пък не е "миропомазано" още от Кънигам и Ричи? :wink:

Автор:  Nikola Kirov [ Пон Яну 30, 2006 10:28 pm ]
Заглавие: 

и в IAR става катo пишеш на чисто C

Автор:  Реконструктор [ Пон Яну 30, 2006 10:49 pm ]
Заглавие: 

Да бе, верно. Нещо съм се ошашкал. :)

Автор:  the_real_maniac [ Вто Яну 31, 2006 1:12 am ]
Заглавие: 

Реконструктор написа:
zaphod написа:
sizeof това онова не ползваш ли? ;)


To e C++ specific бе. :)


глупости ! (отбелязвам факта).

sizeof въобще не е C++ specific. влиза си и в ANSI C стандарта.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/