Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 19:48  [ТС]     Приведение к структуре #21
Цитата Сообщение от DrOffset Посмотреть сообщение
Правда привяжешься к одному компилятору
Почему же, если как сказал валера, взять характеристики процессора (предполагаю что дефалтные настройки компиляторов, т.к. я их не меняю и не знаю вообще что это, зависят именно от процессора) и создать алгоритм, на основе которого можно будет вычислять все эти "сдвиги"... Не думаю что это слишком сложно, просто надо будет описать кол-во байт, согласно каждому типу данных, либо как то брать их из type_id функции (может есть даже такое решение)...
Цитата Сообщение от DrOffset Посмотреть сообщение
сложность этого решения превысит сложность непосредственной задачи
Не соглашусь, я уже год мечтаю о создании собственного интерпритатора, маленькими шажочками большое дело можно сделать, а маленькими - чтоб запал не пропал) Вот недавно с функциями разобрался, не до конца, осталось тока с типом вызова(stdcall и др) покумекать, а так мне просто нравятся такие головоломки, чисто для собственного удовлетворения да и что нить путное может выйти из этого...

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
задачу толком объясни
Динамическое обращение к структурам и их членам. Создание шаблона для работы с стандартными структурами, описанными в основных библиотеках. (наверно так, хотя как это как то "демонически" выглядит в тексте)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitriy_M
1307 / 1188 / 109
Регистрация: 20.03.2009
Сообщений: 4,259
Записей в блоге: 11
27.10.2014, 20:02     Приведение к структуре #22
Рефлексии из коробки в C++ нет, но никто не говорит, что её нельзя добавить.
Универсальная метасистема на C++
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
27.10.2014, 20:51  [ТС]     Приведение к структуре #23
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Универсальная метасистема на C++ (http://habrahabr.ru/post/238237/)
Крутовато и замудрено, встраивать одно, второе, третье - в итоге получится не программа, а монстр. Я чудовищь не создаю)) Лучше уж алгоритм придумать (к сути которого мы уже в принципе подошли)... который будет работать в пределах С++..
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 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
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
28.10.2014, 12:41     Приведение к структуре #26
Izual, Да, под каждую, это сделано отнюдь не для оптимизации, а для того, чтобы можно было кроссплатформенно бегать по полям структуры. Можно написать генератор. Либо не кроссплатформенно бегать по смещениям в самой структуре не используя никакую метаинформацию...
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.10.2014, 12:52     Приведение к структуре #30
Izual, разрядность, в данном случае, это упрощение. Все зависит от архитектуры процессора. 32-битная ОС написанная для платформы x86 может работать на 64-битном процессоре x86 только потому, что этой архитектурой обеспечивается обратная совместимость. Почитайте об архитектуре процессоров, в частности о истории развития x86. Это очень интересно. Многое для Вас прояснится.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
30.10.2014, 14:32  [ТС]     Приведение к структуре #31
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это очень интересно. Многое для Вас прояснится.
Зрелище в торрентах в разделы фильмов. А если тратить кучу времени на какие то исторические сводки о создании процессоров и т.п. отклоняющюю от темы информацию - то далеко не уйдёш. Мне надо по факту знать как стыкуется разрядность процессора, ОСи с выравниванием. На МСДН лишь написано что выравнивание зависит от разрядности, но каким боком - не написано, либо не в основной теме, потому я и спрашиваю источник либо конкретное знание которое поможет в реализации идеи.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.10.2014, 15:27     Приведение к структуре #32
Цитата Сообщение от Izual Посмотреть сообщение
Зрелище в торрентах в разделы фильмов.
Хоть я ни о каком зрелище не говорил, но вот туда Вам и нужно в таком случае.
Если Вам не интересна данная тема, то зачем вообще занимаетесь этим? Вся документация по платформе есть на сайте Intel. Но если Вы не знаете каких то базовых вещей, то она Вам вряд ли поможет.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
30.10.2014, 19:54  [ТС]     Приведение к структуре #33
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вся документация по платформе есть на сайте Intel
Вопрос был об изменении выравнивания исходя из разрядности, в частности отношение ОС и процессора. ~ ~
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
30.10.2014, 20:06     Приведение к структуре #34
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос был об изменении выравнивания исходя из разрядности, в частности отношение ОС и процессора. ~ ~
А Вы считаете, что это прихоть разработчиков ОС? ОС пишется под железную платформу, а не наоборот. Если x86 может прожить и без выравнивания ( вопрос стоит только в производительности ), то другие платформы именно требуют выравнивания.
Izual
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
31.10.2014, 17:26  [ТС]     Приведение к структуре #37
Цитата Сообщение от Toshkarik Посмотреть сообщение
максимум это 4 байта для x86-32
Long и Double по 8 байтов.
Цитата Сообщение от Toshkarik Посмотреть сообщение
советуют размещать поля
Это не возможно, вы видимо не читали первый пост, я читаю структуры, описанные в стандартных WinApi и др. библиотеках. И тут дело не обойдётся только лишь обычными типами.(ну это к слову)
Цитата Сообщение от Toshkarik Посмотреть сообщение
что значит программно?
Функция есть такая, которая показала бы после компиляции эти параметры?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы можете сами высчитать выравнивание, если уверены в последовательности членов.
Я и хочу это сделать, но ответов по нужным вопросам ещё нет для того чтобы полностью быть уверенным не то что в последовательности, а именно в выравнивании(относительно компилятора, процессора и т.п.).

И это, П.С. примеры по стандартному выравниванию мне не нужны, я уже понял как это работает, не зря я ссылку привёл на сайт, где это описано. Эх, как в стенку...
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это зависит не от разрядности ОС, а от работы самого процессора.
Нужно это и подробнее, с источником. ~ ~
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
 Аватар для Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,525
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++ Ошибка в структуре?
C++ Сортировка в структуре
Список в структуре C++
C++ Сортировка в структуре
C++ Структура в структуре

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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     Приведение к структуре
Ответ Создать тему
Опции темы

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