Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / динамическое создание структуры / 10 сообщений из 10, страница 1 из 1
30.11.2004, 18:21
    #32806499
fann
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическое создание структуры
Народ подскажите плиз, как создать структуру, если неизвестно ее содержание. т.е. предполагается что юзер введет поля и их типы.
...
Рейтинг: 0 / 0
01.12.2004, 10:41
    #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
01.12.2004, 14:53
    #32807755
DarkCat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическое создание структуры
или юзать тип Variant...

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

СПАСИБО !!!
...
Рейтинг: 0 / 0
06.12.2004, 10:51
    #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
06.12.2004, 13:23
    #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
06.12.2004, 13:27
    #32814327
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
динамическое создание структуры
Siebentearbeit авторНикак
Рассказываю:

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

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

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


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