Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Структура


Автор: kline2005 7.2.2005, 13:26
Братцы, кто нибудь знает как программно
(во время выполнения) создать и заполнить структуры?

Автор: Peter 7.2.2005, 13:40
Непонятно, что имеется в виду.
Можно написать функции, прицепить их к кнопочкам, например. В функции динамически создавать структуры и заполнять. Потом не забыть поудалять с помощью delete.
Код
struct STRU {... /* состав структуры */};

void MakeStructExample(){
STRU *pSTRU = new STRU;
...
}

Автор: kline2005 7.2.2005, 14:33
Я имею ввиду именно создание структуры
типа:
char a = Edit1->Text = ...//тип поля
char b = Edit2->Text = ...//длина поля

struct
{
a[b];
};
и т.д.[s]

Автор: JackYF 8.2.2005, 00:46
создавать динамически структуры, не описанные в исходнике, невозможно!

Невозможно создать "то, не знаю что". smile

Автор: Peter 8.2.2005, 09:55
Цитата(JackYF @ 8.2.2005, 00:46)
создавать динамически структуры, не описанные в исходнике, невозможно!

Можно, по крайней мере, выкрутиться следующим образом: держать кучу памяти
Код
void* p = (void*) new WORD[10000];

и интерпретировать, допустим, первые четыре байта как размер структуры, вторые - количество полей, дальше - описание их типов, а все остальное - это данные.

Автор: gepard 8.2.2005, 10:28
Цитата
Можно, по крайней мере, выкрутиться следующим образом: держать кучу памяти

А зачем её держать, если можно в любой момент динамически выделить?
Сам же привёл пример...

А по поводу дин. структур:
Можно...
Допустим нам надо загрузить её из файла, точнее создать из файла...
Содержимое файла:
Цитата

struct my
{
    float my;
    int lop;
}

Теперь в твоей проге-анализаторе, должны быть ссылки, например:
Код

float* float_array;
int* int_array;

С их помощью ты будешь хранить значения переменных. Т.е. когда прог видит надпись float my, она автоматически выделяет память под хранение значения переменной типа float в float_array. Для int'а тоже самое.
Теперь, как обратиться к этой переменной?
У тебя должна быть структура(в самой проге-анализаторе):
Код

struct vars
{
   char name[256];
   void* ptr;
}

Первый аргумент - имя переменной("my"), второй - указатель на область, где храниться эта переменная. Хотя... Можно было без первых массивов... что-то я подзабыл про void*. Ну да ладно... обе реализации возможны...
Когда идёт, например, присвоение переменной нового значения:
Цитата

my = 5.893;

прога-анализатор должна смотерть на имя переменной и идти в соответствующую область памяти для присвоения нового значения.

Автор: IEZ 11.2.2005, 00:46
Цитата(JackYF @ 8.2.2005, 00:46)
создавать динамически структуры, не описанные в исходнике, невозможно!

Громкое заявление.
kline2005
Можно попробовать на основе STL.
Только тебе надо определиться составляешь ты структуру массива переменных или массив структур.
А так подойдет и vector из STLя. smile
Добавлено @ 00:48
Цитата(Peter @ 8.2.2005, 09:55)
Можно, по крайней мере, выкрутиться следующим образом: держать кучу памяти

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

Автор: bel_nikita 11.2.2005, 01:40
Цитата
Братцы, кто нибудь знает как программно
(во время выполнения) создать и заполнить структуры?

Никак. Сначало надо определить, а потом создавать и заполнять эти структуры.

Автор: IEZ 11.2.2005, 10:52
Цитата(bel_nikita @ 11.2.2005, 01:40)
Никак. Сначало надо определить, а потом создавать и заполнять эти структуры.

bel_nikita А зачем тогда придумали VARIANT?
Вот ссылка на эту колбасню, кстати из MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/automat/htm/chap6_7zdz.asp
С помощью которого можно динамически грузить переменные, типы которого ты можешь подгружать.
Ну а скрестив vector с VARIANT, получается std::vector<VARIANT>, то что и требовалось в теме.
А дальше уж kline2005 нужно только самому подумать где и когда это все подгружать. smile

Автор: bel_nikita 11.2.2005, 11:13
IEZ
Приведи пример, пожалуйста:
Цитата
Я имею ввиду именно создание структуры
типа:
Код

char a = Edit1->Text = ...//тип поля
char b = Edit2->Text = ...//длина поля

struct
{
a[b];
};
и т.д.[s]

Автор: IEZ 11.2.2005, 11:40
bel_nikita Ну даже на одних векторах, что-то типа этого:
Код

#include <vector>
using namespace std;

char * a;
char * b;

vector<char *> m_vB;
vector<vector<char *> > m_vA;

strcpy(b, _T("Длина поля"));
m_vB.push_back(b);
m_vA.push_back(m_vB);
smile

P.S. Можно правда и через класс свой забабахать.

Автор: bel_nikita 11.2.2005, 14:39
Дык, это ясно smile

З.Ы.: через VARIANT хотел. Хотел посмотреть, как это юзается smile

Автор: IEZ 12.2.2005, 21:41
Код

VARIANT var;
::VariantInit (&var);
var.vt = VT_I4;
var.lVal = 10;
smile

Автор: Peter 14.2.2005, 10:35
Ведь функции printf, scanf и прочие с неопределенным числом параметров - они же динамически распознают типы. И тут так же сделать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)