Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 415

Разбор кода с указателями на структуры

04.03.2021, 21:08. Показов 1335. Ответов 6

Студворк — интернет-сервис помощи студентам
Структуры для кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
typedef struct _DRIVERSTATUS
{
  UCHAR bDriverError;
  UCHAR bIDEError;
  UCHAR bReserved[2];
  ULONG dwReserved[2];
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;
 
typedef struct _SENDCMDOUTPARAMS
{
  ULONG        cBufferSize;
  DRIVERSTATUS DriverStatus;
  UCHAR        bBuffer[1];
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;
 
typedef struct _SRB_IO_CONTROL
{
  ULONG HeaderLength;
  UCHAR Signature[8];
  ULONG Timeout;
  ULONG ControlCode;
  ULONG ReturnCode;
  ULONG Length;
} SRB_IO_CONTROL, *PSRB_IO_CONTROL;
 
typedef struct _SENDCMDINPARAMS
{
  ULONG   cBufferSize;
  IDEREGS irDriveRegs;
  UCHAR   bDriveNumber;
  UCHAR   bReserved[3];
  ULONG   dwReserved[4];
  UCHAR   bBuffer[1];
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;
Разбираемый код:
C++
1
2
3
char buffer[sizeof(SRB_IO_CONTROL) + sizeof(SENDCMDOUTPARAMS) + 512];
SRB_IO_CONTROL *p = (SRB_IO_CONTROL *) buffer;
SENDCMDINPARAMS *pin = (SENDCMDINPARAMS *)(buffer + sizeof(SRB_IO_CONTROL));
1-я строка - объявление массива символов.
2-я строка - объявление указателя *p структурного типа SRB_IO_CONTROL или указателя *p на структуру SRB_IO_CONTROL ?
Что присваивается указателю *p ? На одном ресурсе я вычитал, что присваивается адрес, но адрес чего? Или не адрес?
3-я строка - похоже на 2-ю строку, но ... что значит к массиву символов 'buffer' добавляется размер структуры SRB_IO_CONTROL ?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.03.2021, 21:08
Ответы с готовыми решениями:

Разбор кода с++(структуры)
Помогите пожалуйста разобраться в коде на с++ Все , что идет после void не понимаю( #include <conio.h> #include...

Структуры с указателями
Ребят, не могу понять как сделать 2 структуры вместе, при этом я могу что то в них поменять, например, как здесь # include...

Структуры с указателями друг на друга
Нужно написать программу для создания динамической конструкции из элементов структуры 2х типов (см. схему). Однако для этого нужно...

6
 Аватар для Annemesski
2670 / 1333 / 479
Регистрация: 08.11.2016
Сообщений: 3,679
05.03.2021, 09:53
Лучший ответ Сообщение было отмечено Инженер_3 как решение

Решение

строка 1: объявление байтового буфера размером в сумму размеров структур SRB_IO_CONTROL и SENDCMDOUTPARAMS плюс хвост из 512 байт.
строка 2: определение указателя на структуру SRB_IO_CONTROL расположенную в начале буфера buffer, указателю *p присваивается адрес начала буфера buffer в котором предполагается хранение структуры SRB_IO_CONTROL.
строка 3: определение указателя на структуру SENDCMDINPARAMS расположенную в буфере buffer по адресу равному началу буфера плюс смещение на размер структуры SRB_IO_CONTROL.

Code
1
2
3
4
5
6
7
Буфер:
                                         ------------------------------------------------------
                                         | SRB_IO_CONTROL | SENDCMDOUTPARAMS | DATA(512 bytes |
                                         ------------------------------------------------------
указатель buffer типа (char *) ----------^                ^
указатель p типа (SRB_IO_CONTROL *) -----^                |
указатель pin типа (SENDCMDOUTPARAMS *) -------------------
2
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
05.03.2021, 10:16
раз уж находимся в разделе C++, не проще ли сразу создать нужную структуру? И никаких указателей не надо будет

C++
1
2
3
4
5
6
7
8
#pragma pack(push,1)
struct s_container
{
   SRB_IO_CONTROL m_io{};
   SENDCMDOUTPARAMS m_params{};
   char data[512]{};
};
#pragma pack(pop)
0
05.03.2021, 10:27

Не по теме:

Алексей1153, по типам видно же что в "лучших" традициях мелкомягких.
У них наверное до сих пор старый паровоз со стремными АПИ...

0
фрилансер
 Аватар для Алексей1153
6441 / 5635 / 1127
Регистрация: 11.10.2019
Сообщений: 14,981
05.03.2021, 10:29
SmallEvil, C++ прекрасно справляется в винапи )
0
Заблокирован
05.03.2021, 10:31
С++ да, человеческий мозг не всегда )
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 415
05.03.2021, 16:13  [ТС]
Annemesski, Большое спасибо - всё коротко и понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.03.2021, 16:13
Помогаю со студенческими работами здесь

Помогите разобратся с указателями на структуры и массивы.
Доброго всем времени суток! Собрал я себе LED куб 5*5*5 по схеме с радио кота, прошивка оттуда же. Все работает отлично. Захотелось...

Разбор структуры CStash
Здравствуйте! Читаю сейчас Философию С++ Б.Эккеля, и не могу разобраться со структурой CStash, которую он предложил для изучения, в...

Структуры - разбор упражнения
Прошу помочь с решением задачки и если не сложно объясните пожалуйста как вы то сделали. Есть 3 задачи (1 и 2 - я решил) - не могу решить...

Как правильно объявить две структуры с указателями друг на друга
В одном файле определены две структуры. typedef struct Tdata1 { int a; data2 *d; } data1; typedef struct Tdata2 { ...

Разбор структуры аудиоплеера vkontakte
Здравствуйте! Подскажите пожалуйста как сделать аудио плеер на подобии того что есть в контакте. Как сделать флеш плеер я знаю. Но как...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru