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

C++

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

Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки - C++

02.01.2014, 19:05. Просмотров 1696. Ответов 21
Метки нет (Все метки)

В общем нужен динамический контейнер... который будет соединять разные переменные, разных типов в блоки.
Например есть поля Edit и Combo, после нажатия на кнопку, информация из заполненных полей будет помещяться в блок, расширение блоков нужно чтоб было примерно как в структуре, через операторы new и delete переопределять и копировать информацию.
Проблема в том что структура, на сколько мне известно не может держать в себе переменное кол-во членов(которое изменяется во время работы программы), т.е. мне наприпер в одном блоке нужно 4 char массива по 20 символов и один 300 символов, ещё туда же 2 int переменные и HWND например.
Как осуществить такую сложную динамику, и возможно ли объединять в структурные блоки переменные, которые могут позже удаляться например из блока или создавать новые в нутри одного блока (блок в моём понимании как строка из элементов ListView формы).
Возможно ли работать с структурой в таком режиме, если да то как?
И по возможности, прошу высказывать самые простые способы(т.е. например не такие сложные в синтаксисе как классы), идеальным для меня вариантом было бы использование структур(возможно вложенных или "дружественных")
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2014, 19:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужен динамический контейнер, который будет соединять разные переменные, разных типов в блоки (C++):

Статический контейнер для разных типов - C++
Доброго здоровица. Как объявить контейнер для хранении различных типов? Правилен ли такой метод? template <class T> class...

Объявить переменные разных типов в заголовке for - C++
Здравствуйте, хочу узнать можно ли как-то объявить в for переменные разных типов, например: for(int i=0, double d=1.2; i<10; i++, d+=0.5)...

Разделение строки на переменные разных типов - C++
Помогите с разделением строки Есть String dat dat = "40.10 50.10 60.10 70.10 11:15:23 4-03-2012" необходимо разделить ее на 4...

Как реализовать класс Pricelist, который будет содержать динамический массив объектов Model - C++
Мне нужно создать динамический массив объектов другого класса. Тоесть в Pricelist будет массив объектов, а сами модельки он будет брать из...

Привести примеры разных ситуаций, в который будет вызыватся конструктор копирования - C++
Если не сложно помогите пожалуиста с заданиями на контрольную мне за 3 часа надо их сдать! Кто может! Пожалуиста! Извините если с...

Решение задачи с массивам. Реализовать алгоритм, который будет считать количество в массиве разных букв - C++
Есть массив из 50 элементов из случайных букв малого и большого регистров. Реализовать алгоритм, который будет считать количество в...

21
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.01.2014, 19:14 #2
Интересная задачка. Вряд ли можно на C++ такое сделать, статическая типизация ведь.
А как Вы видите себе использование такого контейнера ? Можно пример (псевдо)кода ?
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
02.01.2014, 19:21 #3
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
02.01.2014, 19:40  [ТС] #4
Я думаю, изначально создать с десяток структур по каждому виду переменной в структуре, например для int:
C++
1
2
3
4
5
struct integers
{
int N;
};
integers *na, interegs *nb;
При добавлении новой переменной вида int, она заносится в свою integer структуру...

Теперь далее, т.к. структура не поддерживает динамические массивы как члены, то в структуре, описывающюю какой либо объект, хранить число как кол-во членов в ней, а так же типы этих членов как "typedef enum" тип, на основе которого будет программа расфосовывать переменные. На основе этой структуры(объекта), создавать новую основанную на кол-ве членов и их типах, в этой структуре возможно переменные определять с помощью указателей(или даже просто числа, т.к. важен порядковый номер в базовой структуре, через который можно обратиться за данными) на переменные, хранящиеся в interegs и т.п. структурах.
Однако это лишь часть моей задумки, динамическое кол-во членов всё равно не сможет поддерживаться структурой, придётся возможно создавать структуры основанные на числе его членов как статическом, например для объектов будет 3 структуры по 5, 10 и 20 членов(как один массив внутри структуры), иначе если брать слишком много - будет утечка памяти в итоге, т.к. если мне нужна структура на 3 эл., а статически массив выделяется в структуре на 20 эл-во, а они так и не будут использованны, другое дело от 2 до 7 эл-ов...
Хотя мне так не нравится, код будет не красивым, желанной динамики не будет...
П.С. кстати, а можно ли узнать сколько памяти съела структура?.. например "N=20; na=new integers[N];"

Добавлено через 9 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
Вы думаете что есть толк от того что вы сказали? =)
Простым языком пожалуйста, и если можно с примером реализации.
И опять же, я не хотел использовать классы, но если вариантов больше нет, то придётся... Однако мне нужен пруф, что без классов и т.п. мути типа векторов, работу с которыми вразумить тяжело... Читабиельность кода падает в разы.
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.01.2014, 20:05 #5
Цитата Сообщение от Izual Посмотреть сообщение
Я думаю, изначально создать с десяток структур по каждому виду переменной в структуре, например для int:
...
Теперь далее, т.к. структура не поддерживает динамические массивы как члены, то в структуре, описывающюю какой либо объект, хранить число как кол-во членов в ней, а так же типы этих членов как "typedef enum" тип, на основе которого будет программа расфосовывать переменные. На основе этой структуры(объекта), создавать новую основанную на кол-ве членов и их типах, в этой структуре возможно переменные определять с помощью указателей(или даже просто числа, т.к. важен порядковый номер в базовой структуре, через который можно обратиться за данными) на переменные, хранящиеся в interegs и т.п. структурах.
А не проще для таких задач использовать кодогенераторы ?
А вообще, мне сразу вспоминается тип VARIANT из COM:

VARIANT structure
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Наглядный пример структуры, которая умеет хранить множество типов...

А вот советую еще заглянуть сюда, может убережет от написания очередного велосипеда:

Boost.Any
http://www.boost.org/doc/libs/1_55_0/doc/html/any.html
1
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
03.01.2014, 00:25  [ТС] #6
VARIANT - Чтобы хранить одну структуру, смешанного типа ?
Вообще я использую VARIANT для работы с Auto Excel, но обрабатывать все возможные типы возвращяемые VARIANT функциями не считаю нужным...
Да и проблема с типами меня мало тревожит, по сравнению с задачей по динамическому изменению кол-ва членов у объектов..
0
taras atavin
3570 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
03.01.2014, 10:07 #7
Цитата Сообщение от Izual Посмотреть сообщение
Вы думаете что есть толк от того что вы сказали? =)
Простым языком пожалуйста, и если можно с примером реализации.
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
39
40
class A
{
};
class B:A
{
};
class C:A
{
};
class D
{
};
class E:D
{
};
class F:D
{
};
A *a;
D *d;
a=new B; // можно, A и его потомки для безымянных указателей объектов, выделенных по указателю на A типизируются динамически
delete a;
a=new C; // можно, A и его потомки для безымянных указателей объектов, выделенных по указателю на A типизируются динамически
delete a;
a=new D; // нельзя, строгая статическая типизация
delete a;
a=new E; // нельзя, строгая статическая типизация
delete a;
a=new F; // нельзя, строгая статическая типизация
delete a;
d=new E; // можно, D и его потомки для безымянных указателей объектов, выделенных по указателю на D типизируются динамически
delete d;
d=new F; // можно, D и его потомки для безымянных указателей объектов, выделенных по указателю на D типизируются динамически
delete d;
d=new A; // нельзя, строгая статическая типизация
delete d;
d=new B; // нельзя, строгая статическая типизация
delete d;
d=new C; // нельзя, строгая статическая типизация
delete d;
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
03.01.2014, 14:12  [ТС] #8
taras atavin, что это? Как это использовать?... Как это решает задачу с динамическим изменением кол-ва членов по ходу работы программы?
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
05.01.2014, 17:29  [ТС] #9
Раз пока что адекватного выхода из первоначального вопроса не найдено, то думаю что обойдусь отдельной переменной в структуре, которая будет отвечать за номер блока, если он нужен.
Кстати столкнулся с небольшими трудностями:
1. Типа HWND в VARIANT структуре нет, где то на задворках яндекса что то невнятное говорили на английском, мол HWND можно считать как Long тип, хотя не понятно как обращяться с этим тогда.
2. Как сделать Нное кол-во массивов структур(хотя написал видимо не корректно). Поясню:
C++
1
2
3
4
5
6
7
8
9
int nl=10;
struct per
{
VARIANT type;
int blok;
char zn[20];
};
integers *na, interegs *nb;
na=new per[nl];
Я могу объявить новый массив только с именами, которые уже объявил: "na" и "nb". Как можно создать динамически новое имя?.. или может массив от одного имени?..
3. Тут же ещё одна неприятность, даже если я добавлю новую переменную в структуру, исходя из его типа мне нужно присвоить ему значение, т.е. для int - цыфру, для char - массив символов и т.п. Как заделать в структуре подобное? Я пока что не придумал(потому впихнул просто "char zn[20];", который можно методом atoi конвертировать, хотя 19 символов мне кажется не всегда будет достаточно), хотя начитал в интернете, что можно пользоваться неопределённым типом в указателях, например void *p; А потом уже присваивать тип ему и добавлять данные. ( но опять же, указатели не переменные, могут и потерятся, а если использовать доп. указатели, то может быть overhead адресации...
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2014, 09:22 #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Для безымянных экземпляров классов типизация смешанная: статически типизируется иерархия и динамически фактический класс.
Нет там никакой динамической типизации. Динамическое связывание не есть динамическая типизация.

Добавлено через 35 секунд
Izual, есть в бусте классы boost::any/boost::variant. Есть подобное и в Qt.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
10.01.2014, 16:05  [ТС] #11
Суть задачи состоит в динамическом распределении переменных в динамическом двумерном массиве структур. Тип и значение которые возвращяет Variant лишь 1 из переменных измеряемой единицы, ещё нужно удобное обращение к переменным, т.е. их структуризация, при этом такое же лёгкое как в структуре, где всего 1 тип соединительного символа(точка).
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
10.01.2014, 17:37 #12
Izual, если все типы заведомо известны - можно попробовать union. Но тут другая загвоздка - для обращения к элементу union'а нужно заранее знать его тип. Короче говоря, универсального решения данной задачи в статически типизируемом языке вряд ли удастся добиться.

Добавлено через 51 секунду
Или погодите, у меня почему-то создаётся ощущение, что я неверно понял задачу...
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
10.01.2014, 18:11  [ТС] #13
Вы верно поняли, мне нужно создавать в блоки "двумерных массивов" переменные разных типов, например: создать таблицу, введите кол-во строк и столбцов, выберите типы данных в колонках, введите значения.

При этом я например хочу, чтоб в процессе работы я мог изменить тип в какой то колонке... Для этого я предполагаю, что если бы структура поддерживала динамические массивы типа: int mk[][];, но так к сожалению нельзя сделать... Потому проще использовать простые массивы, а их по доп. переменной уже сортировать(находить) среди структуры, содержащей все созданные\загруженные перменные.
Т.е. в конечном итоге это будет что то типа интерпритатора к собственным файлам параметров.
0
silent_1991
Эксперт С++
4986 / 3043 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.01.2014, 11:29 #14
Цитата Сообщение от Izual Посмотреть сообщение
если бы структура поддерживала динамические массивы типа: int mk[][]
С++ же. std::vector<std::vector<int> > - двумерный динамический массив.
Цитата Сообщение от Izual Посмотреть сообщение
Т.е. в конечном итоге это будет что то типа интерпритатора к собственным файлам параметров.
Тогда вам лучше организовать иерархию классов, каждый подкласс в иерархии будет представлять собственный тип данных в таблице, все они наследуются от какого-нибудь одного класса, в итоге в ячейках таблицы будут храниться указатели на базовый класс, которые будут указывать на объекты производных конкретных классов, каждый из которых будет хранить собственный тип данных.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
11.01.2014, 17:20  [ТС] #15
мне придётся так делать, почему с самого начала я вообще хотел несколько структур, содержащих либо char buf[50] либо int zn как значение любой переменной.
0
11.01.2014, 17:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2014, 17:20
Привет! Вот еще темы с ответами:

Нужен алгоритм, который будет считать формулу, введённую пользователем в виде строки - C++
Задача такая: пользователь вводит с клавиатуры формулу, с заведомо неизвестным количеством переменных, а программа должна эту формулу...

Показать разные блоки для разных устройств - JavaScript
Здравствуйте, Есть блок &lt;div class=&quot;block&quot;&gt;&lt;/div&gt; Нужно чтобы если пользователь зашел с ios Устройтсв то ему внутри показывалось бы ...

Почему разные переменные разных функций lambda равны? - Python
# coding: utf8 import random def hv(): global a global b a = &quot;dfg&quot; b = &quot;uipnj&quot; ...

Что будет, если поставить две разные Windows на два разных HHD? - Windows 7
Есть основная Windows на основном жестком диске. Появилась потребность поставить вторую Windows на другой пустой жесткий диск. Могут ли...


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

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

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