Форум программистов, компьютерный форум CyberForum.ru

Приведение к структуре - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 00:47     Приведение к структуре #1
Не могу понять как привести, к примеру 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, и т.п. очень усложняющей код мути)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2014, 00:47     Приведение к структуре
Посмотрите здесь:

Вопрос по структуре Visual C++
C++ Сортировка в структуре
Процесс в структуре C++
Ошибка в структуре C++
ошибка в структуре C++
Объявление в структуре C++
Структура в структуре C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1307 / 1188 / 109
Регистрация: 20.03.2009
Сообщений: 4,262
Записей в блоге: 11
27.10.2014, 01:15     Приведение к структуре #2
Izual, кто память будет выделять в приведенном примере?
Про приведение типов читай в Алёна C++: Приведение типов в C++
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 02:03  [ТС]     Приведение к структуре #3
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
память будет выделять
Это не суть, я просто показал небольшой набросок.
Мне сейчас хотя бы логику понять как вообще через указатель на структуру обращяться к членам структуры...
1. Как извлечь поля нужной структуры, имея только лишь название структуры.
2. Как использовать собственные переменные и указатели для манипуляций с структурами (ну и членами).
3. На сколько я видел в показанном вами блоге, один из юзеров написал смысл работы static cast, который был сделан через шаблон template, который я тоже использую (только немного в иных целях), но возможно этот же самый способ можно было бы использовать здесь.
П.С. наверно мне надо немного времени чтоб ясно понять все включающие в себя под-вопросы, авось сам что то найду, но это сложно лишь потому что у меня ещё маловато опыта, потому и прошу с примерами по данной теме, чтобы хоть какое то представление иметь о способе реализации.
Dmitriy_M
1307 / 1188 / 109
Регистрация: 20.03.2009
Сообщений: 4,262
Записей в блоге: 11
27.10.2014, 02:27     Приведение к структуре #4
Цитата Сообщение от Izual Посмотреть сообщение
через указатель на структуру обращяться к членам структуры...
для этого есть оператор ->
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 03:28  [ТС]     Приведение к структуре #5
Цитата Сообщение от 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/infoce...ef/cplr022.htm
Только не ясно, можно ли брать "не статические" члены класса\структуры... и вообще то ли это для перечисления и дальнейших действий относительно членов... (оч. сложно понять мне такое, только недавно с template начал разбираться)
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,818
27.10.2014, 08:41     Приведение к структуре #6
Izual, я правильно понял, что ты хочешь обращаться к членам структуры по индексу, так, как будто это массив?

Цитата Сообщение от Izual Посмотреть сообщение
Но тут явное указание члена ".code", вот в этом и загвоздка, я не знаю как член структуры "вычленить".
Или что значит "вычленить" в этой фразе?
В общем нужны пояснения от тебя. Т.к. пока не до конца ясно в чем именно у тебя проблема.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5534 / 2568 / 234
Регистрация: 01.11.2011
Сообщений: 6,345
Завершенные тесты: 1
27.10.2014, 09:58     Приведение к структуре #7
Цитата Сообщение от Izual Посмотреть сообщение
Но тут явное указание члена ".code", вот в этом и загвоздка, я не знаю как член структуры "вычленить".
Если известно устройство структуры, то можно вручную отсчитывать от начала каждой структуры требуемое количество байт.
Dmitriy_M
1307 / 1188 / 109
Регистрация: 20.03.2009
Сообщений: 4,262
Записей в блоге: 11
27.10.2014, 11:12     Приведение к структуре #8
SatanaXIII, тут вы порите чушь.
1 Примеры выравнивания структуры;
2 Простая структура данных
Во втором случае да же порядок расположения полей не гарантируется.
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
27.10.2014, 11:16     Приведение к структуре #9
чей то я не понял
C++
1
2
3
void * mp;
mp=&Mystruct;
a=(Mystruct*)mp->a;
в чем сложность?
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 18:33  [ТС]     Приведение к структуре #10
Цитата Сообщение от DrOffset Посмотреть сообщение
обращаться к членам структуры по индексу, так, как будто это массив
Ну это уже в финале, в идеале.
Цитата Сообщение от DrOffset Посмотреть сообщение
значит "вычленить"
Это значит что я не могу явно написать wcc.style, как обращение к члену, т.к. у меня просто нет ссылки на этот член. Т.е. я не хочу руками описывать этот процесс заполнения полей структуры, а хочу подвести к некому шаблону любую структуру, исходя из членов - задать собственные наименования(как вы заметили типа массива) (в виде ссылкок\указателей возможно), и далее уже работать с тем что получилось.

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

ValeryS, представьте что вы пишите не руками в cpp файле, а работаете в программе-форме, в которой у вас есть доступ только к тем данным, которые вы описали изначально в вашем коде. Так вот для того чтоб обратиться как вы показываете - надо описать все поля всех структур дабы их использовать... Я конешно и парсер могу написать, быстро некоторые файлы, содержащие структуры - перебрать, сделать отдельный файл cpp вида и кинуть туда весь функционал для работы с структурами, но это не способ решения...
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,818
27.10.2014, 18:56     Приведение к структуре #11
Цитата Сообщение от Izual Посмотреть сообщение
Это значит что я не могу явно написать wcc.style, как обращение к члену, т.к. у меня просто нет ссылки на этот член. Т.е. я не хочу руками описывать этот процесс заполнения полей структуры, а хочу подвести к некому шаблону любую структуру, исходя из членов - задать собственные наименования(как вы заметили типа массива) (в виде ссылкок\указателей возможно), и далее уже работать с тем что получилось.
Скажу кратко: без дополнительный метаинформации о данных это сделать не получится. Т.е. к каждой такой структуре должен идти еще набор метаданных, которые позволят организовать такую индексацию. Просто и "бесплатно" то, что ты хочешь в С++ не сделать. Сложность же организации этого (метаданных) будет превышать сложность решаемой задачи, а это уже плохо.
Массивы в С++ так хорошо работают потому, что размер каждого элемента одинаков, поэтому можно организовать индексацию, смещаяя указатель на фиксированное значение, равное значению размера элемента. Размер полей в структуре - разный, плюс выравнивание, про которое уже сказали. В общем случае нельзя сказать на какое значение нужно сместить указатель, чтобы получить следующее поле. Это и есть главная проблема этой затеи.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 18:56  [ТС]     Приведение к структуре #12
П.С. Вообще мне не понятно почему шаблон template нельзя использовать в обратном порядке "вычленения" членов какой либо структуры... Ведь создание структуры\класса исходя из этого : http://msdn.microsoft.com/ru-ru/libr...vs.110%29.aspx сделано было именно через шаблон... В инете то что я хочу называют reflection (вроде бы), и типа это невозможно в С++, однако сроки давности сообщений могут уже не совпадать с действительностью, т.к. много нового появляется в новых версиях C++.
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,818
27.10.2014, 19:00     Приведение к структуре #13
Цитата Сообщение от Izual Посмотреть сообщение
В инете то что я хочу называют reflection (вроде бы), и типа это невозможно в С++, однако сроки давности сообщений могут уже не совпадать с действительностью, т.к. много нового появляется в новых версиях C++.
Здесь ты прав и компилятор действительно мог бы поддерживать reflection на этапе компиляции, потому что у него есть вся информация о полях и выравнивании и т.п. Но в С++ этого нет до сих пор и неизвестно когда будет (имеется в виду нет доступа пользователя языка к этой информации через какой-либо синтаксис). Рекомендую ознакомиться с языком D (он похож на С++), который в этом плане гораздо более продвинут.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 19:17  [ТС]     Приведение к структуре #14
Цитата Сообщение от DrOffset Посмотреть сообщение
Рекомендую ознакомиться с языком D
Я пожалуй подожду пока выйдет язык "Я"

Цитата Сообщение от DrOffset Посмотреть сообщение
Размер полей в структуре - разный, плюс выравнивание
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит. (предполагают что происходит это из за приоритета компьютера к числам, кратным 4)
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
27.10.2014, 19:19     Приведение к структуре #15
Цитата Сообщение от 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;
вот и догадайся что это строка а не волшебное число
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 19:24  [ТС]     Приведение к структуре #16
Цитата Сообщение от ValeryS Посмотреть сообщение
а они известны?
Они есть в txt виде, т.к. тупо копия данных из файла winuser.h Это уже уберёт много заморочек..
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
27.10.2014, 19:27     Приведение к структуре #17
Цитата Сообщение от Izual Посмотреть сообщение
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит.
в зависимости от настроек компилятора
выравнивание может быть на 1 , отсутствие выравнивания
на 2
на 4
на 8
про большие не слышал
все дело в том что процессору удобней работать с адресами кратными его разрядности
поэтому 16 битные процессоры лучше работают с адресами выравненными на 2 (2 Байта 16 бит)
32 битные выравнивание на 4
64 битные выравнивание на 8
есть процессоры, это не Интел 80х86, которые вообще падают если данные не выравнены

Добавлено через 2 минуты
Цитата Сообщение от Izual Посмотреть сообщение
тупо копия данных из файла winuser.h
так компильни их в своей программе и тупо приводи
DrOffset
6786 / 3997 / 917
Регистрация: 30.01.2014
Сообщений: 6,818
27.10.2014, 19:38     Приведение к структуре #18
Цитата Сообщение от Izual Посмотреть сообщение
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит. (предполагают что происходит это из за приоритета компьютера к числам, кратным 4)
В принципе это возможно. Правда привяжешься к одному компилятору, но может быть для тебя этим возможно пренебречь. Прочитаешь свой txt, определишь метаданные на основе правил обеспечения выравнивания для данной платформы и компилятора. Потом будешь пользоваться этими данными для доступа к полям. Но, как я уже говорил, сложность этого решения превысит сложность непосредственной задачи, для которой ты это все затеял.
Ладно, убеждать я тебя ни в чем не буду, время, надеюсь, сделает это за меня Успехов.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 19:38  [ТС]     Приведение к структуре #19
Цитата Сообщение от ValeryS Посмотреть сообщение
так компильни их в своей программе и тупо приводи
Что ? Как ? Вы о чём ? Этот файл так и так компилится жЭ вроде, что то я не понимаю куда ты клониш.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2014, 19:43     Приведение к структуре
Еще ссылки по теме:

C++ Ошибка в структуре?
C++ Сортировка в структуре
Список в структуре C++
C++ Сортировка в структуре
C++ Структура в структуре

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6412 / 4878 / 448
Регистрация: 14.02.2011
Сообщений: 16,174
27.10.2014, 19:43     Приведение к структуре #20
Цитата Сообщение от Izual Посмотреть сообщение
что то я не понимаю куда ты клониш.
Я тоже
задачу толком объясни
Yandex
Объявления
27.10.2014, 19:43     Приведение к структуре
Ответ Создать тему
Опции темы

Текущее время: 00:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru