Динамические массивы(2d)

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Динамические массивы(2d)

Re: Динамические массивы(2d)

MOTOCoder » 14 янв 2008, 22:03

Вот есть создание динамического массива в Delphi(в паскале тоже должно сработать, если убрать код относящийся к формам(правда массив одномерный, но может есть что полезное).

Код: Выделить всё

Массив, который может менять свой размер во время работы программы, нужен тогда, когда неизвестно количество элементов на стадии разработки программы. Например, Вам не известен размер изображения, которое нужно будет поместить в память.

Этот динамический массив основан на массиве Delphi. Поэтому обращение к нему быстро и удобно. Тип TArray – это массив нужного типа. 128 элементов можно заменить любым другим числом, хоть 0. Повлиять это может только на отладку программы, так как Delphi выведет (если уместится) именно это количество элементов. PArray – это указатель на TArray. При обращении к элементам массива для Delphi главное, чтобы этот элемент существовал в памяти, то есть, чтобы под него была выделена память. А проверять, находится ли номер нужного элемента между 0 и 127 Delphi не будет.

Главным методом объекта является SetCount. Он сделан таким образом, что при изменении количество элементом старые данные не теряются, а новые элементы всегда обнуляются. 

Процедура Reset обнуляет все существующие элементы.

Для того чтобы сделать этот массив, например, массивом целых чисел нужно поменять все double на integer или еще что-то.

Если Ваша программа часто обращается к элементам массива, то имеет смысл создать переменную типа PArray и присвоить ей адрес данных (поле p динамического массива), а дальше обращаться к ней, как к самому обыкновенному массиву. Только не забудьте обновлять эту переменную при изменении количества элементов.


type
  TForm1 = ...
    ...
  end;

  TArray = array [0..127] of double;
  PArray = ^TArray;
  TDynArray = object
    p: PArray;
    count: integer;
    constructor Create(ACount: integer); { инициализация }
    procedure SetCount(ACount: integer); { установка количества
                                           элементов }
    procedure Reset; { обнуление данных }
    destructor Destroy; { уничтожение }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

constructor TDynArray.Create(aCount: integer);
begin
  p := nil;
  count := 0;
  SetCount(ACount);
end;

procedure TDynArray.SetCount(ACount: integer);
var
  np: PArray;
begin
  if count = ACount then Exit;
  if p = nil then begin { память не была выделена }
    if ACount <= 0 then begin { новое количество элементов
                                в массиве равно 0 }
      count := 0;
    end else begin  { новое количество элементов в массиве
                      больше 0 }
      GetMem(p, ACount * sizeof(double)); { выделение памяти }
      fillchar(p^, ACount * sizeof(double), 0); { обнуление данных }
      count := ACount;
    end;
  end else begin
    if ACount <= 0 then begin { новое количество элементов в
                                массиве равно 0 }
      FreeMem(p, count * sizeof(double)); { освобождение памяти }
      count := 0;
    end else begin
      GetMem(np, ACount * sizeof(double)); { выделение памяти }
      if ACount > count then begin { требуется увеличить
                                     количество элементов }
        move(p^, np^, count * sizeof(double)); { перемещение
                                старых данных на новое место }
        fillchar(np^[count], (ACount - count) * sizeof(double),
          0); { обнуление новых элементов массива }
      end else begin
        move(p^, np^, ACount * sizeof(double)); { перемещение 
                           части старых данных на новое место }
      end;
      FreeMem(p, count * sizeof(double)); { освобождение старой
                                            памяти }
      p := np;
      count := ACount;
    end;
  end;
end;

procedure TDynArray.Reset;
begin
  fillchar(p^, count * sizeof(double), 0); { обнуление данных }
end;

destructor TDynArray.Destroy;
begin
  SetCount(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a: TDynArray;
  i: integer;
  s: string;
begin
  a.Create(3);
  a.p[0] := 10;
  a.p[1] := 20;
  { второй элемент не указывается, но вследствие обнуления
    при создании массива он равен 0 }
  s := 'Элементы в массиве:';
  for i := 0 to a.count - 1 do
    s := s + #13#10 + IntToStr(i+1) + ': ' + FloatToStr(a.p[i]);
  ShowMessage(s);

  a.SetCount(4);
  a.p^[3] := 50;
  { значения первых элементов не теряются }
  s := 'Элементы в массиве:';
  for i := 0 to a.count - 1 do
    s := s + #13#10 + IntToStr(i+1) + ': ' + FloatToStr(a.p[i]);
  ShowMessage(s);

  a.Destroy;
end;

Re: Динамические массивы(2d)

Monopo » 13 янв 2008, 10:54

Как организовать выделение памяти под двумерный массив и ввод в него элементов? Исп. new.

Re: Динамические массивы(2d)

Serge_Bliznykov » 09 дек 2007, 13:45

&quot писал(а):Эм.. Нуу.. Поняяятно.. )))
Будут конкретные вопросы - милости просим ;-)

Re: Динамические массивы(2d)

Serge_Bliznykov » 09 дек 2007, 13:33

Точно. Ещё добавлю - проще всего через GetMem / FreeMem

Re: Динамические массивы(2d)

Monopo » 09 дек 2007, 13:27

&quot писал(а):юзай поинтеры, на вопрос как отвечу просто - RTFM
Понятно...

Re: Динамические массивы(2d)

annihilator » 09 дек 2007, 12:36

Monopo писал(а):Как не будет(( ну и дела.. Типа в Турбо вообще нельзя задать динамический массив?(
юзай поинтеры, на вопрос как отвечу просто - RTFM

Re: Динамические массивы(2d)

Monopo » 08 дек 2007, 22:53

&quot писал(а):в TurboPascal этот код и не будет компилироваться!!
Как не будет(( ну и дела.. Типа в Турбо вообще нельзя задать динамический массив?(

Re: Динамические массивы(2d)

Serge_Bliznykov » 08 дек 2007, 06:24

тут тема такая, что ОБЯЗАТЕЛЬНО нужно определиться - где вы пытаетесь это откомпилировать!! Динамические массивы появились только в Delphi
в TurboPascal этот код и не будет компилироваться!!

Re: Динамические массивы(2d)

annihilator » 08 дек 2007, 00:31

Duncon писал(а):Сорри не доглядел, тогда так
type TMas = array of array of integer;
не конает, пишет ошибку синтаксиса. Может компилятор не понимает, но факт остаётся фактом (поинтеры то пашут...)

Re: Динамические массивы(2d)

Duncon » 07 дек 2007, 22:58

Сорри не доглядел, тогда так
type TMas = array of array of integer;

Вернуться к началу