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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
#1

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

27.10.2014, 00:47. Просмотров 2486. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2014, 00:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Приведение к структуре (C++):

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

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

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

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

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

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

48
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
27.10.2014, 19:24  [ТС] #16
Цитата Сообщение от ValeryS Посмотреть сообщение
а они известны?
Они есть в txt виде, т.к. тупо копия данных из файла winuser.h Это уже уберёт много заморочек..
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,078
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
так компильни их в своей программе и тупо приводи
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
27.10.2014, 19:38 #18
Цитата Сообщение от Izual Посмотреть сообщение
В принципе надо просто разобраться как это выравнивание происходит, чего я пока что не догоняю, т.к. комменты к рисункам на MSDN какие то корявые и не понятно где, когда, почему и на сколько это выравнивание происходит. (предполагают что происходит это из за приоритета компьютера к числам, кратным 4)
В принципе это возможно. Правда привяжешься к одному компилятору, но может быть для тебя этим возможно пренебречь. Прочитаешь свой txt, определишь метаданные на основе правил обеспечения выравнивания для данной платформы и компилятора. Потом будешь пользоваться этими данными для доступа к полям. Но, как я уже говорил, сложность этого решения превысит сложность непосредственной задачи, для которой ты это все затеял.
Ладно, убеждать я тебя ни в чем не буду, время, надеюсь, сделает это за меня Успехов.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
27.10.2014, 19:38  [ТС] #19
Цитата Сообщение от ValeryS Посмотреть сообщение
так компильни их в своей программе и тупо приводи
Что ? Как ? Вы о чём ? Этот файл так и так компилится жЭ вроде, что то я не понимаю куда ты клониш.
0
ValeryS
Модератор
6679 / 5088 / 475
Регистрация: 14.02.2011
Сообщений: 17,078
27.10.2014, 19:43 #20
Цитата Сообщение от Izual Посмотреть сообщение
что то я не понимаю куда ты клониш.
Я тоже
задачу толком объясни
1
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
27.10.2014, 19:48  [ТС] #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Правда привяжешься к одному компилятору
Почему же, если как сказал валера, взять характеристики процессора (предполагаю что дефалтные настройки компиляторов, т.к. я их не меняю и не знаю вообще что это, зависят именно от процессора) и создать алгоритм, на основе которого можно будет вычислять все эти "сдвиги"... Не думаю что это слишком сложно, просто надо будет описать кол-во байт, согласно каждому типу данных, либо как то брать их из type_id функции (может есть даже такое решение)...
Цитата Сообщение от DrOffset Посмотреть сообщение
сложность этого решения превысит сложность непосредственной задачи
Не соглашусь, я уже год мечтаю о создании собственного интерпритатора, маленькими шажочками большое дело можно сделать, а маленькими - чтоб запал не пропал) Вот недавно с функциями разобрался, не до конца, осталось тока с типом вызова(stdcall и др) покумекать, а так мне просто нравятся такие головоломки, чисто для собственного удовлетворения да и что нить путное может выйти из этого...

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
задачу толком объясни
Динамическое обращение к структурам и их членам. Создание шаблона для работы с стандартными структурами, описанными в основных библиотеках. (наверно так, хотя как это как то "демонически" выглядит в тексте)
0
Dmitriy_M
1357 / 1240 / 114
Регистрация: 20.03.2009
Сообщений: 4,441
Записей в блоге: 11
27.10.2014, 20:02 #22
Рефлексии из коробки в C++ нет, но никто не говорит, что её нельзя добавить.
Универсальная метасистема на C++
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
27.10.2014, 20:51  [ТС] #23
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Универсальная метасистема на C++ (http://habrahabr.ru/post/238237/)
Крутовато и замудрено, встраивать одно, второе, третье - в итоге получится не программа, а монстр. Я чудовищь не создаю)) Лучше уж алгоритм придумать (к сути которого мы уже в принципе подошли)... который будет работать в пределах С++..
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
28.10.2014, 11:31 #24
Можно поизвращаться через boost::fusion. Суть: adapt_struct превращает структуру в fusion-sequence, по которой можно бегать итераторами.

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
35
36
37
38
struct A
{
   int ivalue;
   double dvalue;
   std::string svalue;
};
 
BOOST_FUSION_ADAPT_STRUCT(
      A,
      (int, ivalue)
      (double, dvalue)
      (std::string, svalue)
)
 
struct assigner
{
public:
   assigner(void** pars) :
      counter(0), params(pars)
   {
   }
   template<typename T>
   void operator () (T& t) const
   {
      t = *static_cast<T*>(*(params + counter));
      ++counter;
   }
private:
   mutable int counter;
   void** params;
};
 
A create_from_params(void* params[])
{
   A object;
   boost::fusion::for_each(object, assigner(params));
   return object;
}
Полный пример: http://coliru.stacked-crooked.com/a/3dc0adcc2766fcd1
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
28.10.2014, 11:45  [ТС] #25
ForEveR, это чё мне под каждую структуру(а их даже в одном winuser сотня наберётся) надо писать дубликат типа BOOST_FUSION_ADAPT_STRUCT ? Это не оптимизация, а хрень на постном масле..

Добавлено через 5 минут
Гыгы, зато я нашёл видимо пример как оптимизировать конструкцию в структуре... было:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool b;
        int i;
        float f;
        operator bool & ()
        {
            return b;
        }
        operator int & ()
        {
            return i;
        }
        operator float & ()
        {
            return f;
        }
И походу, я могу написать в свою стрктуру шаблон template, дабы одним махом возвращяемая переменная была сразу использована в соответствии с типом...
Хехе, вот уж ни когда не знаеш где попадётся что то нужное на глаза)
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
28.10.2014, 12:41 #26
Izual, Да, под каждую, это сделано отнюдь не для оптимизации, а для того, чтобы можно было кроссплатформенно бегать по полям структуры. Можно написать генератор. Либо не кроссплатформенно бегать по смещениям в самой структуре не используя никакую метаинформацию...
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
29.10.2014, 20:50  [ТС] #27
Нашёл отличное описание с примерами по теме выравнивания : http://precious-cpp.blogspot.ru/2010/09/blog-post.html

Теперь назрел вопрос. Тут сказали что выравнивание зависит от процессора, это не совсем мне понятно... Если бы сказали что зависимость идёт от разрядности ОС, то я бы понял, т.к. (если я прав) в 32 разрядной ОС int занимает 4 байта, а в 64 разрядной - 8 байт.
Ещё вопрос - как заполнить ячейки памяти? Грубо говоря я создал переменную соотв. экземпляру структуры: "WNDCLASS Wcc;", 0-поле приходится на "UINT style", как мне заполнить ячейки этого члена?(подозреваю что отталкиваясь от Wcc, но не знаю как)
Ну и последнее - можно ли кодом(дефайном например) узнать каковы характеристики для выравнивания уже в самой программе ну и как это сделать.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
29.10.2014, 23:45 #28
Цитата Сообщение от Izual Посмотреть сообщение
в 32 разрядной ОС int занимает 4 байта, а в 64 разрядной - 8 байт
Нет. И там и там практически во всех современных компиляторах sizeof( int ) == 4. В старых компиляторах он равен 2. В новом стандарте появился тип long long, который в современных компиляторах равен уже 8.

Тип long в win x64 равен 4, в linux x64 равен 8.

Добавлено через 4 минуты
Цитата Сообщение от Izual Посмотреть сообщение
Ну и последнее - можно ли кодом(дефайном например) узнать каковы характеристики для выравнивания уже в самой программе ну и как это сделать.
Что значит характеристики? Выравнивание зависит от расположения ( порядка ) полей структуры и их размера.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
30.10.2014, 12:32  [ТС] #29
Цитата Сообщение от Toshkarik Посмотреть сообщение
Что значит характеристики?
Я имею ввиду характеристики для выравнивания default или /zp[N]
текущего значения параметра упаковки (из #pragma pack или /Zp параметр компилятора).
только не в настройках, а программно.
Наткнулся на такое:
AP>ARM — (sizeof(int) = 4, sizeof(void *) = 4, alignment = 4) — 16 байт
AP>x86 (sizeof(int) = 4, sizeof(void *) = 4, alignment = 4) — 16 байт
AP>x86_64 (sizeof(int) = 4, sizeof(void *) = 8, alignment = 4) — 20 байт
AP>ia64 (sizeof(int) = 8, sizeof(void *) = 8, alignment = 8) — 32 байт
...

Добавлено через 9 часов 49 минут
Разрядность процессора, на сколько я понял это всего лишь "может или нет комп поддерживать ОС хх разрядность". Т.е. даже если процессор может поддерживать 64бита, но ОС установлена x86(32бита), то всё равно будет 32?
Теперь вопрос как использовать это относительно выравнивания?..
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
30.10.2014, 12:52 #30
Izual, разрядность, в данном случае, это упрощение. Все зависит от архитектуры процессора. 32-битная ОС написанная для платформы x86 может работать на 64-битном процессоре x86 только потому, что этой архитектурой обеспечивается обратная совместимость. Почитайте об архитектуре процессоров, в частности о истории развития x86. Это очень интересно. Многое для Вас прояснится.
0
30.10.2014, 12:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2014, 12:52
Привет! Вот еще темы с ответами:

Приведение типов - C++ Builder
Ребят, здравствуйте. Срочный вопрос. Заранее очень благодарен за помощь. У меня есть свой класс в c++ builder: class Hamal : public...

Приведение типов! - C++ Builder
Вот есть код! Я на 70% уверен что ошибка в соответствии типов! потому что при разных значениях sizeof(речь идет от разных типах), я получаю...

Приведение к void - C++ Builder
Приветствую. Как правильно в С++ привести данные к типу void? int Data; void *ptrData; ptrData = &amp;Data; // Так правильно? ...

Приведение типа - C++ Builder
Доброго! При подключение к серверу для каждого подключения создаю дата модуль void __fastcall TMAIN::IdTCPServer1Connect(TIdContext...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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