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

C++

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

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

18.02.2014, 14:05. Просмотров 2977. Ответов 47

Сабж. Нужен способ помещения разного рода типа данных в контейнеры типа массивов или структур или... пободного рода простых для восприятия методов.
Поясню.
Пишу базу дынных, используя структуры я могу получить динамически кол-во строк исходя из данных в структуре.
Например:
C++
1
2
3
4
5
6
struct addition
{
    char m[10][20];
};
addition *ma;
addition *mae;
Т.е. При использовании такого вида структуры, я могу создать N-ое кол-во строк динамически с помощью оператора New.
C++
1
2
int MK=5;
    ma=new addition[MK];
Но вот кол-во членов не может быть динамическим на сколько я знаю, т.е. нельзя в структуре написать: m[n][j]
Где заранее будет проинициализированна глобальная переменная типа int, а перед определением самой структуры, я бы написал что например n = 10, j = 30...
Ещё интересует вопрос с разнородными переменными, например я вот захочу чтоб в структуре было char[], int, float, WORD типы переменных... Посоветовали юзать тип VARIANT, однако как его юзать, если кол-во бит выделенное для каждого типа переменных - будет различаться...
В общем нужен простой подход(в синтаксисе) к данному вопросу.
И повторюсь - классы и векторы не предлагать, они слишком сложны в синтаксисе.(переубеждать меня не надо, данная тема не для этого создана).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2014, 14:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужен способ помещения разного рода типа данных в контейнеры типа массивов или структур (C++):

Нужен совет по созданию своего типа данных - C++ Builder
Приветствую всех. Мне необходимо создать свой тип данных "Пароль". Размер самого пароля всегда один и тот же и составляет 6 байт. Кроме...

Самый простой/лучший способ поделить с остатком число типа float? - C++ Builder
Что посоветуете? Вроде была простая функция из библиотеки.

Написать функцию min с переменным числом параметров, которая находит минимальное из чисел типа int или из чисел типа double - Visual C++
Написать функцию min с переменным числом параметров, которая находит минимальное из чисел типа int или из чисел типа double, тип параметров...

Вывод переменных разного типа через TextOut() - C++ WinAPI
Приветствую. Начал изучать WinAPI и столкнулся с такой проблемой. Хочу вывести в окошко результат функции GetSystemMetrics(); Вывожу через...

Аргумент типа const char* не совместим с параметром типа LPCWSTR - C++ WinAPI
Начал учить win32 по книге Финогенова, вставил код первой проги в VS10, пишет мне ошибку "аргумент типа const char* не совместим с...

Сортировка массивов разного типа - C++
Само задание: Массив данных заполняется случайным образом. Рассмотреть массивы данных из элементов типа char и double. Использовать...

47
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
22.02.2014, 11:41 #31
Это вопрос интерпретации информации. В байте хранится 8 битов, что даёт 256 возможных комбинаций. Мы можем обозначать этими комбинациями числа от 0 до 255. В 4 байтах мы имеем (256)^4 = 4 с хвостиком миллиарда возможных значений для всего набора.
А вот если мы договоримся воспринимать байты как хранилище для кодов символов, то получаем 1 символ (в данном случае десятичную цифру числа) на байт. А раз уж в представлении числа используются цифры, то нас только они и будут интересовать. Стало быть, для каждого символа из 256 возможных кодов допустимыми являются только 10.
Раньше, в староглиняные времена, имел хождение ещё один занятный способ представления чисел: двоично-десятичный (bcd). Под каждую десятичную цифру отводилось ровно полбайта, использовалось 10 значений из 16 возможных, в целиковом байте получалось 100 допустимых значений из 256 возможных. В процессоре даже сохранились какие-то связанные с этим форматом команды.
Но в любом случае, это всё вопрос интерпретации. В "сыром" виде в памяти хранится просто некий набор битов. Надо знать, что мы ожидаем увидеть в данном конкретном участке памяти: коды символов, двоичное представление целого числа со знаком или без знака, число с плавающей точкой или ещё что-то. В зависимости от этих ожиданий и обращаться с этой информацией соответствующим образом. Компилятор автоматически отслеживает эти ожидания через типы данных.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
27.02.2014, 13:40  [ТС] #32
1.) Так, в скользь я тут спросил такое(но из за небольшого отклонения, ответа не получил):
-Как сделать динамически кол-во переменных типа структуры?
Т.е. мне надо не просто:
C++
1
2
addition *ma;
addition *mae;
А чтобы я мог контролировать кол-во подобных экземпляров.
Как реализовать? Или точное название для гугла дайте.

2.) По поводу интерпритации информации, я так понимаю что мне надо для этих целей смотреть алгоритмы самих функций типа itoa. Они есть в открытом виде?..

3.) По поводу динамического массива(который мы тут разбираем), есть такая тема: Как создать динамический массив структур?
Где написано, что:
Вектор возвращает ссылку на свой объект.
Если он возвращает ссылку на реальный объект - вы получаете доступ к этому объекту по этой ссылке.

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

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

Поэтому, если по задаче перемещать объекты туда-сюда не нужно, лучше просто хранить в векторе сам объект.
Тут конешно мы не трогаем вектор, но в контексте того, что указатели как внутри структуры(динамический массив), так и сами экземпляры структуры... Не возникнет ли у меня подобная проблема с тем что я нарыл?... Как тогда мне контролировать процесс, т.е. можно ли вообще оверхеды ловить?..
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
27.02.2014, 19:22 #33
Цитата Сообщение от Izual Посмотреть сообщение
Они есть в открытом виде?..
Существует множество учебных примеров, в том числе и на этом форуме. Алгоритм перевода числа в строку основан на последовательном выделении цифр из числа арифметическими операциями и переводом этих цифр в коды символов.

Нулевой оверхед возможен только за счёт априорного знания (то есть, структура данных известна на момент компиляции). Если структура данных задаётся динамически, то неизбежен оверхед по памяти на хранение описания содержимого и оверхед по времени на чтение, понимание и поддержание этого описания. Так, простейший способ контролировать количество чего-то - завести переменную, в которой это количество хранится. Хранение этой переменной даёт оверхед по памяти, а её чтение и обновление - оверхед по времени.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
28.02.2014, 00:35  [ТС] #34
Nick Alte, переводчика пожалуйста))))
Я под оверхедом понимаю - ошибку обращения к какому либо значению... Но моё понимание что то не клеится в вашем контексте. Так ладно, расшифрую о том и о сём:
1. В ссылке говорится про указатели и возникающий оверхед при обращении к значениям. Т.е. если у меня 3-4 структуры, естественно т.к. экземпляр структуры(если я правильно назвал это) прописывается как указатель:
C++
1
addition *ma;
То получится, что при обращении к каким то данным через тройную и выше адресацию через подобные указательные процедуры - может возникнуть оверхед, как например он возникает, если путь к папке в винде + название файла превышает допустимый максимум (1024 символа?) и винда выдаёт ошибку - мол, может я и скопирую данные в папку, но учтите что путь к файлу слишком длинный... Но это минимальная проблема, т.к. если же в переменную не внесётся значение, обработки этой ошибки не будет и далее переменная будет спользоваться - то возможет такой конфуз в программе что мама не горюй.
2. У меня уже будет через даже одну структуру - тройная адресация, а если учесть что некоторые переменные ссылаются на другие - то получится ппц как много... чую ошибок не миновать.
3. Не понятно что вы имеете ввиду:
контролировать количество чего-то - завести переменную
Это вы про какой из пунктов?.. То что переменная о инф. длинне массива будет - безусловно. Но далее уже не понятно, именно из того что вы перечислили: время на чтение, понимание и поддержания.
----
4. По поводу itoa... На форуме дофига чего есть, но иногда подобрать "ключевые слова для поиска" - становится сложно, почему я в пред. посте и попросил "точное название для гугла".(я попробую как вы написали: "Алгоритм перевода числа в строку")
----
И оставшиеся вопросы более важны, т.к. пока что я не уверен что буду делать через преобразования строки в другие форматы, т.к. это будет сложновато реализовать для всех возможных форматов. Возможно пойду через Variant структуру, хотя пока не допёр как с ним работать, а в инете все примеры использования Variant через классы сделаны, что меня совершенно не устраивает(переубеждать не надо).
0
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
28.02.2014, 11:00 #35
Цитата Сообщение от Izual Посмотреть сообщение
-Как сделать динамически кол-во переменных типа структуры?
C++
1
2
k = 5; // 5 структур
addition *ma = new addition[k]; // ma - массив из k объектов addition
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
28.02.2014, 16:00  [ТС] #36
elivin, Нет! Это я знаю. Мне надо кол-во экземпляров типа ma[0], ma[1]..
Я наверно не правильно назвал это.(не знаю как правильно). Т.е. надо типа:
C++
1
2
3
4
5
int d=10;
for(int i=0;i<d;i++)
{
 addition *ma[i] = new addition[k];
}
Т.е. вместо ma и mae, мне нужна динамика.
Правильно ли это?
0
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
28.02.2014, 16:06 #37
C++
1
2
3
addition **ma = new addition*[d];
for (int i = 0; i < d; i++)
   ma[i] = new addition[k];
?

Добавлено через 49 секунд
И обращаемся как к двумерному массиву
0
Nick Alte
Эксперт С++
1640 / 1012 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
28.02.2014, 17:14 #38
Оверхед в моём понимании (и, как я подозреваю, в понимании большого количества других людей) - накладные расходы, дополнительные затраты памяти и времени на поддержание работоспособности какой-то конструкции.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
28.02.2014, 20:39  [ТС] #39
elivin, спасибо попробую. А как кстати в этом случае описать ma в глобальных переменных?
Ну было то так:
C++
1
2
3
4
5
struct addition
{
    char m[10][20];
};
addition *ma;
Но теперь так нельзя... чем заменить?

Nick Alte, потеря времени перед глобальной динамикой - ничто. Темболее сейчас такие мощьные компы, что им это по барабану(ну если не сильно с подобными оверхедами увлекаться). Другое дело если ошибки будут возникать из за этих оверхедов, хотя я по таймингу ничего не делаю, пусть хоть пол часа данные читает, главное чтоб в конце всё было правильно сделано.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
28.02.2014, 23:57 #40
Izual, судя по вашему описанию динамически расширяемого хранилища экземпляров:
Цитата Сообщение от Izual Посмотреть сообщение
А чтобы я мог контролировать кол-во подобных экземпляров.
вам нужен список, а не массив (я же правильно понимаю, что удаляться они тоже будут?).
Если не хочется использовать классы, то в сети есть довольно простые реализации на Си. Ну или я сюда могу скинуть пример (полноценный, потому не очень маленький), если хотите.
0
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
01.03.2014, 00:22  [ТС] #41
DrOffset, список сложен в синтаксисе(покрайней мере из того что я видел, очень много сторонних разделительных символов). Удаляться тоже будут. Но это же не проблема в случае с массивом структур. Да ссылочку пожалуйста, я так понимаю устав форума не разрешает публично выкладывать ссылки с сторонних сайтов, поэтому в приват если можно. Ну а для зрелищности можете закопипастить кусочек интересующего кода =)
Да и раз вы тут новенький(в смысле в моём топике), поясню, что в результате мне нужен полноценный контейнер с хранилищем разнородной информации. Если список даст мне возможность реализовать - то может и попробую, но опять же тут будет соотношение сложность синтаксиса\исполняемость конечной задачи.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
01.03.2014, 02:13 #42
Цитата Сообщение от Izual Посмотреть сообщение
список сложен в синтаксисе
Сложность понятие относительное, реализация в массиве удаления из середины (особенно, если требуется сразу же освобождать память из под элемента) сложнее, чем аналогичная у списка.

Цитата Сообщение от Izual Посмотреть сообщение
в результате мне нужен полноценный контейнер с хранилищем разнородной информации
Это вы сами напишете, на основе массива, или списка - это вам решать. Или может быть вас все-таки кто-то уговорит на использование готового (напр. того же VARIANT в списке или массиве). Я подскажу - VARIANT использует union для организации совместного хранения разнородных данных.

Цитата Сообщение от Izual Посмотреть сообщение
соотношение сложность синтаксиса\исполняемость конечной задачи.
Задача, как я понял, у вас изначально непростая. Следовательно решать ее простыми способами можно и нужно, но главное - чтобы не примитивными. И выбор структуры данных это не тот уровень сложности, которого стоит опасаться. Будут у вас гораздо более трудоемкие моменты.

Как говорится, дорогу осилит идущий.
Код с примером использования во вложении.
0
Вложения
Тип файла: 7z c_list_test.7z (1.9 Кб, 19 просмотров)
Izual
94 / 119 / 6
Регистрация: 13.11.2012
Сообщений: 1,552
01.03.2014, 03:26  [ТС] #43
DrOffset, спасибочки, заценю.

реализация в массиве удаления из середины
Очень просто, алгоритмы - моя страсть. Обожаю такие задачки, а для удобства уже универсальную функцию себе сделал.(естественно с освобождением памяти, хотя пока что утечку памяти не контролю, хотя надо бы начать, а то уже было, нечаянно даже из за этого дюпнул шмотку на офф серве diablo2^^)
VARIANT использует union
Да да, вот почему и возник на 4 странице вопрос о битах, т.к. в книге совместно с union ещё были примеры с unsigned, типа можно тип менять. Хотя написано что массив символов нельзя использовать, потому что unsigned поле не имеет "определённого адреса"... Не очень понимаю))
И да, меня убеждать использовать VARIANT не надо, я как бы к этому и иду, только вот на "чистом" Си не нашёл примеров... все как на подбор только через омг синтаксис классов и векторов. Вот от поиска и недостатка инфы конешно крыша едет... хочется бросить всё, но разум говорит что не надо, ибо идея стоящяя.(хотя вот почему и подумал о простом массиве символов - потому как из него конвертировать можно во что угодно, алгоритмы в принципе просты, да и есть даже некоторые стандартные функции)
решать ее простыми способами можно и нужно, но главное - чтобы не примитивными
А в чём разница? Примитив это как два колеса, но только их отношение даёт результат.
выбор структуры данных
А в этом вся загвоздка, мне нужно предельно понятный синтаксис, чего например классы и вектор не дают, поэтому именно это как бы и основа, т.к. дом начинается с фундамента - не так положу и потом буду мучаться)

Добавлено через 15 минут
Так ну, вот списки... посмотрел, очень не удобно и не понятно! Сам по себе синтаксис списков - требует знания работы со списками. В структурах и массивах такого нет. Так же замечу, постоянно встречающийся символ '->' стрелочки: не очень хороший вариант, я всё же делаю подобие лего - где все детали ясны и понятны.
Кстати по поводу "примитива" вспомнился фильм 2008 года "Проблеск гениальности", где мужик изобрёл из простейших составляющих: резитор, транзистор и конденсатор. Т.е. только базовыми приборами человек создал то, чего ещё не было - в контексте фильма: прерывистые дворники.
0
elivin
65 / 65 / 1
Регистрация: 04.01.2012
Сообщений: 231
Записей в блоге: 1
01.03.2014, 14:39 #44
Цитата Сообщение от DrOffset Посмотреть сообщение
Сложность понятие относительное
Izual хочет пойти по самому долгому и ухабистому пути - вместо того, чтобы полчаса посидеть и разобраться с уже реализованным и отлаженным другими, он хочет городить свои велосипеды со своим зоопарком багов. Даже про списки говорит, что слишком сложно.

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Как говорится, дорогу осилит идущий.
Идущий по этой дороге, а не пробивающий новую рядом по болоту.



Цитата Сообщение от Izual Посмотреть сообщение
А в чём разница?
Примитив - это набор инструментов и материал для создания колеса. Зачем создавать новые колёса, если уже имеются в наличии все нужные?

Не по теме:


Цитата Сообщение от Izual Посмотреть сообщение
Очень просто, алгоритмы - моя страсть.
Цитата Сообщение от Izual Посмотреть сообщение
Добавлено через 15 минут
Цитата Сообщение от Izual Посмотреть сообщение
списки... посмотрел, очень не удобно и не понятно!



Цитата Сообщение от Izual Посмотреть сообщение
Сам по себе синтаксис списков - требует знания работы со списками. В структурах и массивах такого нет.
Синтаксис структур и массивов не требует знания работы со структурами и массивами?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
01.03.2014, 15:15 #45
Цитата Сообщение от Izual Посмотреть сообщение
посмотрел, очень не удобно и не понятно!
Это страх говорит в вас
Код мог бы быть проще, будь он написан с использованием так не любимых вами классов, но это не важно.
Потому что выигрывая в простоте в одном месте, мы получаем увеличение сложности в другом. Вот даже тот пример, я отказался от классов, отказался от С++ как от более продвинутого инструмента описания задачи. Увеличилась ли сложность? Конечно. Ведь теперь очень много вещей, которые в С++ решались на уровне языка автоматически, приходится делать вручную. Однако появилась и простота, простота управления структурой данных, теперь можно управлять ей на самом элементарном уровне, как мне угодно. Вот вам статья на эту тему.

Цитата Сообщение от Izual Посмотреть сообщение
постоянно встречающийся символ '->' стрелочки: не очень хороший вариант
Рулить динамическим массивом и элементами в нем без нее тоже не получится. Один из базовых механизмов роботы с памятью в С и С++ - это указатель, заметьте, базовых, то есть - это и есть как раз тот транзистор, про который вы говорили.

PS. Давайте не забывать, что компьютеры, построенные в прошлом веке, занимали целые комнаты или даже этажи. А теперь я могу положить его в карман. Все потому, что иногда возрастающая сложность задачи не позволяет решить ее на прежней элементной базе и требует изменения взглядов и подходов к задаче. Я надеюсь вы найдете в себе силы это понять.
0
01.03.2014, 15:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2014, 15:15
Привет! Вот еще темы с ответами:

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

Хранение в массиве данных разного типа - C++
Доброго времени суток. Возникла задача: Имеем массив byte buffer, а также переменные char ch1,ch2; int x1,x2,y1,y2; Нужно записать в...

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

Реализовать сортировку и поиск данных в массиве структур типа School - C++
Описать структуру с именем SCHOOL, что содержит следующие поля: NAME - фамилия и имя ученика, GROUP - номер класса, SUBJECT -...


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

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

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