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

C++

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

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

27.10.2014, 00:47. Просмотров 2216. Ответов 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++
Есть задание создать структуру по виду автотранспорта помогите пожалуйста

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,628
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 чтобы члены были выравнены,
тогда о чем спор?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 20:22     Приведение к структуре #42
ValeryS, вот если WNDPROC - указатель, то в x86_64 структура будет выровнена по 8 байтовой границе.
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,628
31.10.2014, 21:23     Приведение к структуре #43
Цитата Сообщение от Toshkarik Посмотреть сообщение
то в x86_64 структура будет выровнена по 8 байтовой границе.
я же указал
Цитата Сообщение от ValeryS Посмотреть сообщение
по крайней мере для 32битной Винды
с 64 битной не работал
там может совсем другие структуры, платформа то другая и ОС по большому счету другая
Я так понял что ТС работает с 32 виндой
а у нее, я не могу припомнить не выравненные структуры
причем выравненные вручную
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 21:42     Приведение к структуре #44
Цитата Сообщение от ValeryS Посмотреть сообщение
там может совсем другие структуры
В каком плане структуры другие? Интерфейс тот же. Тогда можно говорить и о разности структур в версиях ОС, или даже между обновлениями, а не то что в разрядности.
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,628
31.10.2014, 22:23     Приведение к структуре #45
Цитата Сообщение от Toshkarik Посмотреть сообщение
В каком плане структуры другие? Интерфейс тот же.
Цитата Сообщение от Izual Посмотреть сообщение
tagWNDCLASSA
буковка A, ни о чем не говорит?
это структура типа ANSI, а для 64 может быть какая нибудь tagWNDCLASSW, или как то по другому, нет у меня 64 битной винды и компилятора, посему точное имя структуры назвать не могу
а потом при помощи предкомпилятора компилятор выбирает нужную структуру
это как MessageBoxA и MessageBoxW для ANSI и широкой строки, а для программиста просто MessageBox
он может даже не подозревать, что работает с разными функциями в зависимости от настроек
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 23:09     Приведение к структуре #46
ValeryS, ну зачем же за уши притягивать сюда кодировку? Ведь достаточно лишь открыть любой заголовок и посмотреть, что нет никаких особенных структур для x86_64 и нет ручного выравнивания. По крайней мере в gcc. Но не думаю, что он сильно отличается от последних студий.
ValeryS
Модератор
6534 / 5000 / 460
Регистрация: 14.02.2011
Сообщений: 16,628
31.10.2014, 23:19     Приведение к структуре #47
Цитата Сообщение от Toshkarik Посмотреть сообщение
ну зачем же за уши притягивать сюда кодировку?
затем что строки разный тип имеют
вот кусок из 2008
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct tagWNDCLASSW {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
#ifdef UNICODE
typedef WNDCLASSW WNDCLASS;
для юникоде
и
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
.......................
#else
typedef WNDCLASSA WNDCLASS;
для ANSI
а работаем с WNDCLASS
это в пределах одной разрядности
есть уверенность что для другой разрядности структура не переписана?
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
31.10.2014, 23:39     Приведение к структуре #48
Цитата Сообщение от ValeryS Посмотреть сообщение
для юникоде
Цитата Сообщение от ValeryS Посмотреть сообщение
для ANSI
Я это все знаю, но это совершенно никак не относится к теме.

Цитата Сообщение от ValeryS Посмотреть сообщение
есть уверенность что для другой разрядности структура не переписана?
Есть, конечно. Я же говорил, что достаточно посмотреть в заголовок. Для проверки можете посмотреть
C++
1
std::cout << typeid( WNDCLASS ).name() << std::endl;
для 32 и 64 битного приложения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2014, 23:48     Приведение к структуре
Еще ссылки по теме:

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
31.10.2014, 23:48  [ТС]     Приведение к структуре #49
Цитата Сообщение от ValeryS Посмотреть сообщение
это как MessageBoxA и MessageBoxW для ANSI и широкой строки, а для программиста просто MessageBox
Кэп.

Цитата Сообщение от ValeryS Посмотреть сообщение
есть уверенность что для другой разрядности структура не переписана?
Как она может быть переписана, если файл winuser.h один для всех?..
Yandex
Объявления
31.10.2014, 23:48     Приведение к структуре
Ответ Создать тему
Опции темы

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