-
Есть такая проблема:
В программе объявлены 3 массива. Статические. Размер - разные. При инициализации программы неизвестно, какой именно массив будет использован.
Далее происходит выбор массива - и работаю только с ним.
Но не получается реализовать. Идея такая:
Создаем: type ArrayА: array [0..10] of Int32; ArrayB: array [0..20] of Int32; ArrayC: array [0..30] of Int32; ArrayFin: array of Int32;
А в коде case ... of 1: ArrayFin:=ArrayА; 2: ArrayFin:=ArrayB; 3: ArrayFin:=ArrayC; end;
Естественно это не прокатит. Нельзя присваивать динамическому массиву статический. Вообще похоже присваивание в массивах работает только с с массивами одинаковой размерности и содержимого.
Пробовал обозвать ArrayFin типом pointer и работать через него - не смог реализовать. Везде описаны в основном массивы указателей. А не указатели на массивы.
Может обозвать все массивы динамическими? Не смог найти правил присвоения массивов при динамической размерности.
Как лучше всего реализовать? А то уже 3 день голову ломаю ...
-
Работай через указатель. Зачем тебе тип массива то возвращать?
-
Так по разному можно.
> Естественно это не прокатит. Нельзя присваивать динамическому > массиву статический
Можно для этого использовать цикл. Один раз присваиваешь и далее в остальной части программы пользуешься динамическими массивами.
Можно указатель использовать или указательные массивы. Только там есть специфика работы.
-
procedure CopyMyArrayToDynArray(N:Integer); type TInt20 = array [0..20] of Integer; PInt20 = ^TInt20; TInt30 = array [0..30] of Integer; PInt30 = ^TInt30; TInt40 = array [0..40] of Integer; PInt40 = ^TInt40; var A20 : TInt20; A30 : TInt30; A40 : TInt40;
Axx : array of Integer;
const n20 = SizeOf(A20) div SizeOf(A20[0]); n30 = SizeOf(A30) div SizeOf(A30[0]); n40 = SizeOf(A40) div SizeOf(A40[0]);
begin case N of 2: SetLength(Axx, n20); 3: SetLength(Axx, n30); 4: SetLength(Axx, n40); end; case N of 2: PInt20(Axx)^ := A20; 3: PInt30(Axx)^ := A30; 4: PInt40(Axx)^ := A40; end;
Axx[42] := 0; // ?!
end;
procedure MyArrayAsUnBorderedArray(N:Integer); type TInt20 = array [0..20] of Integer; TInt30 = array [0..30] of Integer; TInt40 = array [0..40] of Integer;
TIntArray = array [0..MaxInt div SizeOf(Integer) - 1] of Integer; PIntArray = ^TIntArray; var A20 : TInt20; A30 : TInt30; A40 : TInt40;
Acc : PIntArray;
begin case N of 2: Acc := @A20[0]; 3: Acc := @A30[0]; 4: Acc := @A40[0]; end;
Acc[42] := 0; // ?!
end;
|