Конференция "FreePascal" » Подскажите про доступ к массивам [Win32]
 
  • DanilinS © (12.11.16 14:03) [0]
    Есть такая проблема:

    В программе объявлены 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 день голову ломаю ...
  • Rouse_ © (12.11.16 14:12) [1]
    Работай через указатель. Зачем тебе тип массива то возвращать?
  • Pavia © (12.11.16 18:30) [2]
    Так по разному можно.

    > Естественно это не прокатит. Нельзя присваивать динамическому
    > массиву статический

    Можно для этого использовать цикл. Один раз присваиваешь и далее в остальной части программы пользуешься динамическими массивами.

    Можно указатель использовать или указательные массивы. Только там есть специфика работы.
  • NoUser © (13.11.16 01:57) [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;
 
Конференция "FreePascal" » Подскажите про доступ к массивам [Win32]
Есть новые Нет новых   [134427   +29][b:0][p:0]