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.
Всегда позволит добавить нужное колличество элементов (либо удалить ненужное), причём в любе место
Свойство 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.
Смотрите ХЭЛП и выбирайте |
|
fellow |
Отправлено: 16.01.2004, 18:12 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 33
|
Извините, вот так с ходу примерчиков нет. Впрочем, коллеги уже написали кое-чего. В добавок к valarray из стандартной библиотеки хочу упомянуть slice (срез) из той же стандартной библиотеки. vector и valarray являются одномерными массивами. Для того, чтобы превратить их в многомерные, предназначены срезы. Подробности смотрите в подсказке по стандартной библиотеке или в книге Страуструпа, которую можно найти в электронном виде: http://anatolix.naumen.ru/books.htm
|
|
faq |
Отправлено: 16.01.2004, 19:03 |
|
Не зарегистрирован
|
всем большое спасибо — пойду домой прикручивать )) |
|