143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
1 | |
Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки02.01.2014, 19:05. Показов 3417. Ответов 21
Метки нет (Все метки)
В общем нужен динамический контейнер... который будет соединять разные переменные, разных типов в блоки.
Например есть поля Edit и Combo, после нажатия на кнопку, информация из заполненных полей будет помещяться в блок, расширение блоков нужно чтоб было примерно как в структуре, через операторы new и delete переопределять и копировать информацию. Проблема в том что структура, на сколько мне известно не может держать в себе переменное кол-во членов(которое изменяется во время работы программы), т.е. мне наприпер в одном блоке нужно 4 char массива по 20 символов и один 300 символов, ещё туда же 2 int переменные и HWND например. Как осуществить такую сложную динамику, и возможно ли объединять в структурные блоки переменные, которые могут позже удаляться например из блока или создавать новые в нутри одного блока (блок в моём понимании как строка из элементов ListView формы). Возможно ли работать с структурой в таком режиме, если да то как? И по возможности, прошу высказывать самые простые способы(т.е. например не такие сложные в синтаксисе как классы), идеальным для меня вариантом было бы использование структур(возможно вложенных или "дружественных")
0
|
02.01.2014, 19:05 | |
Ответы с готовыми решениями:
21
Статический контейнер для разных типов Показать разные блоки для разных устройств Разделение строки на переменные разных типов Объявить переменные разных типов в заголовке for |
Ушел с форума
|
|
02.01.2014, 19:14 | 2 |
Интересная задачка. Вряд ли можно на C++ такое сделать, статическая типизация ведь.
А как Вы видите себе использование такого контейнера ? Можно пример (псевдо)кода ?
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
02.01.2014, 19:21 | 3 |
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
02.01.2014, 19:40 [ТС] | 4 | |||||
Я думаю, изначально создать с десяток структур по каждому виду переменной в структуре, например для int:
Теперь далее, т.к. структура не поддерживает динамические массивы как члены, то в структуре, описывающюю какой либо объект, хранить число как кол-во членов в ней, а так же типы этих членов как "typedef enum" тип, на основе которого будет программа расфосовывать переменные. На основе этой структуры(объекта), создавать новую основанную на кол-ве членов и их типах, в этой структуре возможно переменные определять с помощью указателей(или даже просто числа, т.к. важен порядковый номер в базовой структуре, через который можно обратиться за данными) на переменные, хранящиеся в interegs и т.п. структурах. Однако это лишь часть моей задумки, динамическое кол-во членов всё равно не сможет поддерживаться структурой, придётся возможно создавать структуры основанные на числе его членов как статическом, например для объектов будет 3 структуры по 5, 10 и 20 членов(как один массив внутри структуры), иначе если брать слишком много - будет утечка памяти в итоге, т.к. если мне нужна структура на 3 эл., а статически массив выделяется в структуре на 20 эл-во, а они так и не будут использованны, другое дело от 2 до 7 эл-ов... Хотя мне так не нравится, код будет не красивым, желанной динамики не будет... П.С. кстати, а можно ли узнать сколько памяти съела структура?.. например "N=20; na=new integers[N];" Добавлено через 9 минут Вы думаете что есть толк от того что вы сказали? =) Простым языком пожалуйста, и если можно с примером реализации. И опять же, я не хотел использовать классы, но если вариантов больше нет, то придётся... Однако мне нужен пруф, что без классов и т.п. мути типа векторов, работу с которыми вразумить тяжело... Читабиельность кода падает в разы.
0
|
Ушел с форума
|
|
02.01.2014, 20:05 | 5 |
А не проще для таких задач использовать кодогенераторы ?
А вообще, мне сразу вспоминается тип VARIANT из COM: VARIANT structure http://msdn.microsoft.com/en-u... 85%29.aspx Наглядный пример структуры, которая умеет хранить множество типов... А вот советую еще заглянуть сюда, может убережет от написания очередного велосипеда: Boost.Any http://www.boost.org/doc/libs/... l/any.html
1
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
03.01.2014, 00:25 [ТС] | 6 |
VARIANT - Чтобы хранить одну структуру, смешанного типа ?
Вообще я использую VARIANT для работы с Auto Excel, но обрабатывать все возможные типы возвращяемые VARIANT функциями не считаю нужным... Да и проблема с типами меня мало тревожит, по сравнению с задачей по динамическому изменению кол-ва членов у объектов..
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
03.01.2014, 10:07 | 7 | |||||
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
03.01.2014, 14:12 [ТС] | 8 |
taras atavin, что это? Как это использовать?... Как это решает задачу с динамическим изменением кол-ва членов по ходу работы программы?
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
05.01.2014, 17:29 [ТС] | 9 | |||||
Раз пока что адекватного выхода из первоначального вопроса не найдено, то думаю что обойдусь отдельной переменной в структуре, которая будет отвечать за номер блока, если он нужен.
Кстати столкнулся с небольшими трудностями: 1. Типа HWND в VARIANT структуре нет, где то на задворках яндекса что то невнятное говорили на английском, мол HWND можно считать как Long тип, хотя не понятно как обращяться с этим тогда. 2. Как сделать Нное кол-во массивов структур(хотя написал видимо не корректно). Поясню:
3. Тут же ещё одна неприятность, даже если я добавлю новую переменную в структуру, исходя из его типа мне нужно присвоить ему значение, т.е. для int - цыфру, для char - массив символов и т.п. Как заделать в структуре подобное? Я пока что не придумал(потому впихнул просто "char zn[20];", который можно методом atoi конвертировать, хотя 19 символов мне кажется не всегда будет достаточно), хотя начитал в интернете, что можно пользоваться неопределённым типом в указателях, например void *p; А потом уже присваивать тип ему и добавлять данные. ( но опять же, указатели не переменные, могут и потерятся, а если использовать доп. указатели, то может быть overhead адресации...
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
10.01.2014, 09:22 | 10 |
Нет там никакой динамической типизации. Динамическое связывание не есть динамическая типизация.
Добавлено через 35 секунд Izual, есть в бусте классы boost::any/boost::variant. Есть подобное и в Qt.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
10.01.2014, 16:05 [ТС] | 11 |
Суть задачи состоит в динамическом распределении переменных в динамическом двумерном массиве структур. Тип и значение которые возвращяет Variant лишь 1 из переменных измеряемой единицы, ещё нужно удобное обращение к переменным, т.е. их структуризация, при этом такое же лёгкое как в структуре, где всего 1 тип соединительного символа(точка).
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
10.01.2014, 17:37 | 12 |
Izual, если все типы заведомо известны - можно попробовать union. Но тут другая загвоздка - для обращения к элементу union'а нужно заранее знать его тип. Короче говоря, универсального решения данной задачи в статически типизируемом языке вряд ли удастся добиться.
Добавлено через 51 секунду Или погодите, у меня почему-то создаётся ощущение, что я неверно понял задачу...
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
10.01.2014, 18:11 [ТС] | 13 |
Вы верно поняли, мне нужно создавать в блоки "двумерных массивов" переменные разных типов, например: создать таблицу, введите кол-во строк и столбцов, выберите типы данных в колонках, введите значения.
При этом я например хочу, чтоб в процессе работы я мог изменить тип в какой то колонке... Для этого я предполагаю, что если бы структура поддерживала динамические массивы типа: int mk[][];, но так к сожалению нельзя сделать... Потому проще использовать простые массивы, а их по доп. переменной уже сортировать(находить) среди структуры, содержащей все созданные\загруженные перменные. Т.е. в конечном итоге это будет что то типа интерпритатора к собственным файлам параметров.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
11.01.2014, 11:29 | 14 |
С++ же. std::vector<std::vector<int> > - двумерный динамический массив.
Тогда вам лучше организовать иерархию классов, каждый подкласс в иерархии будет представлять собственный тип данных в таблице, все они наследуются от какого-нибудь одного класса, в итоге в ячейках таблицы будут храниться указатели на базовый класс, которые будут указывать на объекты производных конкретных классов, каждый из которых будет хранить собственный тип данных.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
11.01.2014, 17:20 [ТС] | 15 |
мне придётся так делать, почему с самого начала я вообще хотел несколько структур, содержащих либо char buf[50] либо int zn как значение любой переменной.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||
11.01.2014, 22:49 | 16 | |||||
Очень спорное заявление. В использовании вектор такой же, как и обычные массивы (индексация) плюс такие плюшки, как расширение размера, которые явно читабельнее, чем перевыделение памяти и копирование из старой памяти в новую с последующим освобождением старой. А если не нравится, как выглядит объявление вектора, то пожалуйста - используйте typedef:
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
12.01.2014, 04:48 [ТС] | 17 |
1. Ну я создал допустим fn *foo, через new например с 20 элементами. А как же я даже имея такую структуру смогу контролировать не только кол-во строк(кол-во эл.), но и кол-во столбцов(т.е. кол-во arr элементов, как например arr[10])?...
2. Задачки на динамику, после целого года работы над программой в WinApi (создаю собственну базу данных с связью авто экселя и парсинга), подумалось что надоело руками писать код постоянно один и тот же, только лишь меняя название массивов и др. перменных. Захотелось попробовать реализовать способ программирования через блок схемы с интерфейсом, это бы сильно упростило труд.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
12.01.2014, 14:29 | 18 |
Не очень понял, о чём вы спросили. Если речь о выделяемых вручную динамических массивах - вам надо отдельно хранить количество строк и столбцов, потому что на основе уже выделенной памяти размер этой памяти узнать невозможно (стандартными средствами, по крайней мере). Если речь о стандартном векторе - arr.size() вернёт количество строк, arr[i].size() - количество элементов в i-й строке (по сути количество столбцов, если принять, что количество элементов во всех строках совпадает, а в вашем случае это так и есть).
Опять же, мало что понял. О какой динамике речь? Если о динамическом программировании (что, по сути, является разделом математики, точнее теории оптимизации, а не программирования), то не понятно, при чём тут эксель и базы данных. Далее, что вы подразумеваете под программированием через блок-схемы? Вы пишете приложение для генерации кода на основе построенной пользователем блок-схемы (описания алгоритма работы программы на языке блок-схем)? Не подумайте, я не издеваюсь, просто хочется понять проблему в той мере, чтобы её можно было попытаться решить. Давайте так. Чтобы понять, зачем вам реализация обобщённых таблиц, мне не нужно знать полностью постановку вашей задачи. Мне нужно знать только постановку подзадачи, т.е. только той части, которая связана с использованием обобщённых таблиц в коде. Опишите, что бы вы хотели получить, как бы хотели работать с такими обобщёнными таблицами (можно написать пример на псевдокоде с С++-подобным синтаксисом, например).
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||
12.01.2014, 18:48 [ТС] | 19 | ||||||||||
1. Про векторы я вообще ничё не знаю, потому стандартный или нет - мне по фене Мне главное услышать или увидеть что моя задача по : "Динамическому заданию кол-ва строк и столбцов, а так же типов в них(на основе колонок)" может быть решаема не простыми массивами, а структурированнми данными.
Кол-во строк и столбцов вводимая\читаемая информация, так же как типы данных в них(например захочу в 2 колонке тип WORD, а в 5 - string, при этом было бы хорошо потом в процессе работы чтоб можно тоже было поменять. Обычными структурами я хранил данные статичных типов и кол-ва столбцов(согласно кол-ву пременных структуры), а вот кол-во строк можно было изменить:
Тут плотная привязка к кол-ву переменных в структуре, я могу сделать:
Если вектор может дать нужные мне возможности, то если есть кусочек кода что ли с примером обращения к таким членам и их использовании в конвертировании, я был бы рад его увидеть - для наглядности. Добавлено через 6 минут П.С.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
||||||||||||||||
13.01.2014, 06:55 | 20 | |||||||||||||||
Вектор может дать вам только те же возможности, что и стандартные массивы плюс такие дополнительные вещи, как динамическое расширение размера, получение текущего размера, ну и множество дополнительных полезных методов, о которых можно почитать в документации по стандартной библиотеке. Сам вектор строго типизированный, он не позволит сам по себе выбирать тип элемента, это надо писать самостоятельно либо пользоваться уже упомянутыми мною boost::any/boost::variant.
Вот пример работы с вектором (заполнение и вывод на экран двумерной матрицы с динамическим добавлением элементов в вектор)
В этом случае для такой матрицы уже не нужно использовать оператор push_bakc (вся нужная память уже выделена), а работать с ней необходимо сразу через индексацию. Вывод не будет отличаться от приведённого в коде выше, а вот заполнение уже нужно выполнять так:
Векторы позволят вам решить эту проблему:
0
|
13.01.2014, 06:55 | |
13.01.2014, 06:55 | |
Помогаю со студенческими работами здесь
20
Массив включающий переменные разных типов Почему разные переменные разных функций lambda равны? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |