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

C++

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

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

27.10.2014, 00:47. Просмотров 2448. Ответов 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
30.10.2014, 14:32  [ТС] #31
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это очень интересно. Многое для Вас прояснится.
Зрелище в торрентах в разделы фильмов. А если тратить кучу времени на какие то исторические сводки о создании процессоров и т.п. отклоняющюю от темы информацию - то далеко не уйдёш. Мне надо по факту знать как стыкуется разрядность процессора, ОСи с выравниванием. На МСДН лишь написано что выравнивание зависит от разрядности, но каким боком - не написано, либо не в основной теме, потому я и спрашиваю источник либо конкретное знание которое поможет в реализации идеи.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
30.10.2014, 15:27 #32
Цитата Сообщение от Izual Посмотреть сообщение
Зрелище в торрентах в разделы фильмов.
Хоть я ни о каком зрелище не говорил, но вот туда Вам и нужно в таком случае.
Если Вам не интересна данная тема, то зачем вообще занимаетесь этим? Вся документация по платформе есть на сайте Intel. Но если Вы не знаете каких то базовых вещей, то она Вам вряд ли поможет.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
30.10.2014, 19:54  [ТС] #33
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вся документация по платформе есть на сайте Intel
Вопрос был об изменении выравнивания исходя из разрядности, в частности отношение ОС и процессора. ~ ~
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
30.10.2014, 20:06 #34
Цитата Сообщение от Izual Посмотреть сообщение
Вопрос был об изменении выравнивания исходя из разрядности, в частности отношение ОС и процессора. ~ ~
А Вы считаете, что это прихоть разработчиков ОС? ОС пишется под железную платформу, а не наоборот. Если x86 может прожить и без выравнивания ( вопрос стоит только в производительности ), то другие платформы именно требуют выравнивания.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
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] программно, и влияет ли это только на компьютере сборщике программы или/и на те что только пользуются)

Это довольно узкий вопрос, именно по этому нужна конкретика.
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 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] программно, и влияет ли это только на компьютере сборщике программы или/и на те что только пользуются)
Естественно, что это влияет на модуль, который был собран с этим ключом. И что значит программно? Это опция компиляции. При компиляции генерируется код согласно опциям. Вы можете сами высчитать выравнивание, если уверены в последовательности членов.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
31.10.2014, 17:26  [ТС] #37
Цитата Сообщение от Toshkarik Посмотреть сообщение
максимум это 4 байта для x86-32
Long и Double по 8 байтов.
Цитата Сообщение от Toshkarik Посмотреть сообщение
советуют размещать поля
Это не возможно, вы видимо не читали первый пост, я читаю структуры, описанные в стандартных WinApi и др. библиотеках. И тут дело не обойдётся только лишь обычными типами.(ну это к слову)
Цитата Сообщение от Toshkarik Посмотреть сообщение
что значит программно?
Функция есть такая, которая показала бы после компиляции эти параметры?
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы можете сами высчитать выравнивание, если уверены в последовательности членов.
Я и хочу это сделать, но ответов по нужным вопросам ещё нет для того чтобы полностью быть уверенным не то что в последовательности, а именно в выравнивании(относительно компилятора, процессора и т.п.).

И это, П.С. примеры по стандартному выравниванию мне не нужны, я уже понял как это работает, не зря я ссылку привёл на сайт, где это описано. Эх, как в стенку...
Цитата Сообщение от Toshkarik Посмотреть сообщение
Это зависит не от разрядности ОС, а от работы самого процессора.
Нужно это и подробнее, с источником. ~ ~
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 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, читать документацию по платформе.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
31.10.2014, 17:47  [ТС] #39
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вам на сайт Intel, читать документацию по платформе.
Первое: вы не дали доказательства того что именно от процессора зависит выравнивание, второе - по ОС тоже нет конкретного ответа, я же говорю(уже повторяюсь) мне источник нужен по самой инфе, которой нет в основном разделе по выравниванию на МСДН.
И вообще причём тут Intel, такое ощущение что по каждому процессору надо смотреть отдельно, а не по каким то характеристикам, которые отталкиваются от systeminfo.
Чую что ответов которые мне нужны я тут не найду...
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 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?

На этом я, пожалуй, закончу, так как не вижу никакого прогресса. Удачи!
1
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
31.10.2014, 19:40 #41
Цитата Сообщение от Izual Посмотреть сообщение
typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
}
смотрим
C++
1
2
3
4
5
6
7
8
9
10
  UINT     style;    // 4 байта  unsigned int
WNDPROC    lpfnWndProc;  // 4 байта  указатель
int     cbClsExtra;    // 4 байта  
int     cbWndExtra;   // 4 байта
HINSTANCE   hInstance;  // 4 байта  DWORD
HICON         hIcon;           // 4 байта  DWORD
HCURSOR     hCursor;      // 4 байта  DWORD
HBRUSH       hbrBackground;   // 4 байта DWORD
LPCSTR        lpszMenuName;    // 4 байта  указатель
LPCSTR       lpszClassName;    // 4 байта указатель
по крайней мере для 32битной Винды
насколько помню все структуры в винде приведены к 4 байтному шагу
иногда даже добавляют специальные поля reserved чтобы члены были выравнены,
тогда о чем спор?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
31.10.2014, 20:22 #42
ValeryS, вот если WNDPROC - указатель, то в x86_64 структура будет выровнена по 8 байтовой границе.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
31.10.2014, 21:23 #43
Цитата Сообщение от Toshkarik Посмотреть сообщение
то в x86_64 структура будет выровнена по 8 байтовой границе.
я же указал
Цитата Сообщение от ValeryS Посмотреть сообщение
по крайней мере для 32битной Винды
с 64 битной не работал
там может совсем другие структуры, платформа то другая и ОС по большому счету другая
Я так понял что ТС работает с 32 виндой
а у нее, я не могу припомнить не выравненные структуры
причем выравненные вручную
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
31.10.2014, 21:42 #44
Цитата Сообщение от ValeryS Посмотреть сообщение
там может совсем другие структуры
В каком плане структуры другие? Интерфейс тот же. Тогда можно говорить и о разности структур в версиях ОС, или даже между обновлениями, а не то что в разрядности.
0
ValeryS
Модератор
6654 / 5063 / 470
Регистрация: 14.02.2011
Сообщений: 16,930
31.10.2014, 22:23 #45
Цитата Сообщение от Toshkarik Посмотреть сообщение
В каком плане структуры другие? Интерфейс тот же.
Цитата Сообщение от Izual Посмотреть сообщение
tagWNDCLASSA
буковка A, ни о чем не говорит?
это структура типа ANSI, а для 64 может быть какая нибудь tagWNDCLASSW, или как то по другому, нет у меня 64 битной винды и компилятора, посему точное имя структуры назвать не могу
а потом при помощи предкомпилятора компилятор выбирает нужную структуру
это как MessageBoxA и MessageBoxW для ANSI и широкой строки, а для программиста просто MessageBox
он может даже не подозревать, что работает с разными функциями в зависимости от настроек
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2014, 22:23
Привет! Вот еще темы с ответами:

Приведение типов - 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...


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

Или воспользуйтесь поиском по форуму:
45
Yandex
Объявления
31.10.2014, 22:23
Ответ Создать тему
Опции темы

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