Модераторы: 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   Вверх
ivan219
Дата 7.2.2007, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Sunvas @  7.2.2007,  22:11 Найти цитируемый пост)
неудобно будет тогда работать с таким массивом - ведь все обращения к массиву при дется делать функциями/процедурами для записи/чтения данных из файла.

Вовсе нет тебе надо будет создать динамический массив и в нём работать, а когда нужно будет сделать сброс ,то сохранить в файл.
Ну это как вариант если что более универсального не найдёшь.

Добавлено @ 23:25 
А какой тип данных будет в массиве smile

Добавлено @ 23:33 
MetalFan, Ему надо:
Цитата(Sunvas @  7.2.2007,  16:04 Найти цитируемый пост)
N вводит пользователь

А в твоём коде есть привязка обращения к массиву.
Код

lVarArray[5,5,5,5] := 10;

Как это динамически сделать smile 
PM MAIL ICQ   Вверх
MetalFan
Дата 7.2.2007, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ivan219, а что, фантазия/справка не работает? 
я привел пример создания 4х-мерного ВарМассива по 11 элементов в каждом измерении. 
а как обращаться - это уже частность. как хошь, так и обращайся.
з.ы. например с пом. VarArrayGet


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


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


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

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



Цитата(ivan219 @  7.2.2007,  23:21 Найти цитируемый пост)
А какой тип данных будет в массиве

Пока планируеться Byte.
Единственное, что меня не устраивает в примере MetalFan-а, так это типа Variant - слишком много памяти от ест.


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


Эксперт
***


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

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



Цитата(MetalFan @  7.2.2007,  23:40 Найти цитируемый пост)
а как обращаться - это уже частность

Ну ладно ладно не знаю эти Вар массивы так что спорить не буду smile 
Просто меня смутила эта запись:
Код

lVarArray[5,5,5,5] := 10;

Ведь динамически ты её не изменишь smile тут обращение только к 4 элементам а если их будет 5 уже не прокатит smile 


Sunvas, А что если заместо файла использовать память ведь управление массивом занимается система а что тебе мешает на прямую работать с памятью тогда можно как хочешь сделать smile  smile

Добавлено @ 00:25 
Выделить память под это дело легко посчитать сколько ейчеик  в массиве, потом разбить память на измерения скажем если 150 ейчеек т.е. 50 измерений по 3 значения то делаем так:
Код

Выделяем память под 150байт.
1..150 яйчейки памяти
и потом програмно делим
1,2,3 байт 1 измерение
4,5,6 байт 2 измерение
.
.
147,148,150  байт 50 измерения
после чего заносим вних значения.


Идея помойку лучше чем с файлом  smile 
PM MAIL ICQ   Вверх
ivan219
Дата 8.2.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да и по поводу файла можно реализовать отображение файла в память там даже тип Byte а не String  можно использовать.
PM MAIL ICQ   Вверх
MetalFan
Дата 8.2.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата

Единственное, что меня не устраивает в примере MetalFan-а, так это типа Variant - слишком много памяти от ест.

ну тут либо универсальность решения, либо извращаться и изобретать что-то свое - быстрое и красивое ;)

Цитата(ivan219 @  8.2.2007,  00:17 Найти цитируемый пост)
Ведь динамически ты её не изменишь smile тут обращение только к 4 элементам а если их будет 5 уже не прокатит smile

я же написал, можно использовать:
Цитата

function VarArrayGet(const A: Variant; const Indices: array of Integer): Variant; 

Description

Use VarArrayGet to obtain the value of a single cell from a multi-dimensional Variant array.

A is the Variant array that contains the desired value.

Indices is an array of index values, one for each dimension of the array.






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


Эксперт
***


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

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



Цитата(MetalFan @  8.2.2007,  09:22 Найти цитируемый пост)
я же написал, можно использовать:

Это я уже понял smile я другое имел в виду.

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

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

10 12 15
.
.
45 56 43


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

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

Помойкму здесь я ерунду с порол извиняюсь это реализация двух мерного массива smile 
А 50 мерный это кошмар получится smile

Цитата(ivan219 @ 8.2.2007,  00:17)
Выделить память под это дело легко посчитать сколько ейчеик  в массиве, потом разбить память на измерения скажем если 150 ейчеек т.е. 50 измерений по 3 значения то делаем так:
Код

Выделяем память под 150байт.
1..150 яйчейки памяти
и потом програмно делим
1,2,3 байт 1 измерение
4,5,6 байт 2 измерение
.
.
147,148,150  байт 50 измерения
после чего заносим вних значения.

Здесь тоже smile 

Это сообщение отредактировал(а) ivan219 - 8.2.2007, 10:51
PM MAIL ICQ   Вверх
MetalFan
Дата 8.2.2007, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ivan219 @  8.2.2007,  10:38 Найти цитируемый пост)
Это я уже понял smile я другое имел в виду.

и что это за "другое"? )) "динамически" можно обращаться к любой ячейке многомерного ВарМассива... или я что-то не догоняю твоих мыслей  smile 


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


Опытный
**


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

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



Должно быть все просто:
возьмем
Код

//Наш массив
TMyType = Integer;
MyArray: array of TMyType
Size: array of Integer //Размерность массива в каждом измерении

//Выделим память для массива
k := 1;
for i := Low(Size) to High(Size) do
  k := k*Size[i];
SetLength(MyArray, k);

//Для установки/считывания значения
procedure SetValue(Index: array of Integer);
var
  ArrIndexm, i: Integer
begin
  ArrIndex := 0;
  for i := Low(Index) to High(Index) do
    ArrIndex := ArrIndex + Index[i]*Size[i];
  MyArray[ArrIndex] := 25;
end;

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


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


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

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



RomanEEP, Хорошо. Как вариант "извертывания".  smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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