Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое создание массива из элементов разных типов / 22 сообщений из 22, страница 1 из 1
22.05.2007, 10:32
    #34541450
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Задача - сабж. Как в программе созадть двумерный массив из элементов (столбцов) разных типов. Количество стоблцов и строк аткже определяется во время выполнения программы. Помогите пжл.
...
Рейтинг: 0 / 0
22.05.2007, 10:37
    #34541464
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
LenieЗадача - сабж. Как в программе созадть двумерный массив из элементов (столбцов) разных типов. Количество стоблцов и строк аткже определяется во время выполнения программы. Помогите пжл.
сделать класс CСell описывающие содержимое ячейки, потом с помощью stl::array загнать его в массив
я бы сделал так
...
Рейтинг: 0 / 0
22.05.2007, 10:42
    #34541481
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
LenieЗадача - сабж. Как в программе созадть двумерный массив из элементов (столбцов) разных типов. Количество стоблцов и строк аткже определяется во время выполнения программы. Помогите пжл.

Отнаследовать классы (типы) столбцов от интерфейса. Создать массив указателей на интерфейсы. За счет полиморфизма они будут вести себя так как надо.

Саттер также рекомендует использовать массив из shared_ptr, которые будут хранить указатели на интерфейсы, т.к. стандарт с++ не декларирует того, что размеры указателей для разных типов будут одинаковы.
...
Рейтинг: 0 / 0
22.05.2007, 11:02
    #34541552
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Cerebrum
сделать класс CСell описывающие содержимое ячейки, потом с помощью stl::array загнать его в массив
я бы сделал так

спасибо

условие - писать на чистом visual c++ без использования библиотек

есть мысль создать массив из типов variant... щас почитаю про этот тип...
...
Рейтинг: 0 / 0
22.05.2007, 11:05
    #34541562
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
спасибо

Akh
Отнаследовать классы (типы) столбцов от интерфейса. Создать массив указателей на интерфейсы. За счет полиморфизма они будут вести себя так как надо.

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

Саттер также рекомендует использовать массив из shared_ptr
извиняюсь, кто такой Саттер?
, которые будут хранить указатели на интерфейсы, т.к. стандарт с++ не декларирует того, что размеры указателей для разных типов будут одинаковы.
...
Рейтинг: 0 / 0
22.05.2007, 11:09
    #34541574
VladimirP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Typedef struct {
int *iArr;
double *dArr;
} stArr, *pstArr;
Class TMyArr
{
protected:
int iN, iM;
public:
pstArr Arrays;
TMyArr ( int n, int m);
~TMyArr();
};
TMyArr::TMyArr( int n, int m)
{
iN = n;
iM = m;
Arrays = new pstArr [n];
for( int i=0; i< n; i++)
{
Arrays->iArr = new int [m];
Arrays->dArr = new double [m];
}
}
TMyArr::TMyArr( )
{
TMyArr( 5,6);
}
TMyArr::~TMyArr( )
{
for( int i=0; i< iN; i++)
{
delete [] Arrays->iArr ;
delete [] Arrays->dArr ;
}
delete [] Arrays;
}
// класс можно не использовать
//если надо писать на С а не на С++ то вместо new && delete используьте malloc && free
// идея должна быть понятна
//у меня возможны ошибки в написании не проверял просто идея
// определяете структуру в ней указатели на ваши элементы
// динамически получаете массив этих структур (строки) и в цикле в каждой структуре жинамически получаете массивы элементов (столбцы)
// когда стали не нужны, то освобождаете память
// обратный порядок в цикле освобождаете массивы элементов а эатем освобождаете массив структур
//
// класс написал длч понятности.
// расписывать дальше его не буду
//сами справитесь
...
Рейтинг: 0 / 0
22.05.2007, 11:32
    #34541650
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Lenieспасибо

[quot Akh]
Отнаследовать классы (типы) столбцов от интерфейса. Создать массив указателей на интерфейсы. За счет полиморфизма они будут вести себя так как надо.

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
//Интерфейс
class ICell {
   public:
      virtual ~Cell() {};
      virtual void printCell() =  0 ;
};

//Реализация текстового
class CellText : public ICell {
   public:
      void setText(char const *text) {/*...*/};
      void printCell() {/**/};
};

//Реализация с картинкой
class CellImage : public ICell {
   public:
      void setImage(unsigned char const *bufImage) {/*...*/};
      void printCell() {/**/};
};

//Сам массив
Cell *(cells[ 2 ]);

//Функция использующая массив с объектами разного типа, но от одного интерфейса
void printCells() {
   for (int i= 0  ; i< 2  ; ++i)
     cells->printCell();
};

//Вся работа
int main() {
   //Создаем объекты
   CellText *text = new CellText();;
   CellImage *image = new CellImage();

   text->setTex("bla-bla");
   image->setImage(/*image*/);

   //Заностим в массив
   cells[ 0 ]=text;
   cells[ 1 ]=image;

   //Выводим на печать используя полиморфизм
   printCells();

   //Убиваем объекты
   delete cells[ 0 ];
   delete cells[ 1 ];

   //Усе
   return  0 ;
}

Не компилил.

Если, что не понятно, не стесняйся

Саттер также рекомендует использовать массив из shared_ptr
извиняюсь, кто такой Саттер?

Буржуйский знаток С++, книги напишет.
...
Рейтинг: 0 / 0
22.05.2007, 11:59
    #34541765
VladimirP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Основной класс обозвали ICell а обращаетесь к нему Cell.
На этапе компиляции ошибки = скорее всег описки или невнимательность.
А мой пример "какой вопрос такой ответ"
...
Рейтинг: 0 / 0
22.05.2007, 12:12
    #34541825
VladimirP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
//Интерфейс
class ICell {
public:
virtual ~ICell() {};
//virtual ~Cell() {};
virtual void printCell() = 0;
};

//Реализация текстового
class CellText : public ICell {
public:
void setText(char const *text) {/*...*/};
void printCell() {/**/};
};

//Реализация с картинкой
class CellImage : public ICell {
public:
void setImage(unsigned char const *bufImage) {/*...*/};
void printCell() {/**/};
};

//Сам массив
ICell *(cells[2]);
//Cell *(cells[2]);

//Функция использующая массив с объектами разного типа, но от одного интерфейса
void printCells() {
for (int i=0 ; i<2 ; ++i)
cells ->printCell();
//cells->printCell();
};

//Вся работа
int main() {
//Создаем объекты
CellText *text = new CellText();;
CellImage *image = new CellImage();

text->setText("bla-bla");
//text->setTex("bla-bla");
image->setImage("image");
//image->setImage(/*image*/);

//Заностим в массив
cells[0]=text;
cells[1]=image;

//Выводим на печать используя полиморфизм
printCells();

//Убиваем объекты
delete cells[0];
delete cells[1];

//Усе
return 0;
}

// компиляция прошла вникать не хочу
...
Рейтинг: 0 / 0
22.05.2007, 12:26
    #34541880
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
VladimirPОсновной класс обозвали ICell а обращаетесь к нему Cell.
На этапе компиляции ошибки = скорее всег описки или невнимательность.
А мой пример "какой вопрос такой ответ"

Опечатки, конечно. Показал смысл.
...
Рейтинг: 0 / 0
22.05.2007, 13:12
    #34542074
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
AkhСаттер также рекомендует использовать массив из shared_ptr, которые будут хранить указатели на интерфейсы, т.к. стандарт с++ не декларирует того, что размеры указателей для разных типов будут одинаковы.э? Вроде указатели на один и тот же интерфейс – одинаковые, во всяком случае, в вс можно явно указать тип наследования класса, хотя он должен сам определить.
...
Рейтинг: 0 / 0
22.05.2007, 15:55
    #34542795
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Всем спасибо, ценю помощь и получение полезной инф-ции.

Вот реализация:

union VALUE
{
unsigned ui_val;
int i_val;
unsigned short us_val;
short s_val;
unsigned char uc_val;
char c_val;
float f_val;
double d_val;
__int64 i64_val;
char *str_val;
};

VALUE **ar = new VALUE* [row_count];

for (int i = 0; i < row_count; i++)
ar = new VALUE [column_count];

ar [10][20].str_val = (char*) some_variable; // пример использования...

for (i = 0; i < row_count; i++)
delete [] ar ;

delete [] ar;
...
Рейтинг: 0 / 0
22.05.2007, 16:39
    #34543015
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
LenieВсем спасибо, ценю помощь и получение полезной инф-ции.

Вот реализация:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
union VALUE
{
	unsigned    ui_val;
	int       i_val;
	unsigned short  us_val;
	short     s_val;
	unsigned char uc_val;
	char      c_val;
	float     f_val;
	double      d_val;
	__int64     i64_val;
	char      *str_val;
};

VALUE **ar = new VALUE* [row_count];

for (int i =  0 ; i < row_count; i++)
	ar [i] = new VALUE [column_count];

ar [ 10 ][ 20 ].str_val = (char*) some_variable;  // пример использования...

for (i =  0 ; i < row_count; i++)
	delete [] ar [i];

delete [] ar;


Интересный финт ушами. А как ты узнаешь, что за тип данных у тебя в ячейке?
...
Рейтинг: 0 / 0
22.05.2007, 17:21
    #34543197
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Akh
Интересный финт ушами. А как ты узнаешь, что за тип данных у тебя в ячейке?

при заполнении массива я его буду знать

виновата О:-), должна была сказать об этом...
...
Рейтинг: 0 / 0
22.05.2007, 20:14
    #34543711
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Если variant освоили, то можно посмотреть на профессиональную реализацию класса, который может содержать в себе значение любого типа (http://www.boost.org/doc/html/any.html).

Пример использования:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// вектор 
std::vector<boost::any> v;

v.push_back(boost:any(std::string("hello"));
v.push_back(boost:any(int( 1999 ));

std::cout << boost::any_cast<std::string>(v[ 0 ]);
std::cout << boost::any_cast<int>(v[ 1 ]);
...
Рейтинг: 0 / 0
22.05.2007, 21:20
    #34543832
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Анатолий ШироковЕсли variant освоили, то можно посмотреть на профессиональную реализацию класса, который может содержать в себе значение любого типа (http://www.boost.org/doc/html/any.html).

Пример использования:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// вектор 
std::vector<boost::any> v;

v.push_back(boost:any(std::string("hello"));
v.push_back(boost:any(int( 1999 ));

std::cout << boost::any_cast<std::string>(v[ 0 ]);
std::cout << boost::any_cast<int>(v[ 1 ]);


variant не освоила из-за альтернативного варианта с union, а за ответ - спасибо!
...
Рейтинг: 0 / 0
22.05.2007, 21:28
    #34543847
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Lenievariant не освоила из-за альтернативного варианта с union, а за ответ - спасибо!А variant это по существу тот же самый union только с дополнительной обвязкой для удобства. В самом примитивном варианте будет примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
enum DATA_TYPES = {CHAR_TYPE, FLOAT_TYPE, INTEGER_TYPE, ..... etc};
struct VALUE {
	enum DATA_TYPES value_type;
	union DATA
	{
		unsigned    ui_val;
		int       i_val;
		unsigned short  us_val;
		short     s_val;
		unsigned char uc_val;
		char      c_val;
		float     f_val;
		double      d_val;
		__int64     i64_val;
		char      *str_val;
	}
};

ar [ 10 ][ 20 ].value_type = CHAR_TYPE;
ar [ 10 ][ 20 ].DATA.str_val = (char*) some_variable;
Все остальное точно как в твоем коде.
...
Рейтинг: 0 / 0
22.05.2007, 22:04
    #34543899
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
утгь еще внутрь структуры спрячь и изврат готов
...
Рейтинг: 0 / 0
23.05.2007, 10:14
    #34544537
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
blindedутгь еще внутрь структуры спрячь и изврат готов


если вам чем-то не нравится код, говорите пжл по существу, чистый гон не принимается

извините, но если бы я нормально знала язык, сюда бы не писала простые вещи...
...
Рейтинг: 0 / 0
23.05.2007, 10:38
    #34544639
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
Я говорю определение enum надо запихать внутрь struct. А не нравится одно - это стиль старого С, так писали 30 лет назад
...
Рейтинг: 0 / 0
23.05.2007, 10:54
    #34544691
Lenie
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
blindedЯ говорю определение enum надо запихать внутрь struct. А не нравится одно - это стиль старого С, так писали 30 лет назад

понятно, спасибо
...
Рейтинг: 0 / 0
23.05.2007, 17:18
    #34546486
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамическое создание массива из элементов разных типов
blindedЯ говорю определение enum надо запихать внутрь struct. А не нравится одно - это стиль старого С, так писали 30 лет назадЗато он очень прост и идеально подходит для объяснения принципов.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Динамическое создание массива из элементов разных типов / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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