143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
1

Переменное кол-во членов в структуре. Возможно ли?

27.12.2013, 11:39. Показов 1617. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Суть задачи - создать "хранилище данных", которое может изменять как свои члены ( по типу, например была 1-ая колонка char типов, а стало нужно int, при этом удалить старые ), так и размер членов ( например длину char массива ).
Как я понимаю структура не может дать мне желанной динамики, если так, то вопрос о реализации с помощью других способов.
Например как мне видится, использовать указатели как члены структуры, параллельно создать динамические массивы с определённым типом данных, и при необходимости использования увеличивать массив и добавлять новые данные ( например создаю заведомо массив char эл-ов, int и других )
При этом буду из структуры ссылаться на данные этих массивов.
Подскажите можно ли так?.. возможно если кому не лень кусочек кода с примерной реализацией.

Есть ещё один момент, кол-во строк контролировать можно, переопределением структуры, а кол-во эл-ов нет, как решить данный вопрос? Например указать безразмерный массив как член структуры, ссылающяяся на переменную, указывающую размер...

Подумал, если использовать typedef то можно так же и тип описывать, однако вопрос с количеством аргументов всё равно утруждает.

Добавлено через 19 часов 49 минут
Может просто работать массивами с опр типом создавать их динамически?.. Жаль такой код будет не прост в понимании в отличии от массивов...
Кстати подумал, может используя указатели совместить возможности динамических массивов, но ссылаться к элементам через структуру?(например содержащяя в себе тип переменной, имя и ссылку на реальный объект созданный динамически). Даже может через вложенные структуры. Или есть более подходящий способ работы с смешанными данными, определяемыми в кол-ве и качестве(типу и самим данным)? Может какие то методы пропустил.(кстати, если предлагаете классы, чего я не хочу делать, ибо со структурой мне лично легче работать, то описывайте разницу в возможностях, которая может стать решающей, если других методов не найдётся)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2013, 11:39
Ответы с готовыми решениями:

Передача в функцию переменное кол-во аргументов
Здравствуйте, Пытаюсь понять, как передать в функцию переменное кол-во аргументов и грубо...

Вывод определённого кол-ва знаков после запятой в структуре!
Ребята,передо мной была поставлена задача,которую я решил,но теперь вот у меня возник вопрос! вот...

Создайте функцию, которая принимает переменное количество входных аргументов и возвращает переменное количество выходных
Создайте функцию, которая принимает переменное количество входных аргументов и возвращает...

Создайте функцию, которая принимает переменное количество входных аргументов и возвращает переменное количество
Помогите исправить ошибку в коде. Задание такое: Создайте функцию, которая принимает переменное...

15
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
27.12.2013, 12:12 2
Читай про деревья.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.12.2013, 18:38  [ТС] 3
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Читай про деревья.
Вам скопировать текст из википедии?... Поясню:
Я умею создавать структуры и динамически переопределять их размер.
У меня проблема в том, что в определённый момент, мне нужно например изменить аргументы структуры, тип и значение присвоить. Структура я так понимаю таких возможностей не даёт, вот я и спрашиваю что даёт такую возможность.
Про дерево, даже с учётом примеров, не найдено решение динамического изменения аргументов, т.к. дерево основывается на опр типе данных аргументов, что уже не даёт решения поставленной головоломки.
0
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
27.12.2013, 21:41 4
м, как насчет обычного вектора который содержит класс/структуру аргументов в твоей структуре? и потом на основе этих аргументов строится сама структура
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
27.12.2013, 23:28  [ТС] 5
Цитата Сообщение от Aloir Посмотреть сообщение
м, как насчет обычного вектора который содержит класс/структуру аргументов в твоей структуре? и потом на основе этих аргументов строится сама структура
Честно не очень люблю класс на вид, как и вектор(что является его составляющей), предпочитаю старый стиль структур.
Я так понимаю, вы мне описали мои предположения, по поводу вложенных структур, описывая новые переменные typedef enum методом, и исходя из типа засовывать переменные в тот или иной однородный массив, в самой структуре отсортированных(данных) будет храниться в каждом элементе - номер(или ссылка) к нужным данным.
А что по поводу кол-ва переменных в структуре? я же не могу(вроде бы) создать динамический массив как аргумент в структуре ? -или я ошибаюсь(тогда пруф плз)
0
224 / 224 / 38
Регистрация: 17.12.2010
Сообщений: 713
28.12.2013, 04:02 6
я предлагаю примерно так сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct CObject{
 vector<CObjProper> properties;
 vector<CObjMember> members;
 ...
}
 
 
где CObjProper например
struct CObjProper{
 string Name;
 string(ENUM) Type;
 string Value;
 unsigned int Len;
 bool bNull;
 и т. п...
}
т.е
vector<CObjProper> - это список полей(свойств) описывающих текущую структуру
vector<CObjMember> - это членый структуры(переменные), где каждый член содержит 1 или несколько св-в из vector<CObjProper>.
CObjMember - единица структуры(переменная)

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


как-то так, если я правильно понял задчу...
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.12.2013, 16:00  [ТС] 7
Цитата Сообщение от Aloir Посмотреть сообщение
я предлагаю примерно так сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct CObject{
 vector<CObjProper> properties;
 vector<CObjMember> members;
 ...
}
 
 
где CObjProper например
struct CObjProper{
 string Name;
 string(ENUM) Type;
 string Value;
 unsigned int Len;
 bool bNull;
 и т. п...
}
т.е
vector<CObjProper> - это список полей(свойств) описывающих текущую структуру
vector<CObjMember> - это членый структуры(переменные), где каждый член содержит 1 или несколько св-в из vector<CObjProper>.
CObjMember - единица структуры(переменная)

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


как-то так, если я правильно понял задчу...
Честно, смотрю и ничего не понимаю, т.к. недолюбливаю классы и естественно из за вкуса мозг его не воспринимает.
Суть моей так сказать инициативы было создать матрицу, с возможностью изменять кол-во строк и столбцов в нём, при этом чтоб так же можно было бы перед вводом и созданием данной - определять тип аргументов в каждой(допустим) колонке.
Честно ваш код мне не сильно помог, легче голову свернуть (лично мне так будет проще, т.к. знаю как буду выворачивать) в переопределениях указателей (хотя с указателями ещё особо не встречался) к вложенным десяткам структур описывающих типовые переменные.

Добавлено через 2 часа 9 минут
Частично я так понимаю что это вложенные структуры и примерно это - несколько переменных в объекте: тип, имя, значение. Это в вложенной структуре CObjProper.
Вектор, это как говорит яндекс на 2 месте по запросу "C++ вектор":
последовательность контейнеров, представляющие динамические массивы...
Только вы через структуру, а не через класс сделали, как в большинстве примеров к векторам..

Добавлено через 2 часа 3 минуты
Нарыл темку здесь на сайте: Как создать динамический массив структур?
Пишут в 7 посте:
Вектор возвращает ссылку на свой объект.
Если он возвращает ссылку на реальный объект - вы получаете доступ к этому объекту по этой ссылке.

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

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

Поэтому, если по задаче перемещать объекты туда-сюда не нужно, лучше просто хранить в векторе сам объект.
...
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
28.12.2013, 17:32 8
Цитата Сообщение от Izual Посмотреть сообщение
Я умею создавать структуры и динамически переопределять их размер.
У меня проблема в том, что в определённый момент, мне нужно например изменить аргументы структуры, тип и значение присвоить. Структура я так понимаю таких возможностей не даёт, вот я и спрашиваю что даёт такую возможность.
Про дерево, даже с учётом примеров, не найдено решение динамического изменения аргументов, т.к. дерево основывается на опр типе данных аргументов, что уже не даёт решения поставленной головоломки.
На деревьях построены множество современных СУБД. То что вы не знаете АТД недочет вашего образования. Динамика позволяет иметь узлы дерева любого типа.
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
28.12.2013, 19:22 9
Aloir, предложенный вами вариант слишком сложен и требует переписывания существующих классов, чтобы их можно было хранить в вашем хранилище.

Dmitriy_M, деревья никоем образом не решают задачу хранения гетерогенных значений.

Izual, как бы вы не старались на Си у вас получится невнятная типонебезопасная лапша. На С++ написать адекватное решение шансов больше, к примеру можете посмотреть в сторону std::tuple. Вот вам пример: http://ideone.com/carVr0.
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.12.2013, 19:45 10
Цитата Сообщение от Izual Посмотреть сообщение
создать матрицу, с возможностью изменять кол-во строк и столбцов
Динамический массив, элементы которого также динамические массивы. Тип аргумента неважен и может быть своим у каждого элемента коллекции. Если требуется "прямоугольность", допишете еще код контроля вставки/удаления одновременно во все колонки (построчно). Если элементов немного, вместо динамического массива можно использовать список.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.12.2013, 22:59  [ТС] 11
Динамический массив, элементы которого также динамические массивы.
Так и надо, только чтоб к ним удобно можно было бы обращяться, как к членам структуры.
Тип аргумента неважен и может быть своим у каждого элемента коллекции.
Если реализовывать структуры в структуре то так и можно сделать, при этом дочерняя структура собирает все переменные, а главная к ним обращяется, получая тип, №ij и данные.
Если требуется "прямоугольность", допишете еще код контроля вставки/удаления одновременно во все колонки (построчно). Если элементов немного, вместо динамического массива можно использовать список.
Ну я думаю отталкиваться от кол-ва строк и столбцов как 2-ух чисел, на основе их - динамически создавать массив структур, соответсвующюю кол-ву строк. А кол-во столбцов, должно быть описанно как число, на котором основывается кол-во аргументов род. структуры (хотябы ссылки родительской структуры на дочернюю).
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.12.2013, 23:33 12
Вы бы определились: "шашечки или ехать".

Структура - это указание на фиксированный сдвиг адресов, известный до компиляции. Если вы можете заранее статически описать эту таблицу, никакие динамические массивы уже не нужны.

И наоборот, если это невозможно сделать статически, то и представление объекта должно быть динамическим.

В C есть все для удобной работы с указателями. Попытка описать работу с натурально динамическим типом как с псевдостатическим, выглядит, на мой взгляд, как стремление задней левой ногой почесать правое ухо.
1
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
29.12.2013, 02:31  [ТС] 13
Цитата Сообщение от gazlan Посмотреть сообщение
Вы бы определились: "шашечки или ехать".

Структура - это указание на фиксированный сдвиг адресов, известный до компиляции. Если вы можете заранее статически описать эту таблицу, никакие динамические массивы уже не нужны.

И наоборот, если это невозможно сделать статически, то и представление объекта должно быть динамическим.

В C есть все для удобной работы с указателями. Попытка описать работу с натурально динамическим типом как с псевдостатическим, выглядит, на мой взгляд, как стремление задней левой ногой почесать правое ухо.
Вы углубляете в мне лично не нужные факты о том что структура структурированна таким образом, что ячейки смежны между переменными, что облегчает вычислительные процессы, т.к. адрес вычисляется быстрее... Но мне структура нужна для "красоты кода", т.е. просто объединить данные одним полем (именем структуры).
Статически не могу, потому и спрашиваю как лучше сделать, при этом не ударяясь желательно в классы и производные от них, т.к. читабильность кода с использованием классов очень тяжела, именно из за классов многие программисты останавливаются как показала практика.
Динамический массив указателей можно в структуру засунуть? ( если нет, то как тогда мне кол-во столбцов сделать динамическим? )
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
29.12.2013, 03:15 14
Цитата Сообщение от Izual Посмотреть сообщение
именно из-за классов многие программисты останавливаются
OOP - именно способ снижения сложности за счет декомпозиции. Понятно, что количество Мирового Зла неизменно, но иногда бывает выгодно обменять одни проблемы на другие.

Сентенция о "красоте кода" мне осталась непонятной. Мнимая разница между структурой и классом - только дань обратной совместимости (видимость членов по умолчанию). Назовете вы это структрой или классом, не имеет ни малейшего значения.

"Засунуть" можно и массив в структуру и структуру в массив, и LoL (List of Lists) столь древняя вещь, что была известна, наверное, еще в Древнем Вавилоне. Контейнеры для того и существуют, чтобы помещать в них другие вещи, в том числе, и другие контейнеры. Использование для списка двух отдельных малоразличимых сущностей - структуры и массива - просто уступка оптимизации.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
29.12.2013, 16:02  [ТС] 15
Цитата Сообщение от gazlan Посмотреть сообщение
OOP - именно способ снижения сложности за счет декомпозиции. Понятно, что количество Мирового Зла неизменно, но иногда бывает выгодно обменять одни проблемы на другие.

Сентенция о "красоте кода" мне осталась непонятной. Мнимая разница между структурой и классом - только дань обратной совместимости (видимость членов по умолчанию). Назовете вы это структрой или классом, не имеет ни малейшего значения.

"Засунуть" можно и массив в структуру и структуру в массив, и LoL (List of Lists) столь древняя вещь, что была известна, наверное, еще в Древнем Вавилоне. Контейнеры для того и существуют, чтобы помещать в них другие вещи, в том числе, и другие контейнеры. Использование для списка двух отдельных малоразличимых сущностей - структуры и массива - просто уступка оптимизации.
1. Изменно, т.к. чем меньше людей подвержены как указывает ваша подписка из библии, неразумности, тем меньше зла (как не правильных действий, причиной появления которых служит не совершенный способ познания мира и соотв. самих знаний). Менять шило на мыло, это как выгребать воду черпаком из дырявой лодки, вместо того чтоб заделать течь.
2. На первой странице у человека такая подписка:
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. Мартин Фаулер
С чем я полностью согласен, потому я и делаю код таким, чтоб он был понятен, если например потребуется его изменить через 2 года, но вы уже не помните где куда прикручено. К тому же, как я прежде говорил простота в обращении к структурам несоизмерима по сравнению с грамматикой классов.(намного проще обращяться через точку, нежели через всякие стрелочки, двоеточия и т.п. муть, которую не то что не запомниш, не поймёш даже).
А раз уж разницы нет, то тем более, буду структуры и дальше использовать, дабы не забивать насущными "профессиональными" проблемами голову.
3. По поводу Вавилона, лучше промолчу, туда же, раз был в контексте упамянут Список в принадлежности...
А вот структура в структуре очень актуальная вещь, только вот пока что всё таки не ясно как организовать реально динамический способ задания кол-ва эл-ов и обращения к ним (возможно придётся всё же динамическую матрицу делать), а в структуре хранить (указатели)адреса к ним(для удобства обращения к эл-ам).
Хотя с указателями будет запара, т.к. удобная форма изменения переменных в структуре будет потеряна, и придётся писать отдельную функцию для изменения переменной в матрице, а потом уже и корректировка указателя(хотя пока что знаний про указатели не хватает, ну буду штрудировать, тем более что выход как я вижу не богат, уж лучше так имхо, чем заморачиваться векторами и классами, хотя я и без знаний основных принципов ООП их так сказать реализую через нутро).

П.С. Всем большое спасибо за объяснения, но всё же хочу вернуться к теме, а именно к структуре и динамическим изменением её членов...
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
31.12.2013, 02:51  [ТС] 16
В рое тем, отыскал одну Как создать динамический массив структур?
где есть интересные фразы:
3. Создание объекта абы-где ведёт к фрагментации памяти, и падению производительности из-за кэш промахов и тп. Поэтому, однотипные объекты выгоднее держать в едином блоке данных.
Можно ли это применить в контексте с структурами? (и делать отдельные структуры для используемых типов, обращяться к ним через указатель?)
0
31.12.2013, 02:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2013, 02:51
Помогаю со студенческими работами здесь

vector в структуре: возможно?
могу ли я, объявляя структуру, написать так: struct A { vector&lt;char&gt; v; ......... }; ...

подсчёт кол-ва положительных членов
подскажите пожалуйста, как реализовать вот что: имеется массив, заполненный случайными цифрами....

Составить программу вычисления N- кол-ва членов числовой последовательност
Составить программу вычисления N- кол-ва членов числовой последовательности, которая задается...

Определить кол-во членов последовательности являющихся удвоенными не четными числами
Люди добрые,помогите,пожалуйста!Даны натуральные числа n, a1, a2, ..., an.Определить кол-во членов...

Определить кол-во членов последовательности являющихся квадратами четных чисел
Даны натуральные числа n,a1,a2,...an Определить кол-во членов последовательности являющихся...

Даны натуральные числа n, a1., an. Определить кол-во членов ak последовательности a1,.an удовлетворяющих условию ai<5
Помогите решить задачу: 1) Даны натуральные числа n, a1..., an. Определить кол-во членов ak...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru