powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание структуры
10 сообщений из 10, страница 1 из 1
динамическое создание структуры
    #32806499
fann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ подскажите плиз, как создать структуру, если неизвестно ее содержание. т.е. предполагается что юзер введет поля и их типы.
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32807073
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никак. Т.е. именно создать структуру тебе не удастся, это тебе не интерпретатор. (ну чтобы был бы у тебя тип данных такой, чтобы поля у нее были бы определенные).

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

#define BYTE unsigned char

size_t ssize = ...;
void * pData = new BYTE[ssize]; // или malloc( ssize );
...
size_t IntField1Offset = ...;
int *pIntField1 = reinterpret_cast<int*>( pData + IntField1Offset );
*pIntField1 = 256; //...

Ну и так далее ...
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32807755
Фотография DarkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или юзать тип Variant...

...
Рейтинг: 0 / 0
динамическое создание структуры
    #32807845
fann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хм ... а как лучше создать таблицу? то есть как бы свою субд, где необходимо запоминать все поля и типы таблицы, которые юзер выберет?
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32808336
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почти то же самое - сначала делаешь структуру в памяти произвольной структуры (запись), затем делаешь вторую такую же, поля в которой - экземпляры первой (это страница ), потом учишься записывать вторую структуру на диск (в файл). И все, готово.
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32810130
fann
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а можно подробней? :
например юзер выбрал поле1, типа int и поле 2, типа char.
Как разместить это в памяти и к ней потом обратиться?
Как потом удалить одно из полей?

СПАСИБО !!!
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32813900
Siebentearbeit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНикак
Как.

А между прочим... JScript поддерживает динамические классы и не жужжит.

Рассказываю:

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

Потом сделать (закрытые) методы добавления/удаления туда объектов.

Если это трудно - берём вектор из STL и забываем про голову о динамике:

vector<_variant_t*> vDynVars;
а на самом деле

vector<_variant_struct*> vDynVars;
где

struct _variant_struct
{
_variant_t m_var;
CString m_name; //опять же для простоты, в Win32API Придётся делать руками...
}

Ура. Подготовились.

Теперь, надо подумать о том, чё захочет юзер...

Для этого переопределим оператор "." (и "->" для указателя)
_variant_t& нашкласс::operator . (LPCTSTR myname)
{
тут мы бежим по массиву vDynVars и проверяем имена на тему
myname == m_name
если нашли - у данного объекта уже есть такой элемент -> возвращаем его m_var
если не нашли - создаём pVS = new _variant_struct
pVS.m_name = myname;
pVS.m_var = пустой вариант.
и возвращаем pVS.m_var
}

Вот в общих чертах приседания по этому поводу.

А ещё можно посмотреть, как это сделано в JScript
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32814313
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При чем здесь variant_t - то ?
Вообще ни при чем.

>например юзер выбрал поле1, типа int и поле 2, типа char.

Не знаю, где кто что так у тебя выбрал, у тебя должно быть
полное описание твоей записи, в виде структуры или класса,
вероятно.

как минимум, для каждого поля ты должен хранить
название поля или номер поля ( какой-то идентификатор )

тип хранимых данных

размер поля

смещение начала поля от начала записи ( хотя его можно и
вычислять на ходу - сложить размеры всех предыдущих полей)

и может еще что-то

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

>Как разместить это в памяти и к ней потом обратиться?

Я ж писал.

#define BYTE unsigned char

size_t ssize = ...;
void * pData = new BYTE[ssize]; // или malloc( ssize );
// pData - это указатель на всю запись
...
size_t IntField1Offset = ...;
int *pIntField1 = reinterpret_cast<int*>( pData + IntField1Offset );
*pIntField1 = 256; //...
// это - одно конкретное поле.

Что еще -то надо - не понимаю.

>Как потом удалить одно из полей?

последующие поля сместить вниз (в сторону меньших адресов) на размер этого поля. Не забыть также удалить поле из описания записи. Можно также перевыделить память (по меньшему размеру) и переписать запись туда, а старую память соотв. удалить.
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32814327
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siebentearbeit авторНикак
Рассказываю:

Сначала надо завести таблицу указателей на, например, _variant_t - потом

Описаное называется
std::map< std::string, _variant_t >

operator . не переопределяется в C++. Или какой другой язык имеете в виду ?
...
Рейтинг: 0 / 0
динамическое создание структуры
    #32814862
Sie
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sie
Гость
авторoperator . не переопределяется в C++.
Хренсним, тогда "->"
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание структуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]