Отговори на тема  [ 12 мнения ] 
Struct and Union в С 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пон Яну 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 в С
Ugeen написа:
Колеги ,от година се занимавам със С,а преди това пишех само на асемблер.Толкова ли съм тъп,не мога да ги схвана тия Struct и Union и каква е разликата между тях.


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


Пон Яну 30, 2006 12:39 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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



Пон Яну 30, 2006 7:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 3:11 pm
Мнения: 3744
Местоположение: София
Мнение 
Друго "полезно" приложение е да си направиш една цяла структура с най-разни типове променливи да се вижда и като масив от байтове. Губи се пригледността, но пък е много лесно да се предава / приема побайтово, например по сериен канал. Не че със поинтери няма да стане, ама така по-бързо се пише.


Пон Яну 30, 2006 7:28 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 8097
Местоположение: София
Мнение 
bateAz написа:
Друго "полезно" приложение е да си направиш една цяла структура с най-разни типове променливи да се вижда и като масив от байтове. Губи се пригледността, но пък е много лесно да се предава / приема побайтово, например по сериен канал. Не че със поинтери няма да стане, ама така по-бързо се пише.


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

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

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


Пон Яну 30, 2006 7:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 9:28 am
Мнения: 2658
Мнение 
sizeof това онова не ползваш ли? ;)


Пон Яну 30, 2006 7:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 3:11 pm
Мнения: 3744
Местоположение: София
Мнение 
char zaphod[sizeof(some_struct)]; // За това ли става дума?
Иначе, ако се усетиш, че в структурата трябва да вмъкнеш още един int и трябва да преглеждаш и редактираш целия си сорс.


Пон Яну 30, 2006 8:06 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 11:32 am
Мнения: 8097
Местоположение: София
Мнение 
zaphod написа:
sizeof това онова не ползваш ли? ;)


To e C++ specific бе. :)


Пон Яну 30, 2006 8:15 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 3:11 pm
Мнения: 3744
Местоположение: София
Мнение 
А моето ANSI си го вдява без да му е грижа. :lol:
Дали пък не е "миропомазано" още от Кънигам и Ричи? :wink:


Пон Яну 30, 2006 8:43 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 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
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 10:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Реконструктор написа:
zaphod написа:
sizeof това онова не ползваш ли? ;)


To e C++ specific бе. :)


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

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

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Вто Яну 31, 2006 12:12 am
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 12 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни