Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> N-мернный динамический массив, Как создать? 
:(
    Опции темы
Sunvas
  Дата 7.2.2007, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Нужно динамически создать N-мерный динамический массив (N вводит пользователь). Что-то никак не придумаю как.  smile   smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
MetalFan
Дата 7.2.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



VarArrayCreate ?
разве что вместо дин.массива - вариантный)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Voyager
Дата 7.2.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



Код

var
  a:array of integer;
...
SetLength(a,10);
a[0]:=1;
...
a[9]:=10;

PM   Вверх
Sunvas
Дата 7.2.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(MetalFan @  7.2.2007,  16:07 Найти цитируемый пост)
VarArrayCreate ?

Честно говоря не очень понял как им юзать.

Voyager, твой пример - это не многомерный массив, а просто динамический.
-----------------------
Постараюсь объяснить суть.
Есть массив A целых чисел, надо сделать его многомерным. Причем надо динамически изменять количество его измерений.
Например:
N=2, у массива 2 измерения - обращаться к конкретному элементу надо так A[1,1]
N=3, у массива 3 измерения - обращаться к конкретному элементу надо так A[1,1,1]
N=4, у массива 4 имзерения - обращаться к конкретному элементу надо так A[1,1,1,1]
И т.д.



--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
ivan219
Дата 7.2.2007, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Может сразу выделить по болше
Код

var
   A: Array of Array of Array  ....... of Integer;
SetLength(A,10,10,10......);


А так новерное надо тип какойто хитрый делать если это вобще возможно smile 

А може с файлом работать и все данные в фаил скидывать по определённой структуре потом от туда брать.
PM MAIL ICQ   Вверх
Sunvas
Дата 7.2.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(ivan219 @  7.2.2007,  20:45 Найти цитируемый пост)
Может сразу выделить по болше

Это мне кажется неправильным подоходом к проблемме. Поскольку иногда может использоваться 1 измерение, а иногда 50. Ну не буду же я 50 писать array of. 

Цитата(ivan219 @  7.2.2007,  20:45 Найти цитируемый пост)
А так новерное надо тип какойто хитрый делать если это вобще возможно  

Поэтому и создал тему. А в VB такое возможно, кстати.  smile 


Цитата(ivan219 @  7.2.2007,  20:45 Найти цитируемый пост)
А може с файлом работать и все данные в фаил скидывать по определённой структуре потом от туда брать.

Если будет 50 измерений и по 3 элемента в каждом, то вряд-ли через файл работать как-то чревато.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
pushok
Дата 7.2.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



может поможет:
http://vingrad.ru/DELPHI-DLP-000250

где-то слышал, что нельзя придумать задачу, для решения которой потребовалось бы больше 8-ми измерений.
может приведешь пример?
PM ICQ   Вверх
Sunvas
Дата 7.2.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(pushok @  7.2.2007,  20:55 Найти цитируемый пост)
может поможет:

Не помогло.
Цитата(pushok @  7.2.2007,  20:55 Найти цитируемый пост)
где-то слышал, что нельзя придумать задачу, для решения которой потребовалось бы больше 8-ми измерений.
может приведешь пример?

Интересно услышать доказательство этой теоремы. В моем же случае ситуация проста: препод по программированию.  smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
ivan219
Дата 7.2.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 2
Всего: 12



Цитата(Sunvas @  7.2.2007,  20:49 Найти цитируемый пост)
Если будет 50 измерений и по 3 элемента в каждом, то вряд-ли через файл работать как-то чревато.

Почему если взять одно измерение это строка а элементы это символы в строке то нетак уж и черевато получится.
50 строк по 3 элемента:
Код

10 12 15
.
.
45 56 43


Или на оборот 50 элементов и 3 строки:
Код

12 34....56
.
23 45....57


Загнать всё это в динамический массив и потом программно раскидывать взависимости от числа N/

Добавлено @ 21:33 
Цитата(Sunvas @  7.2.2007,  20:49 Найти цитируемый пост)
А в VB такое возможно, кстати.

Так может в нём Dll написать и потом сней работать smile
PM MAIL ICQ   Вверх
aktuba
Дата 7.2.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Код

type
  TArray = array of integer;

var
  lRec: array of TArray;

SetLength(lRec, N);
for i := 0 to N - 1 do
  SetLength(lRec[i], N);


Первое, что пришло в голову...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
Sunvas
Дата 7.2.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



aktuba, и у тебя получился двумерный массив!


ivan219, неудобно будет тогда работать с таким массивом - ведь все обращения к массиву придется делать функциями/процедурами для записи/чтения данных из файла.

Написать ДЛЛ как вариант возможно, но хотелось бы все сделать на Делфи.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
pushok
Дата 7.2.2007, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 7.2.2007

Репутация: нет
Всего: нет



пока только для многомерного массива, кол-во элементов которого в каждом измерении одинаково
( при N=2 массив квадратный
 N=3 - кубический)

Код

type
 tarray=array of integer;

var
 d:tarray;         // Массив содержащий элементы нашего многомерного массива
 vector:tarray; // наша вектор строка. для обращения к элементу многомерного массива
 a:integer;       // размерность массива

function degree(n,m:integer):integer;    // Возвращает чтсло n в m-ной положительной степени 
var
 i:integer;
begin
 result:=1;
 for i:=1 to m do
  result:=result*n;
end;

procedure set_dim_count(n:integer);
begin
setlength(vector,degree(a,n));
end;

function get_value(vect:tarray):integer; // Возвращает элемент многомерного массива
var
 i,k:integer;
begin
 k:=0;
 for i:=0 to high(vect) do
  k:=k+degree(a,i)*vect[i];
 result:=d[k];
end;

procedure set_value(vect:tarray;value:integer) // Задает элемент многомерного массива
var
 i,k:integer;
begin
 k:=0;
 for i:=0 to high(vect) do
  k:=k+degree(a,i)*vect[i];
 d[k]:=value;
end;



т.е. если у нас есть 4-х мерный массив, то чтобы обратиться к его элементу [1,2,1,2] мы должны заполнить массив vector, например
 vect[0]:=1;
 vect[1]:=2;
 vect[2]:=1;
 vect[3]:=2;
а после вызвать функцию get_value(vector) которая нам вернет значение этого элемента
записывать значение аналогично set_value(vector,5).
например вот так.

а если ты хочешь чтобы измерения имели разную размерность, то наверно будет так:
Код

...
sizes:tarray; // массив, задающий кол-во элементов в каждом измерении
// length(sizes)=n+1, длина sizes на единицу больше кол-ва измерений
// sizes[0] - всегда равен 1
//
...
sizes[0]:=1;
...
procedure set_dim_count(n:integer);
var
 i,k:integer;
begin
 setlength(sizes,n);
 k:=1;
 for i:=0 to high(sizes) do
  k:=k*sizes[i];
setlength(vector,k);
end;
...
procedure set_value(vect:tarray;value:integer) // Задает элемент многомерного массива
var
 i,k,r:integer;
begin
 k:=0;
 r:=1;
 for i:=0 to high(vect) do
  begin
  r:=r*sizes[i];
  k:=k+r*vect[i];
 d[k]:=value;
end;
...


Это сообщение отредактировал(а) pushok - 8.2.2007, 18:38
PM ICQ   Вверх
MetalFan
Дата 7.2.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Sunvas, а что с VarArrayCreate то неясно?
вот примитивный пример:
Код

var
  lDimCount: Integer;
  lDims: array of Integer;
  lVarArray: Variant;
  i: Integer;
begin
  //допустим нам нужен 4х мерный массив
  lDimCount := 4;
  // задаем массив измерений для будущего varinat-массива
  SetLength( lDims, lDimCount * 2 );
  i := 0;
  while i< (lDimCount*2) do
  begin
    lDims[i] := 0; //от 0
    Inc(i);
    lDims[i] := 10; //до 10
    Inc(i);
  end;
  lVarArray := VarArrayCreate( lDims, varByte);
  lVarArray[5,5,5,5] := 10;
  ShowMessage( VarToStr(lVarArray[5,5,5,5]));



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Sunvas
Дата 7.2.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



MetalFan, уже более, что мне надо.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
MetalFan
Дата 7.2.2007, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Sunvas,  smile 
только потом про VarClear не забыть...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.