Перейти к содержанию

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


Zombie47

Рекомендуемые сообщения

Вот смотрите создаю структуру и в интернете пишут если не писать 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 которые содержат структуру?

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

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

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

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

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

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

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

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

Изменено пользователем DedLogoped
не то скопировал

Улыбнись! Завтра будет ещё хуже...

@Borodach - мудератор.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

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

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

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...