Jump to content

Помогите досконально понять про структуры в СИ


Zombie47
 Share

Recommended Posts

Вот смотрите создаю структуру и в интернете пишут если не писать typedef то sPWM_t не будет типом и нужно будет где то писать каждый раз struct

typedef struct sPWM_t { 
  int phaseFull;
  int phaseOne_temp;
  long phaseOne;
  int timer;
  };

struct sPWM_t sBlowerFan;
struct sPWM_t sHeater;

Я так и делаю, но если не писать struct при  создании элементов структуры то выдает ошибку.

Чтобы не писать struct нужно делать так:

typedef struct  {
  int phaseFull;
  int phaseOne_temp;
  long phaseOne;
  int timer;
  }sPWM_t;

sPWM_t sBlowerFan;
sPWM_t sHeater;

В первом случае я создал новый тип данных sPWM_t содержащих структуру и два элемента структуры? Или структуры с типом данных содержащим структуру и именем sBlowerFan и sHeater?
Во втором случае как я понял я создал Анонимную структуру? Или тип данных содержащий анонимную структуру? и элемент структуры sPWM_t? или что это? тоже тип? ну и две переменных типа sPWM_t которые содержат структуру?

Мне просто важно понимать как оно устроено, я конечно могу забить и использовать в торой вариант, типо так все делают. Но хотелось бы понимания.

Link to comment
Share on other sites

51 минуту назад, Zombie47 сказал:

В первом случае я создал новый тип данных sPWM_t содержащих структуру и два элемента структуры?

Нет. Вы описали структуру, а затем создали её объекты (struct sPWM_t sBlowerFan; struct sPWM_t sHeater;).

51 минуту назад, Zombie47 сказал:

Чтобы не писать struct нужно делать так:

Если название структуры пишете после закрывающей фигурной скобки, то структура описана и создан её объект. Именно поэтому далее писать (указывать компилятору тип) struct уже не нужно. 

Чтоб Вы понимали: я напишу на бумаге слово "машина", а в фигурных скобках напишу элементы машины: "колесо", "руль", "дверь", "двигатель" и т.д.. Но самой машины то ещё у меня нет. А вот если я по описанию уже начну собирать элементы в кучу: сварю кузов, вмонтирую двигатель, руль, прикручу колёса и двери - у меня будет уже объект "машина", в который можно сесть и поехать. В программировании объекты для Вас создаёт компилятор, но сначала Вы должны описать компилятору из каких частей переменных и/или объектов нужно создать. Базовые переменные (int, float, char и т.д.) - это тоже объекты, но заранее созданные для Вас.

Прочтите внимательно на Метаните

Edited by DedLogoped
не то скопировал
Link to comment
Share on other sites

@Zombie47 Для того, чтобы typedef работал, нужно в самом конце после закрывающей скобки } поставить какое-то имя. Тогда всё, что между typedef и именем будет помещено в это имя. Таким образом  создаётся новый тип переменной-объекта.

Очевидно, что в первом случае нету имени в конце, поэтому typedef тут не работает, его можно просто выкинуть, и ничего не изменится. Просто описана структура с названием sPWM_t. Может быть много структур, все с разными именами. Всякий раз, когда хотите использовать это описание для создания объекта-структуры, надо так и писать, мол, новый объект с типом "структура sPWM_t".

Во втором случае при описании структуры в конце есть какое-то имя sPWM_t. Это не имя структуры, тут структура безымянная, ну и хрен с ним. Просто всё, что между typedef и sPWM_t будет помещено во внутрь sPWM_t. Тут слово sPWM_t является тоже описанием, только покороче. Это новый тип переменной. Поэтому каждый раз при создании новых объектов, когда встретится имя sPWM_t, компилятор будет раскрывать это имя обратно в структуру, и слово struct уже не нужно писать. 

Получается этот typedef просто создает заменитель набора слов на одно слово, для удобства и сокращения писанины.

Edited by Yurkin2015
Link to comment
Share on other sites

Экономичность и универсальность: новые DC/DC-преобразователи MORNSUN для ответственных применений
Высокое качество при конкурентной стоимости позволяет DC/DC-преобразователям MORNSUN конкурировать с аналогами ведущих мировых производителей. Продукция данного бренда, такая как семейство UWTH1D, может с успехом применяться в железнодорожных приложениях. Для телекоммуникационного оборудования подходят DC/DC-преобразователи семейств VCB и VCF, для систем распределенного электропитания – малогабаритные импульсные PoL-стабилизаторы напряжения семейства K78, а для автоматизированных системах производства и робототехники, незаменима серия KUB. Есть и уникальные решения, например, миниатюрный DC/DC-конвертер B0505ST16-W5 в корпусе микросхемы, предназначенный для медицинских приборов.

Читать подробнее>>

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...