1

Тема: Використовування структур в Ci

Привіт, однією із не дуже зрозумілих тем в книзі Кернігана і Рітчі, окрім покажчиків, були також і структури. Перша половина нормально пішла і зрозуміло все було, а от коли пішли більш важкі застосування, то уже майже зовсім нічого зрозуміло не було.
Досі я писав деякі програмки і структури не зачіпав взагалі. А для чого їх на практиці застосовують?

2

Re: Використовування структур в Ci

Для абстракції. Структура дає змогу ввести новий тип, складений з простих. Код виходить набагато зрозумілішим.

Подякували: koala2

3 Востаннє редагувалося koala (18.06.2014 17:25:07)

Re: Використовування структур в Ci

Для структурування і групування (агрегації, ще кажуть) зв'язаних даних.

Порівняйте:

/*перевіряє, чи точка потрапляє в прямокутник*/
int pointInRect(int rectangleTop, int rectangleLeft, int rectangleBottom, int rectangleRight, int pointX, int pointY)
{
  return ( pointX > rectangleTop    ) && 
         ( pointX < rectangleBottom ) && 
         ( pointY > rectangleLeft   ) && 
         ( pointY < rectangleRight  );
}
/*і ще 10 схожих функцій, які активно викликають одна одну*/

з

typedef struct 
{
  int x, y;
}Point;

typedef struct 
{
  Point topLeft, bottomRight;
}Rectangle;

/*правда, тепер важко заплутатися в параметрах?*/
int pointInRect( Rectangle rectange, Point point )
{
  return ( point.X > rectangle.topLeft.X     ) &&
         ( point.X < rectangle.bottomRight.X ) && 
         ( point.Y > rectangle.topLeft.Y     ) && 
         ( point.Y < rectangle.bottomRight.Y );
}

Проголошення типів зайняло трохи місця, але тепер ви точно не зможете передати в функцію одну з координат не того прямокутника (і, відповідно, не вб'єте 3 години на пошук незрозумілого бага), і сама функція стала значно коротше викликатися - тобто місце витрачене не дарма.

Подякували: quez2