Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2012, 22:42   #1
vova_
Форумчанин
 
Аватар для vova_
 
Регистрация: 07.11.2011
Сообщений: 100
По умолчанию как задать "мерность" масива и для каждого "измерения" максимальный индекс

нужно создать масив имеющий U динамических индексов

на подобии:
Код:
U:=...;
POLЕ: array[0..N(1)][0..N(2)][0..N(3)]...[0..N(U-1)][0..N(U)] of string;
Если такое возможно, то как производить присвоение такому масиву и как его правильно объявлять.
Если я слишком многого хочу так и скажите, буду искать другие пути.

И ещё, существует ли ограничение на сумму количеств значений которые принимают индексы многомерного масива.

Подскажите пожалуста.
vova_ вне форума Ответить с цитированием
Старый 24.07.2012, 22:51   #2
Пёсик
 
Регистрация: 28.10.2011
Сообщений: 6
По умолчанию

В заголовке темы вопрос понятен, но в тексте уже пошло какое-то надругательство в виде: "динамических индексов"
Массив с динамической, т.е. неопределенной (или, точнее, задаваемой во время выполнения), размерностью в Дельфи объявить невозможно (если это не так, то пусть старшие товарищи меня поправят).
Пёсик вне форума Ответить с цитированием
Старый 24.07.2012, 23:26   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Массив с динамической, т.е. неопределенной (или, точнее, задаваемой во время выполнения), размерностью в Дельфи объявить невозможно (если это не так, то пусть старшие товарищи меня поправят).
Вы ошиблись. Можно.

Код:
var A: array of integer;
begin
//.....
SetLength(A, N);// N - размерность массива
end;
http://www.delphi-manual.ru/lesson5.php?com=yes
ссылка в основном для атвора темы
Цитата:
Кроме вышеописанных, так называемых статических массивов, у которых количество элементов неизменно, в Delphi можно использовать динамические массивы, количество элементов в которых допускается изменять в зависимости от требований программы. Это позволяет экономить ресурсы компьютера, хотя работа с такими массивами происходит гораздо медленнее. Описываются динамические массивы аналогично статическим, но без указания диапазона индексов:

type TDinArray = array of Integer;
var A : TDinArray;

После создания в динамическом массиве нет ни одного элемента. Необходимый размер задаётся в программе специальной процедурой SetLength. Массив из ста элементов:

begin
SetLength(A, 100);
end;

Последний раз редактировалось Вадим Мошев; 24.07.2012 в 23:30.
Вадим Мошев вне форума Ответить с цитированием
Старый 24.07.2012, 23:44   #4
Пёсик
 
Регистрация: 28.10.2011
Сообщений: 6
По умолчанию

Нет, речь идет не о динамических массивах как таковых, а о "динамической" размерности массивов, которую можно было бы устанавливать программно.

Например, если двухмерный статический массив объявляется так:
array[0..N, 0.. M] of ...
то динамический так:
array of array of ...
Последний с заранее неизвестным количеством элементов по каждой из размерности.
Но автору то надо объявить такой массив, размерность которого заранее неизвестна (может это будет двухмерный, а может дестимерный) и размерность которого определялась бы при выполнении.
Причем каждая размерность тоже не определена (т.е. массив динамический).
Понятно, что такое в Дельфи невозможно. Правда, объявляю с осторожностью - может кто додумался как это смастерить.

Последний раз редактировалось Пёсик; 24.07.2012 в 23:47.
Пёсик вне форума Ответить с цитированием
Старый 26.07.2012, 16:23   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Именно как динамический массив (array of) не получится. Но "легко" можно через указатели.

Код:
type
  TArrayItemType = Integer;

  PArray = ^TArray;
  PArrayItems = ^TArrayItems;
  TArrayItems = array[0..MaxInt div SizeOf(Pointer) - 1] of PArray;
  TArray = record
             Length: Integer;
             case Byte of
               0: (Item: TArrayItemType);
               1: (Items: PArrayItems);
           end;

function DArrayCreate(const ALength: Integer): PArray;
var
  Arr: PArray;
  X: Integer;
begin
  Arr := AllocMem(SizeOf(TArray));
  try
    Arr.Length := ALength;
    Arr.Items := AllocMem(SizeOf(TArray) * ALength);

    for X := 0 to ALength - 1 do
    begin
      Arr.Items[X] := AllocMem(SizeOf(TArray));
      Arr.Items[X].Length := -1;
    end;

    Result := Arr;
    Arr := nil;
  finally
    if Assigned(Arr) then
      FreeMem(Arr);
  end;
end;

procedure DArrayFree(var AArray: PArray); forward;

procedure DArrayFreeItems(var AArray: PArray);
var
  X: Integer;
begin
  if AArray = nil then
    Exit;

  if AArray.Length >= 0 then
  begin
    for X := 0 to AArray.Length - 1 do
      DArrayFree(AArray.Items[X]);
    FreeMem(AArray.Items);
  end;
end;

procedure DArrayFree(var AArray: PArray);
begin
  if AArray = nil then
    Exit;

  DArrayFreeItems(AArray);
  FreeMem(AArray);
  AArray := nil;
end;

function DArrayLength(const AArr: PArray): Integer;
begin
  Assert(Assigned(AArr),   'DArrayLength: AArr = nil');
  Assert(AArr.Length >= 0, Format('DArrayLength: AArr.Length = %d', [AArr.Length]));
  Result := AArr.Length;
end;

procedure DArraySetItem(const AArr: PArray; const AIndex: Integer; const AItem: TArrayItemType); overload;
begin
  Assert(Assigned(AArr),        'DArraySetItem: AArr = nil');
  Assert(AArr.Length >= 0,      Format('DArraySetItem: AArr.Length = %d', [AArr.Length]));
  Assert(AIndex >= 0,           Format('DArraySetItem: AIndex = %d', [AIndex]));
  Assert(AIndex < AArr.Length,  Format('DArraySetItem: AIndex = %d < AArr.Length = %d', [AIndex, AArr.Length]));
  if AArr.Items[AIndex].Length >= 0 then
  begin
    DArrayFreeItems(AArr.Items[AIndex]);
    AArr.Items[AIndex].Length := -1;
  end;
  AArr.Items[AIndex].Item := AItem;
end;

procedure DArraySetItem(const AArr: PArray; const AIndex: Integer; const AItem: PArray); overload;
begin
  Assert(Assigned(AArr),        'DArraySetItem: AArr = nil');
  Assert(AArr.Length >= 0,      Format('DArraySetItem: AArr.Length = %d', [AArr.Length]));
  Assert(AIndex >= 0,           Format('DArraySetItem: AIndex = %d', [AIndex]));
  Assert(AIndex < AArr.Length,  Format('DArraySetItem: AIndex = %d < AArr.Length = %d', [AIndex, AArr.Length]));
  if AArr.Items[AIndex].Length >= 0 then
    DArrayFreeItems(AArr.Items[AIndex]);
  AArr.Items[AIndex] := AItem;
end;

function DArrayGetItem(const AArr: PArray; const AIndex: Integer): TArrayItemType;
begin
  Assert(Assigned(AArr),                 'DArrayGetItem: AArr = nil');
  Assert(AArr.Length >= 0,               Format('DArrayGetItem: AArr.Length = %d', [AArr.Length]));
  Assert(AIndex >= 0,                    Format('DArrayGetItem: AIndex = %d', [AIndex]));
  Assert(AIndex < AArr.Length,           Format('DArrayGetItem: AIndex = %d < AArr.Length = %d', [AIndex, AArr.Length]));
  Assert(AArr.Items[AIndex].Length < 0,  Format('DArrayGetItem: AIndex = %d, AArr.Items[AIndex].Length = %d', [AIndex, AArr.Items[AIndex].Length]));
  Result := AArr.Items[AIndex].Item;
end;

procedure TForm172.FormCreate(Sender: TObject);
var
  Arr: PArray;
  X, Y: Integer;
  Str: String;
begin
  Arr := DArrayCreate(5);
  try
    for X := 0 to DArrayLength(Arr) - 1 do
      DArraySetItem(Arr, X, DArrayCreate(4));

    Arr.Items[0].Items[0].Item := 1;
    Arr.Items[0].Items[1].Item := 2;
    Arr.Items[0].Items[2].Item := 3;
    Arr.Items[0].Items[3].Item := 4;

    Arr.Items[4].Items[0].Item := 10;
    Arr.Items[4].Items[1].Item := 20;
    Arr.Items[4].Items[2].Item := 30;
    Arr.Items[4].Items[3].Item := 40;

    for X := 0 to DArrayLength(Arr) - 1 do
    begin
      Str := '';
      for Y := 0 to DArrayLength(Arr.Items[X]) - 1 do
        Str := Str + IntToStr(Arr.Items[X].Items[Y].Item) + ' '#9;

      Memo1.Lines.Add(Str);
    end;

  finally
    DArrayFree(Arr);
  end;
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 31.07.2012, 22:14   #6
vova_
Форумчанин
 
Аватар для vova_
 
Регистрация: 07.11.2011
Сообщений: 100
По умолчанию

масивный овет
буду изучать
надо вникнуть
спасибо всем отозвавшимся
а то я не мого представить пока другого пути без такого рода масивов

а может есть такой изврат в другом язике програмирования
две подпрограммы както уж склею.

уж не впервой на етот вопрос так никто и не отозвался: http://programmersforum.ru/showthread.php?t=180125 пришлось лепить фортран с делфи

буду благодарен за любые, даже наводящие ответы по обоим темам
vova_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04