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

C++

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

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

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

Ошибка в структуре - C++
#include &lt;iostream&gt; using namespace std; struct Fraction { int num; // числитель int denum; //знаминатель ...

Указатель в структуре - C++
Как можно работать дальше с Abool как с массивом, обращаясь к нему как к члену структуры, т. е. D.Abool? Когда программа доходит до этого...

Сортировка в структуре - C++
Нужно создать структуру, вбить туда инфу: имя, факультет, группа, пропусков. вывести список у кого больше пропусков (отсортировать пожалуй,...

Сортировка в структуре - C++
Нужно считать в структуру информацию из файла, и отсортировать по зарплате. В файле записана информацию: Имя, год рождения, и зарплата. Со...

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

Ошибка в структуре - C++
не пойму в чем ошибка,пожалуйста, помогите исправить. // 897.cpp: определяет точку входа для консольного приложения. // ...

Вопрос по структуре - Visual C++
Есть задание создать структуру по виду автотранспорта помогите пожалуйста

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
27.10.2014, 19:48  [ТС]     Приведение к структуре #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Правда привяжешься к одному компилятору
Почему же, если как сказал валера, взять характеристики процессора (предполагаю что дефалтные настройки компиляторов, т.к. я их не меняю и не знаю вообще что это, зависят именно от процессора) и создать алгоритм, на основе которого можно будет вычислять все эти "сдвиги"... Не думаю что это слишком сложно, просто надо будет описать кол-во байт, согласно каждому типу данных, либо как то брать их из type_id функции (может есть даже такое решение)...
Цитата Сообщение от DrOffset Посмотреть сообщение
сложность этого решения превысит сложность непосредственной задачи
Не соглашусь, я уже год мечтаю о создании собственного интерпритатора, маленькими шажочками большое дело можно сделать, а маленькими - чтоб запал не пропал) Вот недавно с функциями разобрался, не до конца, осталось тока с типом вызова(stdcall и др) покумекать, а так мне просто нравятся такие головоломки, чисто для собственного удовлетворения да и что нить путное может выйти из этого...

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
задачу толком объясни
Динамическое обращение к структурам и их членам. Создание шаблона для работы с стандартными структурами, описанными в основных библиотеках. (наверно так, хотя как это как то "демонически" выглядит в тексте)
Dmitriy_M
1340 / 1221 / 111
Регистрация: 20.03.2009
Сообщений: 4,367
Записей в блоге: 11
27.10.2014, 20:02     Приведение к структуре #22
Рефлексии из коробки в C++ нет, но никто не говорит, что её нельзя добавить.
Универсальная метасистема на C++
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
27.10.2014, 20:51  [ТС]     Приведение к структуре #23
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Универсальная метасистема на C++ (http://habrahabr.ru/post/238237/)
Крутовато и замудрено, встраивать одно, второе, третье - в итоге получится не программа, а монстр. Я чудовищь не создаю)) Лучше уж алгоритм придумать (к сути которого мы уже в принципе подошли)... который будет работать в пределах С++..
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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, дабы одним махом возвращяемая переменная была сразу использована в соответствии с типом...
Хехе, вот уж ни когда не знаеш где попадётся что то нужное на глаза)
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
28.10.2014, 12:41     Приведение к структуре #26
Izual, Да, под каждую, это сделано отнюдь не для оптимизации, а для того, чтобы можно было кроссплатформенно бегать по полям структуры. Можно написать генератор. Либо не кроссплатформенно бегать по смещениям в самой структуре не используя никакую метаинформацию...
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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, но не знаю как)
Ну и последнее - можно ли кодом(дефайном например) узнать каковы характеристики для выравнивания уже в самой программе ну и как это сделать.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 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 Посмотреть сообщение
Ну и последнее - можно ли кодом(дефайном например) узнать каковы характеристики для выравнивания уже в самой программе ну и как это сделать.
Что значит характеристики? Выравнивание зависит от расположения ( порядка ) полей структуры и их размера.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
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?
Теперь вопрос как использовать это относительно выравнивания?..
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
30.10.2014, 12:52     Приведение к структуре #30
Izual, разрядность, в данном случае, это упрощение. Все зависит от архитектуры процессора. 32-битная ОС написанная для платформы x86 может работать на 64-битном процессоре x86 только потому, что этой архитектурой обеспечивается обратная совместимость. Почитайте об архитектуре процессоров, в частности о истории развития x86. Это очень интересно. Многое для Вас прояснится.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
30.10.2014, 14:32  [ТС]     Приведение к структуре #31
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это очень интересно. Многое для Вас прояснится.
Зрелище в торрентах в разделы фильмов. А если тратить кучу времени на какие то исторические сводки о создании процессоров и т.п. отклоняющюю от темы информацию - то далеко не уйдёш. Мне надо по факту знать как стыкуется разрядность процессора, ОСи с выравниванием. На МСДН лишь написано что выравнивание зависит от разрядности, но каким боком - не написано, либо не в основной теме, потому я и спрашиваю источник либо конкретное знание которое поможет в реализации идеи.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
30.10.2014, 15:27     Приведение к структуре #32
Цитата Сообщение от Izual Посмотреть сообщение
Зрелище в торрентах в разделы фильмов.
Хоть я ни о каком зрелище не говорил, но вот туда Вам и нужно в таком случае.
Если Вам не интересна данная тема, то зачем вообще занимаетесь этим? Вся документация по платформе есть на сайте Intel. Но если Вы не знаете каких то базовых вещей, то она Вам вряд ли поможет.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
30.10.2014, 19:54  [ТС]     Приведение к структуре #33
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вся документация по платформе есть на сайте Intel
Вопрос был об изменении выравнивания исходя из разрядности, в частности отношение ОС и процессора. ~ ~
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
30.10.2014, 20:06     Приведение к структуре #34
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос был об изменении выравнивания исходя из разрядности, в частности отношение ОС и процессора. ~ ~
А Вы считаете, что это прихоть разработчиков ОС? ОС пишется под железную платформу, а не наоборот. Если x86 может прожить и без выравнивания ( вопрос стоит только в производительности ), то другие платформы именно требуют выравнивания.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
30.10.2014, 21:52  [ТС]     Приведение к структуре #35
Цитата Сообщение от Toshkarik Посмотреть сообщение
Если x86 может прожить и без выравнивания
Так вот и вопрос от чего зависит выравнивание относительно разрядности.
Тесты которые видно в ссылке, которую я в #27 посте прикрепил, сделаны как я понимаю на х86, выравнивается всё по трём закономерностям:
1. "0-член" - не выравнивается, т.к. находится на 0 позиции.
2. Каждый последующий член выравнивается на кратное sizeof(type_id) число.(если int-4, то: 4,8,12..)
3. Итоговое выравнивание структуры(после последнего члена) в соответствии с кратностью всей структуры к максимальному размеру членов структуры.(например максимальный был тип long, 8 байт, по нему будет выравниваться sizeof() самой структуры)
И вот теперь осталось не объяснённым пункт "Зависимость от разрядности системы". (ну и получение N от zp[N] программно, и влияет ли это только на компьютере сборщике программы или/и на те что только пользуются)

Это довольно узкий вопрос, именно по этому нужна конкретика.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 16:42     Приведение к структуре #36
Ну так понятно же, что естественные размеры машинных слов разные - разные границы этих слов в памяти. Тут нужно знать, как работает процессор с памятью, как он загружает данные из памяти в регистры. Нет тут никакого узкого вопроса. Сама тема достаточно обширная. Так же еще затрагиваются и другие темы. Это зависит не от разрядности ОС, а от работы самого процессора.

Цитата Сообщение от Izual Посмотреть сообщение
1. "0-член" - не выравнивается, т.к. находится на 0 позиции.
Это относительно начала структуры.

Выравнивание в x86 нужно для простых типов. Байт, слово, двойное слово и учетверенное слово ( в x86-64 ). ( В C++ это обычно char, short, int, long long ( и long в случае linux x86-64 ), ну и указатели ). Начало структуры выравнивается по самому большому слову, которое в ней присутствует. То есть максимум это 4 байта для x86-32 и 8 байт для x86-64.

И так, если в структуре поля идут в таком порядке - char, short, int, long long, то структура будет выровнена по границе 8 байтового слова ( это справедливао для x86-64, в x86-32 выравнивание будет по 4 байтовому слову, хоть long long и занимает 8 байт ).
Структура будет занимать: 1 + 1 + 2 + 4 + 8 = 16.
При этом, если в структуре только char и long long то она так же будет занимать 16 байт.
Если порядок такой: char, long long, char, long long, то размер уже будет 32 байта. Поэтому советуют размещать поля в отсортированном по размеру порядке. Нисходящем или восходящем - без разницы.

Цитата Сообщение от Izual Посмотреть сообщение
(ну и получение N от zp[N] программно, и влияет ли это только на компьютере сборщике программы или/и на те что только пользуются)
Естественно, что это влияет на модуль, который был собран с этим ключом. И что значит программно? Это опция компиляции. При компиляции генерируется код согласно опциям. Вы можете сами высчитать выравнивание, если уверены в последовательности членов.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
31.10.2014, 17:26  [ТС]     Приведение к структуре #37
Цитата Сообщение от Toshkarik Посмотреть сообщение
максимум это 4 байта для x86-32
Long и Double по 8 байтов.
Цитата Сообщение от Toshkarik Посмотреть сообщение
советуют размещать поля
Это не возможно, вы видимо не читали первый пост, я читаю структуры, описанные в стандартных WinApi и др. библиотеках. И тут дело не обойдётся только лишь обычными типами.(ну это к слову)
Цитата Сообщение от Toshkarik Посмотреть сообщение
что значит программно?
Функция есть такая, которая показала бы после компиляции эти параметры?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы можете сами высчитать выравнивание, если уверены в последовательности членов.
Я и хочу это сделать, но ответов по нужным вопросам ещё нет для того чтобы полностью быть уверенным не то что в последовательности, а именно в выравнивании(относительно компилятора, процессора и т.п.).

И это, П.С. примеры по стандартному выравниванию мне не нужны, я уже понял как это работает, не зря я ссылку привёл на сайт, где это описано. Эх, как в стенку...
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это зависит не от разрядности ОС, а от работы самого процессора.
Нужно это и подробнее, с источником. ~ ~
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 17:36     Приведение к структуре #38
Цитата Сообщение от Izual Посмотреть сообщение
Функция есть такая, которая показала бы после компиляции эти параметры?
Нет, конечно. Она не нужна.
Цитата Сообщение от Izual Посмотреть сообщение
Long и Double по 8 байтов.
Как я понимаю, Вы пишете под Win. В ней long - 4 байта. Что в 32 битной, что в 64. Double не является машинным словом. Если брать в расчет double, то да, будет выравнено по его размеру. long double в некоторых реализациях занимает 10 байт. В этом случае выравнивание будет по 16 байтовой границе.
Цитата Сообщение от Izual Посмотреть сообщение
Это не возможно, вы видимо не читали первый пост, я читаю структуры, описанные в стандартных WinApi и др. библиотеках. И тут дело не обойдётся только лишь обычными типами.(ну это к слову)
Я не говорил, что это Вам нужно. Я лишь привел это как следствие.
Цитата Сообщение от Izual Посмотреть сообщение
Нужно это и подробнее, с источником. ~ ~
Аналогично, "как в стенку". Вам на сайт Intel, читать документацию по платформе.
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
31.10.2014, 17:47  [ТС]     Приведение к структуре #39
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вам на сайт Intel, читать документацию по платформе.
Первое: вы не дали доказательства того что именно от процессора зависит выравнивание, второе - по ОС тоже нет конкретного ответа, я же говорю(уже повторяюсь) мне источник нужен по самой инфе, которой нет в основном разделе по выравниванию на МСДН.
И вообще причём тут Intel, такое ощущение что по каждому процессору надо смотреть отдельно, а не по каким то характеристикам, которые отталкиваются от systeminfo.
Чую что ответов которые мне нужны я тут не найду...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2014, 18:01     Приведение к структуре
Еще ссылки по теме:

Сортировка в структуре - C++
Надо отсоритровать структуру по параметру &quot;Телефон&quot; Листал форум, вроде все написано правильно, сортировку делаю &quot;пузырьком&quot;, но выводит...

Перечисление в структуре - C++
Здравствуйте! Я создала перечисление в структуре struct DCBSettings { enum ...

String в структуре - C++
Добрый вечер! Подскажите пожалуйста, почему компилятор видит ошибку в строке &quot;cin &gt;&gt; tablica.marka;&quot; следующего кода: #include...

Поиск в структуре - C++
Подскажите, пожалуйста, как сделать бинарный поиск в структуре?

Изображение в структуре - C++
Пишу Лабу, необходимо в структуре добавить фотографию, как это осуществить, приложение консольное.


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

Или воспользуйтесь поиском по форуму:
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 18:01     Приведение к структуре #40
Цитата Сообщение от Izual Посмотреть сообщение
И вообще причём тут Intel, такое ощущение что по каждому процессору надо смотреть отдельно, а не по каким то характеристикам, которые отталкиваются от systeminfo.
Естественно нужно смотреть по каждой платформе. От чего же еще. Я какое сообщение уже это пытаюсь донести до Вас. Компилятору приходится выравнивать из-за специфики работы процессора ( не какой то отдельной модели, а именно платформы ).
Цитата Сообщение от Izual Посмотреть сообщение
вы не дали доказательства того что именно от процессора зависит выравнивание
Какое здесь может быть доказательство, если Вы не знаете элементарных вещей? Я Вам советовал почитать об архитектуре процессоров еще несколько сообщений назад. Это и будет доказательством для Вас после хотя бы поверхностного изучения данной темы.
Если Вам уж так нужен msdn, то вот http://msdn.microsoft.com/en-us/library/aa290049.aspx . В частности раздел Why Is Alignment a Concern?

На этом я, пожалуй, закончу, так как не вижу никакого прогресса. Удачи!
Yandex
Объявления
31.10.2014, 18:01     Приведение к структуре
Ответ Создать тему
Опции темы

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