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

C++

Войти
Регистрация
Восстановить пароль
 
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
#1

Замена экземпляра структуры для подачи в качестве аргумента - C++

02.02.2015, 20:09. Просмотров 389. Ответов 9
Метки нет (Все метки)

Интересует есть ли способ замены экземпляра структуры для подачи в функцию.
Т.е. если я создаю собственную структуру(естественно с другими именем), то можно ли ею подменить требуемую.

Пример: есть структура "WNDCLASS WndClass" (в WinApi), её экземпляр подаётся в качестве аргумента в функцию "RegisterClass(&WndClass)".
Так вот, допустим у меня есть собственная структура "MyStruct StructClass", с помощью указателей и т.п. я создам и заполню поля так, как это в оригинальной структуре "WNDCLASS", как её передать в функцию "RegisterClass".

Может если структурой нельзя, то может массивом или чем то ещё? Может можно обойти с помощью шаблона(template)?..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2015, 20:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Замена экземпляра структуры для подачи в качестве аргумента (C++):

Как не писать один и тот же код, для функции, принимающей разные типы данных в качестве аргумента - C++
Проблема такая: есть некая функция. Внутри нее происходят одни и теже вычисления, вне зависимости от типа входных данных. void...

Передача в новый поток в качестве аргумента string - C++
хелп:wall: Пытаюсь передать аргумент так: DWORD potoc(char * args) { const char * ta = static_cast <const char *> (args); } ...

Передача функции-члена в качестве аргумента (не через указатель) - C++
Привет! Озадачился такой проблемой - вот пример того, что нужно typedef void(class1::*method)(); void func (method) {}; func...

Указатель на метод класса в качестве аргумента метода класса - C++
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ в дополнительном классе. Вопрос: как...

как передать функции в качестве аргумента указатель на функцию описанной в другом классе? - C++ Builder
Есть два класса A и B в классе A есть две функции funcA_1 и funcA_2 в классе B - funcB в funcA_1 создается экземпляр класса B и...

Замена определённого символа в массиве структуры на пустой(пробел) - C++ Builder
Всем доброго времени суток! Требуется считать данные из файла в массив, а затем проверить на наличие символов "_", в случае обнаружения -...

9
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
02.02.2015, 21:53 #2
Izual, если правильно понял, то просто каст
C++
1
2
MyStruct StructClass;
RegisterClass(reinterpret_cast<WNDCLASS *>(&StructClass));
Добавлено через 2 минуты
Ну и ещё наверное могут быть проблемы с различным выравниванием...
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
02.02.2015, 22:28  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну и ещё наверное могут быть проблемы с различным выравниванием
Это всё будет естественно учтено.
Каст придётся писать статически (указывая явно имя структуры WNDCLASS), а можно ли без статического указания?..
И ещё сразу наводящий вопрос, т.к. я буду использовать Сишные функции через template, то может мне вообще не надо заморачиваться с приведением типа?.. Т.е. просто создать свой поинтер, выделить опр. кол-во памяти под его размер(столько же, сколько и оригинальная структура должна весить) ну и заполнить через указатели соотв. "типа" члены, но по факту просто ячейки памяти. Ну и просто передать этот указатель с типом void, ведь наверно? ему пофиг какой тип.. Главное чтоб порядок аргументов был..
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
02.02.2015, 22:40 #4
Цитата Сообщение от Izual Посмотреть сообщение
Каст придётся писать статически (указывая явно имя структуры WNDCLASS), а можно ли без статического указания?.
Да, таков С++, типы должны быть известны до компиляции
Цитата Сообщение от Izual Посмотреть сообщение
И ещё сразу наводящий вопрос, т.к. я буду использовать Сишные функции через template, то может мне вообще не надо заморачиваться с приведением типа?.. Т.е. просто создать свой поинтер, выделить опр. кол-во памяти под его размер(столько же, сколько и оригинальная структура должна весить) ну и заполнить через указатели соотв. "типа" члены, но по факту просто ячейки памяти. Ну и просто передать этот указатель с типом void, ведь наверно? ему пофиг какой тип.. Главное чтоб порядок аргументов был..
Можно конечно любой указатель передать, только в С++ нужен будет каст к соответствующему типу (здесь WNDCLASS *), в С не обязательно если будете void * в ф-ю передавать; только мне не особо понятно как это будете в "динамике разруливать" и зачем это нужно...
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
02.02.2015, 22:44  [ТС] #5
Цитата Сообщение от gray_fox Посмотреть сообщение
в "динамике разруливать" и зачем это нужно
Второе указывает на первое, а ответ на первый вопрос - парсинг самый обычный.
Смутило что вы сказали, что мол "в С++ нужно"... мне кажется что шаблон с указателем на функцию позволит мне это сделать. Ладно, в общем спасибо за ответ, буду тестировать через обычные void pointers, а там уж видно будет что получится из этого.
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
02.02.2015, 22:53 #6
Цитата Сообщение от Izual Посмотреть сообщение
Смутило что вы сказали, что мол "в С++ нужно"...
Если про передачу указателей как параметр ф-ии, то это я о том, что в С void * кастуется неявно в любому указателю (в не последнюю очередь потому что нет типизированного new, как в С++), в то время как в С++ - нет.
0
Убежденный
Ушел с форума
Эксперт С++
15786 / 7223 / 1138
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.02.2015, 23:05 #7
Можно унаследоваться от нужной структуры и добавить свои поля.
Так, например, может "наращиваться" OVERLAPPED при передаче в
I/O completion port: сначала идут стандартные поля, а потом свои.
1
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
02.02.2015, 23:39  [ТС] #8
Цитата Сообщение от gray_fox Посмотреть сообщение
типизированного new, как в С++
А это:
C++
1
2
void* ptr = operator new(size);
operator delete(ptr);
Цитата Сообщение от Убежденный Посмотреть сообщение
Можно унаследоваться от нужной структуры и добавить свои поля.
Это эквивалентно тому, что мне придётся статически писать имя нужной структуры(от которой пляшу), а это уже не динамика. Не подходит.
Буду делать через обычные pointers, только вот прежде чем начну это делать, ещё надо кучу всего написать...

Не по теме:

Блин, жалко что нет 10 рабов (с развитым интеллектом)

0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
02.02.2015, 23:46 #9
Цитата Сообщение от Izual Посмотреть сообщение
А это:
Наборот: void * -> T *
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,556
02.02.2015, 23:52  [ТС] #10
Цитата Сообщение от gray_fox Посмотреть сообщение
Наборот
Не суть, главное что можно выделить область памяти и там уже указателем распределить данные)
Да и это я за пол минуты нагуглил(т.к. раньше с таким не сталкивался), потому даже не вникал ещё в синтаксис...

Не по теме:

Спать хотел лечь, да полная луна в голову светила,.. насветила походу, опять беЗсонная ночь творчества...

0
02.02.2015, 23:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2015, 23:52
Привет! Вот еще темы с ответами:

Создать функцию, имеющую два аргумента и возвращающую в качестве аргумента число из отрезка [a,b] - C++
Создать функцию, которая будет иметь два целочисленных параметра a и b, и в качестве своего значения возвращать случайное целое число из...

Получить IPv4-адрес и использовать его в качестве аргумента для команды NETSH - PowerShell
Приветствую! Начну издалека. Недавно захотел настроить себе подключение по IPv6 через tunnelbroker, но вот незадача - мой интернет...

Как сделать, чтобы в качестве аргумента процедура принимала название для массива? - C#
Всем привет . Дана процедура ввода массива(Input). Нужно сделать чтобы в качестве аргумента процедура принимала название для массива. Чтобы...

Ввод десятичного числа в качестве аргумента для номера строки и столбца курсора - Assembler
Приветствую вас! Подскажите как в данном коде осуществить ввод двух десятичных чисел, которые далее нужно будет использовать в качестве...


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

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

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