Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

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

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

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

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

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

Добавлено через 19 часов 49 минут
Может просто работать массивами с опр типом создавать их динамически?.. Жаль такой код будет не прост в понимании в отличии от массивов...
Кстати подумал, может используя указатели совместить возможности динамических массивов, но ссылаться к элементам через структуру?(например содержащяя в себе тип переменной, имя и ссылку на реальный объект созданный динамически). Даже может через вложенные структуры. Или есть более подходящий способ работы с смешанными данными, определяемыми в кол-ве и качестве(типу и самим данным)? Может какие то методы пропустил.(кстати, если предлагаете классы, чего я не хочу делать, ибо со структурой мне лично легче работать, то описывайте разницу в возможностях, которая может стать решающей, если других методов не найдётся)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2013, 11:39
Ответы с готовыми решениями:

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

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

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

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

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
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.12.2013, 16:00  [ТС]
Цитата Сообщение от 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
Цитата Сообщение от Izual Посмотреть сообщение
Я умею создавать структуры и динамически переопределять их размер.
У меня проблема в том, что в определённый момент, мне нужно например изменить аргументы структуры, тип и значение присвоить. Структура я так понимаю таких возможностей не даёт, вот я и спрашиваю что даёт такую возможность.
Про дерево, даже с учётом примеров, не найдено решение динамического изменения аргументов, т.к. дерево основывается на опр типе данных аргументов, что уже не даёт решения поставленной головоломки.
На деревьях построены множество современных СУБД. То что вы не знаете АТД недочет вашего образования. Динамика позволяет иметь узлы дерева любого типа.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
28.12.2013, 19:22
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
Цитата Сообщение от Izual Посмотреть сообщение
создать матрицу, с возможностью изменять кол-во строк и столбцов
Динамический массив, элементы которого также динамические массивы. Тип аргумента неважен и может быть своим у каждого элемента коллекции. Если требуется "прямоугольность", допишете еще код контроля вставки/удаления одновременно во все колонки (построчно). Если элементов немного, вместо динамического массива можно использовать список.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.12.2013, 22:59  [ТС]
Динамический массив, элементы которого также динамические массивы.
Так и надо, только чтоб к ним удобно можно было бы обращяться, как к членам структуры.
Тип аргумента неважен и может быть своим у каждого элемента коллекции.
Если реализовывать структуры в структуре то так и можно сделать, при этом дочерняя структура собирает все переменные, а главная к ним обращяется, получая тип, №ij и данные.
Если требуется "прямоугольность", допишете еще код контроля вставки/удаления одновременно во все колонки (построчно). Если элементов немного, вместо динамического массива можно использовать список.
Ну я думаю отталкиваться от кол-ва строк и столбцов как 2-ух чисел, на основе их - динамически создавать массив структур, соответсвующюю кол-ву строк. А кол-во столбцов, должно быть описанно как число, на котором основывается кол-во аргументов род. структуры (хотябы ссылки родительской структуры на дочернюю).
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
28.12.2013, 23:33
Вы бы определились: "шашечки или ехать".

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

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

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

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

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

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

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

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

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

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

П.С. Всем большое спасибо за объяснения, но всё же хочу вернуться к теме, а именно к структуре и динамическим изменением её членов...
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
31.12.2013, 02:51  [ТС]
В рое тем, отыскал одну Как создать динамический массив структур?
где есть интересные фразы:
3. Создание объекта абы-где ведёт к фрагментации памяти, и падению производительности из-за кэш промахов и тп. Поэтому, однотипные объекты выгоднее держать в едином блоке данных.
Можно ли это применить в контексте с структурами? (и делать отдельные структуры для используемых типов, обращяться к ним через указатель?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
31.12.2013, 02:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru