С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/35: Рейтинг темы: голосов - 35, средняя оценка - 4.69
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Приведение к структуре

27.10.2014, 00:47. Показов 7842. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу понять как привести, к примеру void* переменную, к структуре. И так же интересует как использовать приведённые перменный, дабы их передать в нужные функции.
К примеру базовая структура в WinAPi(из winuser.h):
C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef struct tagWNDCLASSA {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
} WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;
И так обычно это используется так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
    WNDCLASS Wcc;
    Wcc.style=CS_HREDRAW | CS_VREDRAW;
    Wcc.lpfnWndProc=ChildWndProc;
    Wcc.cbClsExtra=0;
    Wcc.cbWndExtra=0;
    Wcc.hInstance=hInst;
    Wcc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    Wcc.hCursor=LoadCursor(NULL,IDC_ARROW);
    Wcc.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW+1);
    Wcc.lpszMenuName=NULL;
    Wcc.lpszClassName="child";
int result = RegisterClass(&Wcc);
Мне нужно, исходя из того что я к примеру зная типы аргументов структуры задавал бы их значения через собственные перменные, созданный union/void*...
Примерно я хотел бы что у меня получилось где то так:
C++
1
2
3
4
void *v[10]; //инициализация переменных
(WNDCLASS)v[0] //как то привести к типу структуры... наверно через какой то <cast>, правда пока не знаю какой..
//далее надо задать поля, учитывая что v[0] - это указатель на структуру, а v[1-9] - это сами члены(которые тоже приведу)
RegisterClass(&v[0]); //как то передать указатель..
Пока совсем не понимаю как это сделать, подскажите в какую сторону рыть.(только большая просьба без MFC, и т.п. очень усложняющей код мути)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.10.2014, 00:47
Ответы с готовыми решениями:

Переменное кол-во членов в структуре. Возможно ли?
Суть задачи - создать &quot;хранилище данных&quot;, которое может изменять как свои члены ( по типу, например была 1-ая колонка char типов, а стало...

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

Приведение подобных слагаемых в алгебраических выражениях
Нужно написать программу приведения подобных, например: вводим 2х-2y+4x-4yz и должны получить 6x-2y-4yz. Помогите пожалуйста, с чего...

48
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
27.10.2014, 01:15
Izual, кто память будет выделять в приведенном примере?
Про приведение типов читай в Алёна C++: Приведение типов в C++
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 02:03  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
память будет выделять
Это не суть, я просто показал небольшой набросок.
Мне сейчас хотя бы логику понять как вообще через указатель на структуру обращяться к членам структуры...
1. Как извлечь поля нужной структуры, имея только лишь название структуры.
2. Как использовать собственные переменные и указатели для манипуляций с структурами (ну и членами).
3. На сколько я видел в показанном вами блоге, один из юзеров написал смысл работы static cast, который был сделан через шаблон template, который я тоже использую (только немного в иных целях), но возможно этот же самый способ можно было бы использовать здесь.
П.С. наверно мне надо немного времени чтоб ясно понять все включающие в себя под-вопросы, авось сам что то найду, но это сложно лишь потому что у меня ещё маловато опыта, потому и прошу с примерами по данной теме, чтобы хоть какое то представление иметь о способе реализации.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
27.10.2014, 02:27
Цитата Сообщение от Izual Посмотреть сообщение
через указатель на структуру обращяться к членам структуры...
для этого есть оператор ->
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 03:28  [ТС]
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
оператор ->
Мне кажется что это просто один из вариантов обращения к члену.
Я недавно разбирал эту стрелочку...
C++
1
2
3
4
5
6
// это c стрелочкой
if(((LPNMHDR)lParam)->code == NM_CUSTOMDRAW)
// это без стрелочки
NMHDR *nmptr;
nmptr=(LPNMHDR)lParam;
if((*nmptr).code == NM_CUSTOMDRAW)
Но тут явное указание члена ".code", вот в этом и загвоздка, я не знаю как член структуры "вычленить".
Даже если я получу указатель на структуру и присвою его какой то переменной, то как мне члены структуры взять и использовать?

Добавлено через 33 минуты
Наткнулся тут на такое: http://publib.boulder.ibm.com/... plr022.htm
Только не ясно, можно ли брать "не статические" члены класса\структуры... и вообще то ли это для перечисления и дальнейших действий относительно членов... (оч. сложно понять мне такое, только недавно с template начал разбираться)
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.10.2014, 08:41
Izual, я правильно понял, что ты хочешь обращаться к членам структуры по индексу, так, как будто это массив?

Цитата Сообщение от Izual Посмотреть сообщение
Но тут явное указание члена ".code", вот в этом и загвоздка, я не знаю как член структуры "вычленить".
Или что значит "вычленить" в этой фразе?
В общем нужны пояснения от тебя. Т.к. пока не до конца ясно в чем именно у тебя проблема.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
27.10.2014, 09:58
Цитата Сообщение от Izual Посмотреть сообщение
Но тут явное указание члена ".code", вот в этом и загвоздка, я не знаю как член структуры "вычленить".
Если известно устройство структуры, то можно вручную отсчитывать от начала каждой структуры требуемое количество байт.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
27.10.2014, 11:12
SatanaXIII, тут вы порите чушь.
1 Примеры выравнивания структуры;
2 Простая структура данных
Во втором случае да же порядок расположения полей не гарантируется.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
27.10.2014, 11:16
чей то я не понял
C++
1
2
3
void * mp;
mp=&Mystruct;
a=(Mystruct*)mp->a;
в чем сложность?
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 18:33  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
обращаться к членам структуры по индексу, так, как будто это массив
Ну это уже в финале, в идеале.
Цитата Сообщение от DrOffset Посмотреть сообщение
значит "вычленить"
Это значит что я не могу явно написать wcc.style, как обращение к члену, т.к. у меня просто нет ссылки на этот член. Т.е. я не хочу руками описывать этот процесс заполнения полей структуры, а хочу подвести к некому шаблону любую структуру, исходя из членов - задать собственные наименования(как вы заметили типа массива) (в виде ссылкок\указателей возможно), и далее уже работать с тем что получилось.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
Если известно устройство структуры
Известно, в txt виде, а значит и кол-во и порядок байт, ну согласно файлам типа winuser.h
Тоже думал об этом, только потом тоже наткнулся на "выравнивание структуры", пример которого привёл дима, и пришёл в тупик.

ValeryS, представьте что вы пишите не руками в cpp файле, а работаете в программе-форме, в которой у вас есть доступ только к тем данным, которые вы описали изначально в вашем коде. Так вот для того чтоб обратиться как вы показываете - надо описать все поля всех структур дабы их использовать... Я конешно и парсер могу написать, быстро некоторые файлы, содержащие структуры - перебрать, сделать отдельный файл cpp вида и кинуть туда весь функционал для работы с структурами, но это не способ решения...
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.10.2014, 18:56
Цитата Сообщение от Izual Посмотреть сообщение
Это значит что я не могу явно написать wcc.style, как обращение к члену, т.к. у меня просто нет ссылки на этот член. Т.е. я не хочу руками описывать этот процесс заполнения полей структуры, а хочу подвести к некому шаблону любую структуру, исходя из членов - задать собственные наименования(как вы заметили типа массива) (в виде ссылкок\указателей возможно), и далее уже работать с тем что получилось.
Скажу кратко: без дополнительный метаинформации о данных это сделать не получится. Т.е. к каждой такой структуре должен идти еще набор метаданных, которые позволят организовать такую индексацию. Просто и "бесплатно" то, что ты хочешь в С++ не сделать. Сложность же организации этого (метаданных) будет превышать сложность решаемой задачи, а это уже плохо.
Массивы в С++ так хорошо работают потому, что размер каждого элемента одинаков, поэтому можно организовать индексацию, смещаяя указатель на фиксированное значение, равное значению размера элемента. Размер полей в структуре - разный, плюс выравнивание, про которое уже сказали. В общем случае нельзя сказать на какое значение нужно сместить указатель, чтобы получить следующее поле. Это и есть главная проблема этой затеи.
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 18:56  [ТС]
П.С. Вообще мне не понятно почему шаблон template нельзя использовать в обратном порядке "вычленения" членов какой либо структуры... Ведь создание структуры\класса исходя из этого : http://msdn.microsoft.com/ru-r... 10%29.aspx сделано было именно через шаблон... В инете то что я хочу называют reflection (вроде бы), и типа это невозможно в С++, однако сроки давности сообщений могут уже не совпадать с действительностью, т.к. много нового появляется в новых версиях C++.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.10.2014, 19:00
Цитата Сообщение от Izual Посмотреть сообщение
В инете то что я хочу называют reflection (вроде бы), и типа это невозможно в С++, однако сроки давности сообщений могут уже не совпадать с действительностью, т.к. много нового появляется в новых версиях C++.
Здесь ты прав и компилятор действительно мог бы поддерживать reflection на этапе компиляции, потому что у него есть вся информация о полях и выравнивании и т.п. Но в С++ этого нет до сих пор и неизвестно когда будет (имеется в виду нет доступа пользователя языка к этой информации через какой-либо синтаксис). Рекомендую ознакомиться с языком D (он похож на С++), который в этом плане гораздо более продвинут.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 19:17  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Рекомендую ознакомиться с языком D
Я пожалуй подожду пока выйдет язык "Я"

Цитата Сообщение от DrOffset Посмотреть сообщение
Размер полей в структуре - разный, плюс выравнивание
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит. (предполагают что происходит это из за приоритета компьютера к числам, кратным 4)
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
27.10.2014, 19:19
Цитата Сообщение от Izual Посмотреть сообщение
надо описать все поля всех структур дабы их использовать...
а они известны?
по крайней мере я могу сказать как делаю это в IDE
как только вижу обращение по смещению завожу структуру, пока фиктивную
допустим 20 байт
потом смотрю кто куда обращается
допустим по смешению 0 записывается байт
значит первый тип char правим( вс мысле ничего не правим он у нас и так байт)
по смещению 4 записалось двойное слово( значит там int,знаковый или беззнаковый пока не известно,или float)
потом анализирую кто как с этими числами общается и вывожу тип
по смещениям 1 2 3 вообще не было обращений
с большой долей вероятности можно сказать что это поля выравнивания
тогда структура примет вид примерно такой
C++
1
2
3
4
5
struct 
{
char a;
int b;
}
но и тут возможны заморочки
например
char c[4];
оптимизатор вполне может поменять на int
строку "123" которую мы записываем в массив он может вполне сконвертировать так
Assembler
1
2
mov eax, 00333231h;
mov [ebx],eax;
вот и догадайся что это строка а не волшебное число
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 19:24  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а они известны?
Они есть в txt виде, т.к. тупо копия данных из файла winuser.h Это уже уберёт много заморочек..
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
27.10.2014, 19:27
Цитата Сообщение от Izual Посмотреть сообщение
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит.
в зависимости от настроек компилятора
выравнивание может быть на 1 , отсутствие выравнивания
на 2
на 4
на 8
про большие не слышал
все дело в том что процессору удобней работать с адресами кратными его разрядности
поэтому 16 битные процессоры лучше работают с адресами выравненными на 2 (2 Байта 16 бит)
32 битные выравнивание на 4
64 битные выравнивание на 8
есть процессоры, это не Интел 80х86, которые вообще падают если данные не выравнены

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
тупо копия данных из файла winuser.h
так компильни их в своей программе и тупо приводи
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
27.10.2014, 19:38
Цитата Сообщение от Izual Посмотреть сообщение
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит. (предполагают что происходит это из за приоритета компьютера к числам, кратным 4)
В принципе это возможно. Правда привяжешься к одному компилятору, но может быть для тебя этим возможно пренебречь. Прочитаешь свой txt, определишь метаданные на основе правил обеспечения выравнивания для данной платформы и компилятора. Потом будешь пользоваться этими данными для доступа к полям. Но, как я уже говорил, сложность этого решения превысит сложность непосредственной задачи, для которой ты это все затеял.
Ладно, убеждать я тебя ни в чем не буду, время, надеюсь, сделает это за меня Успехов.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.10.2014, 19:38  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
так компильни их в своей программе и тупо приводи
Что ? Как ? Вы о чём ? Этот файл так и так компилится жЭ вроде, что то я не понимаю куда ты клониш.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,855
27.10.2014, 19:43
Цитата Сообщение от Izual Посмотреть сообщение
что то я не понимаю куда ты клониш.
Я тоже
задачу толком объясни
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2014, 19:43
Помогаю со студенческими работами здесь

Мусорное значение в динамическом массиве в структуре. Что я делаю не так?
Здравствуйте! Делаю вычисление факториала от 21 до 30. Использую длинную арифметику. Произведение длинного и короткого чисел -...

Вопрос по структуре
Можно ли какие-то элементы структуры загнать в массив и как?? например: имя человека и его возраст, несколько человек, взять возраст...

Запись функции в структуре
Есть функция для роботы со структурой и она определена в самой структуре. Как правильно ее объявить в структуре, а определить за...

Доступ к перечислению в структуре
Приветствую всех. Создаю структуру примерно такого содержания: struct MyStruct { enum {One = 1, Two, Three, Four } Number; }; ...

Редактирование записи в структуре
Подскажите пожалуйста, вобщем в структуру записывается сумма взноса, при выборе пункта меню внести сумму, вводится число и поле в базе...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru