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

C++

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

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

02.01.2014, 19:05. Просмотров 1674. Ответов 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
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
11.01.2014, 22:49 #16
Цитата Сообщение от Izual Посмотреть сообщение
Но вся проблема в простоте читабиельности кода, я очень не хочу пользоваться классами и вектором в частности, т.к. такой вид данных трудно читается, в отличии от обычных структур, даже вложенных.
Очень спорное заявление. В использовании вектор такой же, как и обычные массивы (индексация) плюс такие плюшки, как расширение размера, которые явно читабельнее, чем перевыделение памяти и копирование из старой памяти в новую с последующим освобождением старой. А если не нравится, как выглядит объявление вектора, то пожалуйста - используйте typedef:
C++
1
2
3
4
5
6
7
8
typedef std::vector<int> int_array;
typedef std::vector<int_array> int_array_2d;
 
struct Foo {
    // ...
    int_array_2d arr;
    // ...
};
Цитата Сообщение от Izual Посмотреть сообщение
Кстати, а как это реализовать:
Не могли бы вы для начала описать задачу более полно? Чего вы пытаетесь добиться? Кто знает, вдруг проблему можно решить менее глобальным и общим способом, чем вы это себе представляете?
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
12.01.2014, 04:48  [ТС] #17
1. Ну я создал допустим fn *foo, через new например с 20 элементами. А как же я даже имея такую структуру смогу контролировать не только кол-во строк(кол-во эл.), но и кол-во столбцов(т.е. кол-во arr элементов, как например arr[10])?...

2. Задачки на динамику, после целого года работы над программой в WinApi (создаю собственну базу данных с связью авто экселя и парсинга), подумалось что надоело руками писать код постоянно один и тот же, только лишь меняя название массивов и др. перменных. Захотелось попробовать реализовать способ программирования через блок схемы с интерфейсом, это бы сильно упростило труд.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
12.01.2014, 14:29 #18
Цитата Сообщение от Izual Посмотреть сообщение
1. Ну я создал допустим fn *foo, через new например с 20 элементами. А как же я даже имея такую структуру смогу контролировать не только кол-во строк(кол-во эл.), но и кол-во столбцов(т.е. кол-во arr элементов, как например arr[10])?...
Не очень понял, о чём вы спросили. Если речь о выделяемых вручную динамических массивах - вам надо отдельно хранить количество строк и столбцов, потому что на основе уже выделенной памяти размер этой памяти узнать невозможно (стандартными средствами, по крайней мере). Если речь о стандартном векторе - arr.size() вернёт количество строк, arr[i].size() - количество элементов в i-й строке (по сути количество столбцов, если принять, что количество элементов во всех строках совпадает, а в вашем случае это так и есть).
Цитата Сообщение от Izual Посмотреть сообщение
2. Задачки на динамику, после целого года работы над программой в WinApi (создаю собственну базу данных с связью авто экселя и парсинга), подумалось что надоело руками писать код постоянно один и тот же, только лишь меняя название массивов и др. перменных. Захотелось попробовать реализовать способ программирования через блок схемы с интерфейсом, это бы сильно упростило труд.
Опять же, мало что понял. О какой динамике речь? Если о динамическом программировании (что, по сути, является разделом математики, точнее теории оптимизации, а не программирования), то не понятно, при чём тут эксель и базы данных. Далее, что вы подразумеваете под программированием через блок-схемы? Вы пишете приложение для генерации кода на основе построенной пользователем блок-схемы (описания алгоритма работы программы на языке блок-схем)?
Не подумайте, я не издеваюсь, просто хочется понять проблему в той мере, чтобы её можно было попытаться решить.
Давайте так. Чтобы понять, зачем вам реализация обобщённых таблиц, мне не нужно знать полностью постановку вашей задачи. Мне нужно знать только постановку подзадачи, т.е. только той части, которая связана с использованием обобщённых таблиц в коде. Опишите, что бы вы хотели получить, как бы хотели работать с такими обобщёнными таблицами (можно написать пример на псевдокоде с С++-подобным синтаксисом, например).
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
12.01.2014, 18:48  [ТС] #19
1. Про векторы я вообще ничё не знаю, потому стандартный или нет - мне по фене Мне главное услышать или увидеть что моя задача по : "Динамическому заданию кол-ва строк и столбцов, а так же типов в них(на основе колонок)" может быть решаема не простыми массивами, а структурированнми данными.
Кол-во строк и столбцов вводимая\читаемая информация, так же как типы данных в них(например захочу в 2 колонке тип WORD, а в 5 - string, при этом было бы хорошо потом в процессе работы чтоб можно тоже было поменять.
Обычными структурами я хранил данные статичных типов и кол-ва столбцов(согласно кол-ву пременных структуры), а вот кол-во строк можно было изменить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int nl=0;
char MainLV[12][12]={"№ строки", "Абонент", "Улица", "Дом", "Счётчик", "Марка", "Год", "Коэффициент", "Тариф", "Энергия", "Лицо", "Значность"};
int iMLV[12]={30, 80, 120, 60, 100, 70, 50, 50, 70, 70, 70, 50};
struct mainb
{
    char pn[5],ab[15],name[30],dom[10],nch[20],marka[20],god[5],koef[5],tarif[5],energy[10],lico[10],znach[5];
};
mainb *mac, mainb *mbc;
main:
nl=10;
mac=new mainb[nl];
for(int i=0;i<nl;i++)
    {
        lstrcpy(mac[i].ab, "ab");
        lstrcpy...
    }
Потом естественно расширять весь массив структур можно будет через второй указатель *mbc и увеличение nl.
Тут плотная привязка к кол-ву переменных в структуре, я могу сделать:
C++
1
2
3
4
struct tarif
{
    char m[12][10];
};
Но я явно укажу кол-во членов в строке, тут вариант до 12 элементов указывать, ну и добавить переменную которая будет указывать на тек. кол-во строк, и обращяться до этого числа. Получится что структура будет забирать больше памяти чем нужно... ну это я писал уже.

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

Добавлено через 6 минут
П.С.
является разделом математики, точнее теории оптимизации, а не программирования
*И программирования, так как процессу логического мышления отделяется "львиная доля". Ну в принципе, хочу интерфейс и возможности чуть по расширенней чем в программе Excel, вот и думаю над базовыми алгоритмами, которые уже используются, но в статическом варианте(как было показано). Блок схемы это в прямом понимании структурирование элементов кода, таких как операторы - в интерфейс\лог.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.01.2014, 06:55 #20
Цитата Сообщение от Izual Посмотреть сообщение
Если вектор может дать нужные мне возможности, то если есть кусочек кода что ли с примером обращения к таким членам и их использовании в конвертировании, я был бы рад его увидеть - для наглядности.
Вектор может дать вам только те же возможности, что и стандартные массивы плюс такие дополнительные вещи, как динамическое расширение размера, получение текущего размера, ну и множество дополнительных полезных методов, о которых можно почитать в документации по стандартной библиотеке. Сам вектор строго типизированный, он не позволит сам по себе выбирать тип элемента, это надо писать самостоятельно либо пользоваться уже упомянутыми мною boost::any/boost::variant.
Вот пример работы с вектором (заполнение и вывод на экран двумерной матрицы с динамическим добавлением элементов в вектор)
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
 
// Вспомогательная функция, возвращает случайное число в промежутке [lower, upper)
int get_random_value(int lower, int upper)
{
    return static_cast<int>(lower + (upper - lower) * static_cast<double>(std::rand()) / RAND_MAX);
}
 
int main() {
    // Инициализация генератора случайных чисел
    std::srand(static_cast<unsigned>(std::time(0)));
    
    // Создаём матрицу. Пока она пустая, размера 0x0
    std::vector<std::vector<int> > matrix;
    int rows, cols;
    
    // Генерируем случайный размер матрицы
    rows = get_random_value(2, 7);
    cols = get_random_value(2, 7);
    
    // Заполняем матрицу
    for (int i = 0; i < rows; ++i) {
        // Создаём пустую строку матрицы
        std::vector<int> row;
        // Заполняем строку
        for (int j = 0; j < cols; ++j) {
            // С помощью метода push_back помещаем очередной элемент в конец строки
            // Расширение размера строки происходит автоматически
            row.push_back(get_random_value(-10, 10));
        }
        
        // Помещаем строку в конец матрицы
        // Расширение количества строк также происходит динамически
        matrix.push_back(row);
    }
    
    // Выводим сгенерированную матрицу
    // Метод size() возвращает количество элементов в векторе, т.е. в данном
    // случае по сути количество строк матрицы
    for (int i = 0; i < matrix.size(); ++i) {
        // Выводим очередную строку. Метод size вернёт размер строки
        for (int j = 0; j < matrix[i].size(); ++j) {
            // Индексируем матрицу. В данном случае оператор matrix[i] возвращает
            // ссылку на i-ую строку матрицы, к которой мы также применяем
            // оператор индексации для получение ссылки на j-й элемент строки
            std::cout << matrix[i][j] << "\t";
        }
        
        std::cout << std::endl;
    }
    
    return 0;
}
Я специально написал код, который добавляет все элементы динамически. На самом деле в данном случае правильнее было бы выделить всю матрицу сразу вот так:
C++
1
2
int rows = get_random_value(2, 7), cols = get_random_value(2, 7);
std::vector<std::vector<int> > matrix(rows, std::vector<int>(cols, 0));
Здесь используется форма конструктора, принимающего количество элементов и инициализирующий элемент. Для вектора первого уровня количество элементов соответствует количеству строк, а инициализирующим элементом является строка - вектор размером cols с инициализирующим элементом 0.
В этом случае для такой матрицы уже не нужно использовать оператор push_bakc (вся нужная память уже выделена), а работать с ней необходимо сразу через индексацию. Вывод не будет отличаться от приведённого в коде выше, а вот заполнение уже нужно выполнять так:
C++
1
2
3
4
5
for (int i = 0; i < matrix.size(); ++i) {
    for (int j = 0; j < matrix[i].size(); ++j) {
        matrix[i][j] = get_random_value(-10, 10);
    }
}
Также стандартные векторы (как и любые стандартные контейнеры) поддерживают итераторы, с помощью которых удобно и, что главное, переносимо (т.е. независимо от фактического типа контейнера) перемещаться по контейнеру.
Векторы позволят вам решить эту проблему:
Цитата Сообщение от Izual Посмотреть сообщение
Получится что структура будет забирать больше памяти чем нужно...
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
13.01.2014, 18:40  [ТС] #21
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вектор может дать вам только те же возможности, что и стандартные массивы плюс такие дополнительные вещи, как динамическое расширение размера, получение текущего размера
1. Ну динамический массив можно delete, и с помощью второго массива дополнять исходный, потому динамическое расширение будет и так. Или это вы имеете в виду какой либо ячейки?
2. Получение размера если общих границ массива - то это отдельные переменные, как ни крути, потому что и в реале по другому не получится.

А по поводу увиденного, это очень сложно, просто "ппц", если я когда нибудь в жизни смогу прочесть такое кол-во соединительных символов, то наверно горы буду двигать) А пока что, это реально очень сложно, я всё же хочу чтоб код был читабильным, как минимум это пример с обращением к переменным структуры, как слияние точкой ячеек: tab[1].name...

Пока буду думать как поступить, ибо классы как я вижу и вектор очень сложны в синтаксисе, что меня не устраивает на данный момент... Походу мини структуры для динамических массивов таблиц будут пока что приоритетным выбором в реализации.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
13.01.2014, 18:51 #22
Цитата Сообщение от Izual Посмотреть сообщение
1. Ну динамический массив можно delete, и с помощью второго массива дополнять исходный, потому динамическое расширение будет и так. Или это вы имеете в виду какой либо ячейки?
Я имею ввиду
C++
1
vec.resize(new_size);
вместо
C++
1
2
3
4
5
6
7
int *new_array = new int[new size];
for (int i = 0; i < old_size; ++i) {
    new_array[i] = old_array[i];
}
int *temp_ptr = old_array;
old_array = new_array;
delete[] tem_ptr;
Чувствуете разницу?
Цитата Сообщение от Izual Посмотреть сообщение
2. Получение размера если общих границ массива - то это отдельные переменные, как ни крути, потому что и в реале по другому не получится.
Получится, и я показал, как.
Цитата Сообщение от Izual Посмотреть сообщение
А по поводу увиденного, это очень сложно, просто "ппц"
Вы меня, конечно, извините, но раз вы решили писать программу, тем более, как вы говорите, достаточно большую и сложную, вы должны знать язык, на котором пишете. Вы сейчас пытаетесь построить небоскрёб, используя только спички и клей "Момент". По крайней мере, именно так это выглядит. Как ни крути, а стандартная библиотека упрощает жизнь и ускоряет разработку. А вы почему-то упёрлись в ту малую толику возможностей языка, которые вы знаете, и не хотите попытаться разобраться и изучить новое, причём такое новое, без которого в реальных проектах с использованием С++ никуда.
Цитата Сообщение от Izual Посмотреть сообщение
А пока что, это реально очень сложно, я всё же хочу чтоб код был читабильным, как минимум это пример с обращением к переменным структуры, как слияние точкой ячеек: tab[1].name
Если бы вы не знали, что такое сруктуры и как обращаться к их членам-данным, вы бы и это обращение посчитали нечитаемым набором символов. Чувствуете аналогию?
Цитата Сообщение от Izual Посмотреть сообщение
Пока буду думать как поступить, ибо классы как я вижу и вектор очень сложны в синтаксисе, что меня не устраивает на данный момент... Походу мини структуры для динамических массивов таблиц будут пока что приоритетным выбором в реализации.
Что ж, раз вы хотите и дальше продолжать идти в стену - не считаю, что имею право вам мешать в этом непростом занятии.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2014, 18:51
Привет! Вот еще темы с ответами:

Нужен алгоритм, который будет считать формулу, введённую пользователем в виде строки - 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 на другой пустой жесткий диск. Могут ли...


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

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

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