
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
30.11.2004, 18:21
|
|||
|---|---|---|---|
|
|||
динамическое создание структуры |
|||
|
#18+
Народ подскажите плиз, как создать структуру, если неизвестно ее содержание. т.е. предполагается что юзер введет поля и их типы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2004, 10:41
|
|||
|---|---|---|---|
динамическое создание структуры |
|||
|
#18+
Никак. Т.е. именно создать структуру тебе не удастся, это тебе не интерпретатор. (ну чтобы был бы у тебя тип данных такой, чтобы поля у нее были бы определенные). Но написать программу, которая будет хранить данные заранее неизвестной структуры естественно можно, нужно выделять самому память, следить за правильным расположением полей в ней и за удалением этой памяти. Более детально - ну не знаю , что тебе надо. #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; //... Ну и так далее ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2004, 15:28
|
|||
|---|---|---|---|
|
|||
динамическое создание структуры |
|||
|
#18+
хм ... а как лучше создать таблицу? то есть как бы свою субд, где необходимо запоминать все поля и типы таблицы, которые юзер выберет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
01.12.2004, 18:43
|
|||
|---|---|---|---|
динамическое создание структуры |
|||
|
#18+
А почти то же самое - сначала делаешь структуру в памяти произвольной структуры (запись), затем делаешь вторую такую же, поля в которой - экземпляры первой (это страница ), потом учишься записывать вторую структуру на диск (в файл). И все, готово. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
02.12.2004, 16:38
|
|||
|---|---|---|---|
|
|||
динамическое создание структуры |
|||
|
#18+
а можно подробней? : например юзер выбрал поле1, типа int и поле 2, типа char. Как разместить это в памяти и к ней потом обратиться? Как потом удалить одно из полей? СПАСИБО !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.12.2004, 10:51
|
|||
|---|---|---|---|
|
|||
динамическое создание структуры |
|||
|
#18+
авторНикак Как. А между прочим... 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.12.2004, 13:23
|
|||
|---|---|---|---|
динамическое создание структуры |
|||
|
#18+
При чем здесь 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; //... // это - одно конкретное поле. Что еще -то надо - не понимаю. >Как потом удалить одно из полей? последующие поля сместить вниз (в сторону меньших адресов) на размер этого поля. Не забыть также удалить поле из описания записи. Можно также перевыделить память (по меньшему размеру) и переписать запись туда, а старую память соотв. удалить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.12.2004, 13:27
|
|||
|---|---|---|---|
динамическое создание структуры |
|||
|
#18+
Siebentearbeit авторНикак Рассказываю: Сначала надо завести таблицу указателей на, например, _variant_t - потом Описаное называется std::map< std::string, _variant_t > operator . не переопределяется в C++. Или какой другой язык имеете в виду ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&mobile=1&tid=2034020]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 195ms |
| total: | 344ms |

| 0 / 0 |
