C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как использовать ГЛОБАЛЬНО динамический массив ??, возможно глупый вопрос — но ...
faq
Отправлено: 15.01.2004, 18:24


Не зарегистрирован







возможно глупый вопрос, но столкнулся с такой проблемой(из за этого застопорился на одном месте — и в доках нигде такой случай не описывается): нужно глобально работать с многомерным массивом у которого заранее не известна размерность (которая может отличатся на несколько порядков).
Чтобы глобально работал массив его нужно глобально объявить в коде — это можно сделать непосредственно указав его размер (500х600) допустим ... но он же может быть и 3х4 размером ...
и еще сюда же: как решить такую же проблему с массивами ВНУТРИ структур ..., к примеру:
strict Tstruct
{
...
};

struct Tb
{
...
Tstruct mass[??]  — массив структур неизвестной размерности
...
};
подскажите плиз ...
заранее благодарен ...
fellow
Отправлено: 15.01.2004, 21:04


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Объявите глобально указатель на массив. По мере необходимости выделите ему память, сколько потребуется, а затем используйте. Массивы внутри структуры тоже объявляйте как указатели:
struct Tb
{
...
Tstruct* mass; //массив структур неизвестной размерности
...
};
и тоже выделяйте память по необходимости.
Другая альтернатива — используйте vector и прочие стандартные контейнеры.
Георгий
Отправлено: 15.01.2004, 22:16


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



несмотря на хороший ответ fellow мне хочется уточнить:
1. неизвестно чисто измерений (массив 2*10 или 3*15*45*2*666)?
2. неизвестна размерность при известном числе измерений (массив x*y*z где x,y,z определены во время работы программы)?
faq
Отправлено: 16.01.2004, 11:30


Не зарегистрирован







-> fellow
Спасибо за разъяснения ... можно какой-нибудь примерчик небольшой ??
-> Георгий
Разумное уточнение.
Заранее известно число измерений (x,y) и (x,y,z,) — не известна размерность ...
может подскажите как решить данную проблему при неизвестной размерности и так же неизвестном числе измерений ?? желательно с примернами
заранее благодарен ...

Bond
Отправлено: 16.01.2004, 14:26


Станционный диспетчер

Группа: Участник
Сообщений: 142



Для размерности 2:

//переменная массив
int *mas;
//надо 2-мерный 3x4
int n1 = 3, n2 = 4;
//выделяем память
mas = new int[n1 * n2];
if(mas==NULL) return;
//берем елемент [i, j]
int i = 1, j = 2;
int k = mas[n1*i + j];

//не забываем освобождать память в конце работы
delete[] mas;

Это простой пример. Для динамического изменения мерности массива используй массив int Deep[N], где N — максимальная величина мерности, а Deep[i] — количество елементов на уровне (n1, n2, ... nN). При изменении мерности не забывай освобождать заранее занятую память.
Bond
Отправлено: 16.01.2004, 14:30


Станционный диспетчер

Группа: Участник
Сообщений: 142



И еще. Если доступ к некоему елементу реализовать через функцию, то передачу индексов можно сделать через массив Index[N], где N — максимальная мерность массива, а Index[i] — индекс соответствующего уровня мерности искомого элемента.

P.S. Забыл — тебе еще нужна переменная, которая зранит значение текущей мерности массива
Doga
  Отправлено: 16.01.2004, 15:18


Не зарегистрирован







Проще восползоваться классом TList из библиотеки VCL.

Всегда позволит добавить нужное колличество элементов (либо удалить ненужное), причём в любе место biggrin.gif

Свойство Count обеспечивает контроль за размерностью массива.

Элементами могут быть указатели любого типа (причём одновременно!)
и даже указатели на собственнй класс TList, что очень удобно для создания многомерных массивов.

[CODE]

#include

TList *List = new TList();

List->Add(new double[100]);
List->Add(new int[10000][5]);
List->Add(new bool(false));
List->Add(new TList());
((TList *)List->Last())->Add(char[80]);
...

((double *)List->Items[0])[10] = 1.5;

double Value = ((double *)List->Items[0])[10];

...

delete[] (double *)List->Items[0];
List->Delete(0);

...

delete List;



Есть ещё один класс для таких случаев — valarray из библиотеки STL (Standard C++ Library)


[CODE]

#include
using std::valarray;
valarray v1; // construct an empty valarray
valarray v2(1,3); // construct a valarray of three
// elements, all initialized to 1
v1.resize(3,2); // resize the first valarray to
// three elements, all initialized to 2
valarray v3(v1); // v3 gets a copy of v1's elements.


Смотрите ХЭЛП и выбирайте smile.gif
fellow
Отправлено: 16.01.2004, 18:12


Дежурный стрелочник

Группа: Участник
Сообщений: 33



Извините, вот так с ходу примерчиков нет. Впрочем, коллеги уже написали кое-чего. В добавок к valarray из стандартной библиотеки хочу упомянуть slice (срез) из той же стандартной библиотеки. vector и valarray являются одномерными массивами. Для того, чтобы превратить их в многомерные, предназначены срезы. Подробности смотрите в подсказке по стандартной библиотеке или в книге Страуструпа, которую можно найти в электронном виде: http://anatolix.naumen.ru/books.htm
faq
Отправлено: 16.01.2004, 19:03


Не зарегистрирован







всем большое спасибо — пойду домой прикручивать smile.gif))

Вернуться в Вопросы программирования в C++Builder