Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
4 / 2 / 0
Регистрация: 30.07.2018
Сообщений: 83

Typedef struct

30.07.2018, 10:56. Показов 4711. Ответов 50
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане.
С недавних пор пытаюсь научиться работать с микроконтроллерами. Параллельно изучаю С\С++.
Так вот у меня состояние грога с таким вот кодом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#define ITM                 ((ITM_Type       *)     ITM_BASE      ) <----  вот эта строка особенно бесит!! Что здесь происходит?
#define ITM_BASE            (0xE0000000UL)
 
 
typedef struct
{
  __OM  union
  {
    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */
    ..........
    
  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */
  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */
  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */
  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */
  ..........
  
} ITM_Type; <----------в define тоже эта запись....
как это все понимать? вверху.





C++
1
2
3
4
5
6
__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
{
  Здесь еще какой-то код,он мне не интересен
    ITM->PORT[0U].u8 = (uint8_t)ch;  <-----  что это такое? Куда указатель? Почему указатель? 
    
  }

Попытка отработать такой же код с другими именами в Code Blocks работает только как набрано.
Если пытаюсь изменить всю запись, но в соответсвии со своим пониманием процессов -- ничего не получается.
Разъясните пожалуйста.

Добавлено через 39 минут
Спасибо за редактирование.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.07.2018, 10:56
Ответы с готовыми решениями:

typedef struct
а зачем вы используете конструкцию typedef struct name{...} ? и какие она дает преимущества в отличии от struct name{...}

typedef struct
Ребята, нужна помощь. Первый раз использую typedef struct. Вроде бы всё работает, но хочу удостовериться по причине: это мой уже 2-ой...

typedef struct ....
Здравствуейте. Обьясните пожалуйсто новичку что означает этот код. typedef struct { long num_servers; long data_size; char*...

50
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.07.2018, 14:25
Лучший ответ Сообщение было отмечено Predator79 как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Predator79 Посмотреть сообщение
Или данные, все-таки, расположены в последовательности записи в теле структуры?
Поля структуры расположены последовательно.
Параллельно они находятся в объединении (union), т.е. там зарезервирована ячейка под u32, но могут записываться или u32, или u16(оставшиеся 2 байта не трогаются) или u8 (3 байта не трогаются).

Но в структуре объявлен массив из этих union'ов PORT с 32 такими элементами.

Добавлено через 23 секунды
Цитата Сообщение от Predator79 Посмотреть сообщение
То есть если мы изменим последовательность полей (с разными типами данных и их величинами) то мы "собьем настройку"
Конечно.

Добавлено через 3 минуты
Хотя можно конечно сделать свой собственный "трафарет"(структуру) на основе ITM_Type, который бы оформлял нужные байты в более удобном тебе виде, но принципиально это бы ничего не изменило.
1
4 / 2 / 0
Регистрация: 30.07.2018
Сообщений: 83
30.07.2018, 15:03  [ТС]
А можем вместо
C++
1
(ITM_Type *)(0xE0000000UL)->PORT[0].u8 = (uint8_t)ch;
писать
C++
1
 (0xE0000000UL)->PORT[0].u8 = (uint8_t)ch;
?

Ведь (0xE0000000UL) -- указатель.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2018, 15:29
Цитата Сообщение от Predator79 Посмотреть сообщение
Так??
Predator79, Вам нужно почитать о структурах. И начиная с древних си-шных объявлений Тегом:
C++
1
2
3
4
5
6
7
8
9
10
struct
{
int valObj;
}ObjectName;//экземпляр анонимной структуры - он предполагается один в програме
 
int main(int argv, char*argc[])
{
ObjectName.valObj =2345;
   cout << ObjectName.valObj << endl ;
TypeName2 fake{1234};
Тоесть тег можно было писать перед именем и главное - объявление можно было делать также и прямо в локальном контексте:
C++
1
2
3
4
5
int main(int argv, char*argc[])
{
//имя типа-тег размещения          имя объекта
struct{int valObj;} ObjectNameNext;
ObjectNameNext.valObj=345;
Это всё могут назвать криогенными выделениями проторептилий и тут невозможно спорить, но раз Вам приходится заниматься анализом данного материала, то советую Вам это получить. Иначе в голове будет каша.
1
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
30.07.2018, 15:29
Цитата Сообщение от Predator79 Посмотреть сообщение
Ведь (0xE0000000UL) -- указатель.
Нет. Это целое число. Чтобы проинтерпретировать его как адрес, нужно выполнить приведение типа к указателю (ITM_Type *).

Выше был вопрос, что есть указательный тип? Так вот, это как раз ITM_Type *. Составной тип, указатель на ITM_Type. Объект этого типа можно создать так: ITM_Type * ptr; (где ptr - это объект, переменная типа "указатель на ITM_Type"), затем проинициализировать его определенным значением, как в нашем случае: ITM_Type * ptr = (ITM_Type *)0xE0000000UL; и обращаться уже через ptr вот так: ptr->PORT[0].u8 = (uint8_t)ch;.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2018, 15:42
Цитата Сообщение от IGPIGP Посмотреть сообщение
то советую Вам это получить.
Жесть. Так я уже давно не ошибался надо было:
то советую Вам это подучить.

Простите Predator79, буквы д и л рядом, да и выглядят похоже. Также как и различные варианты объявления структур. Вроде и понимаешь, что ты написал, а ведь это тольуо кажется.
Обявление typedef объявляет именно тип. И приведение делается к типу "указателя на тип". Потому что приводится значение указателя (адрес). И присваивается переменной указателя. А потом на ней вызывается оператор доступа -> чтобы достучаться до внутренних элементов.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
30.07.2018, 15:43
Цитата Сообщение от IGPIGP Посмотреть сообщение
Жесть. Так я уже давно не ошибался
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вроде и понимаешь, что ты написал, а ведь это тольуо кажется.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Обявление typedef объявляет именно тип.
Надо больше отдыхать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2018, 15:49
Цитата Сообщение от Croessmah Посмотреть сообщение
Надо больше отдыхать.
Желаю как можно успешнее это сделать:
C++
1
2
3
4
typedef struct
{
int val1;
}TypeName1;//старый синтаксис
Это сишный вариант использования typedef при объявлении имён типов для структур. В С++ этот синтаксис оставлен для совместимости. Хотя основным применением для typedef стало объявление синонимов типов. Беда в том, что в С++ об этом мало кто помнит, а в С уже все давно забыли.
А отдыхать и правда надо.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.07.2018, 16:09
Цитата Сообщение от Predator79 Посмотреть сообщение
Ведь (0xE0000000UL) -- указатель.
0xE0000000UL это число 3758096384 в 16-ричном представлении. UL - беззнаковое (Unsigned) типа Long int (т.е. unsigned long int, 32 бита). Число это по умолчанию просто число, а никакой не адрес.

Добавлено через 16 минут
И ещё. У меня есть ощущение, что компилятор того микроконтроллера С++ не поддерживает, только чистый С...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2018, 16:13
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это сишный вариант использования typedef при объявлении имён типов для структур
Если подробнее, то в данном разе синоним подыскивается для записи вида struct{...} называемой тэгом, но по смыслу оно похоже на объявление синонимов для уже объявленных имён:
C++
1
2
3
4
5
6
7
//              имя типа    имя синонима
typedef     int         UserIntType;
 
//              тег типа                имя синонима
typedef     struct{int a; int b;}   UserStructForThatTagName;
 
UserStructForThatTagName usftn{123,456};
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
30.07.2018, 16:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
TypeName1;//старый синтаксис
Typedef участвующий в создании класса
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.07.2018, 16:59
Цитата Сообщение от Croessmah Посмотреть сообщение
TypeName1;//старый синтаксис
Typedef участвующий в создании класса
Ну и что? Croessmah, вы написали
в ответ на моё
Цитата Сообщение от IGPIGP
Обявление typedef объявляет именно тип.
Цитата Сообщение от Croessmah Посмотреть сообщение
Надо больше отдыхать.
Я привожу аргументы. Вы этого не делаете. Причем, систематически.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.07.2018, 17:11
IGPIGP, правильнее будет "синтаксис С, совместимый с С++" и "синтаксис С++", а не "старый" и "новый".
0
4 / 2 / 0
Регистрация: 30.07.2018
Сообщений: 83
30.07.2018, 17:28  [ТС]
TRam_, IGPIGP, DrOffset,

Нет. Это целое число. Чтобы проинтерпретировать его как адрес, нужно выполнить приведение типа к указателю (ITM_Type *).
Спасибо.
Понял.
Но вот еще тогда вопрос возникает. Ведь это самое целое число весит 4 байта. Никак не меньше, потому что там должно помещаться столько. Ну по идее. И где тогда хранится информация о том, что это указатель? Ведь для этого нужна еще информация и занимать она будет никак не меньше 2-3 бит. Так, навскидку.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.07.2018, 17:42
Цитата Сообщение от Predator79 Посмотреть сообщение
И где тогда хранится информация о том, что это указатель?
Она нигде не хранится, т.к. нужна только компилятору, чтобы определить сколько и каких байтов по каким адресам изменять. А так процессор/контроллер вообще ничего не знает о том, что происходит в строке
C
1
(ITM_Type *)(0xE0000000UL)->PORT[0].u8
т.к. компилятор это при переводе в машинный код пересчитает всё это в константу адреса (где находится u8), и будет что-то наподобие "занести такую-то константу в такой-то регистр"+"записать по адресу в памяти, хранящемся в таком-то регистре, такое-то значение" (в дизасемблированном виде можешь посмотреть точнее)

Добавлено через 8 минут
Вот если бы ты написал вот так:

C
1
2
ITM_Type *itm_pointer = (ITM_Type *)0xE0000000UL;
itm_pointer->PORT[0].u8 = 6;
то у тебя бы была явная локальная переменная с адресом, и ничего компилятор не упрощал, а во второй строке производил с её копией арифм. операции для получения адреса u8, а дальше - аналогично.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.07.2018, 17:47
чувак нормально объяснил.

В С, в отличие от С++, слово struct приходится постоянно использовать с именем типа -

C++
1
2
3
struct Pair { int a, b; };
 
struct Pair z;
Просто Pair z; будет не понято компилятором.

Чтобы избежать этой проблемы, можно дописать

C++
1
typedef struct Pair mypair;
после чего

C++
1
mypair z;
станет корректным объявлением. Получается, что само имя Pair de facto не используется нигде, кроме как при объявлении структуры и в typedef. Так не проще ли его вообще выкинуть и использовать typedef с анонимной структурой -

C++
1
2
3
typedef struct { int a, b; } pair;
 
pair z;
"По-моему, так" (с) Пух
1
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
30.07.2018, 17:48
Цитата Сообщение от Predator79 Посмотреть сообщение
она будет никак не меньше 2-3 бит
Контроллер умеет обращаться в памяти только к байтам, и записывать в память, опять же, только байты. Отдельные биты он записать не умеет, поэтому в памяти никогда не хранятся несколько бит отдельно. Они содержатся только в байтах, и проверяются полностью считыванием всего байта с использованием операций побитового или и побитового и.
0
4 / 2 / 0
Регистрация: 30.07.2018
Сообщений: 83
30.07.2018, 18:40  [ТС]
TRam_,
C++
1
Контроллер умеет обращаться в памяти только к байтам, и записывать в память, опять же, только байты. Отдельные биты он записать не умеет, поэтому в памяти никогда не хранятся несколько бит отдельно.
дело не в минимальном обьеме. Дело в том, как я себе это представлял.
Но читать и понимать буду позже.
Меня и так уже трясет от количества информациии

Добавлено через 6 минут
Видите, вы говорите про случайные ошибки в грамматике, а я, тем временем, выделяю текст TRam_, как код С++.
Как по Фрейду.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
30.07.2018, 18:49
Цитата Сообщение от _stanislav Посмотреть сообщение
Получается, что само имя Pair de facto не используется нигде, кроме как при объявлении структуры и в typedef. Так не проще ли его вообще выкинуть и использовать typedef с анонимной структурой
Я выше ссылку дал, там описывается что к чему.
0
30.07.2018, 18:49

Не по теме:

Цитата Сообщение от Predator79 Посмотреть сообщение
Как по Фрейду
По логике нужно было выделять это
Assembler
1
ассемблером
8-)

0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
30.07.2018, 18:52
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ну и что? Croessmah, вы написали
в ответ на моё
Я отвечал не на это, а на это:
Цитата Сообщение от IGPIGP Посмотреть сообщение
Жесть. Так я уже давно не ошибался надо было
и даже специально выделил жирным шрифтом слова "Обявление" и "тольуо". И высказывание было к тому, что в посте с исправлением ошибок имеются ошибки - нужно больше отдыхать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.07.2018, 18:52

typedef struct + TXT
Такое вот задание.. есть TXT файл, пропарсить смогу сам, а дальше не знаю что делать, допустим, считали данные : Строка :...

Для чего typedef struct
Часто в &quot;профессиональном&quot; коде вижу - typedef struct MyStruct { // ... } MyStuct; даёт ли это какие то преимущества перед...

Волшебные вещи с typedef struct
у меня сейчас мозг взорвется не пойму в чем ошибка,где я не так делаю? #include &lt;stdio.h&gt; #include &lt;locale.h&gt; #include...

Программа через структуру typedef struct
Люди помогите если несложно с программой, задание таково: 1.С клавиатуры вводятся пункты структуры - Студент: Матрикул - номер...

Typedef void F(); typedef для типа функции через идентификатор
Здравствуйте цитата из typedef MSDN в интернете мне удалось нарыть только один конкретный пример: class A { typedef void F(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru