Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамический массив структуры

74K
06 октября 2011 года
sam-music
4 / / 05.10.2011
[COLOR="red"]проще говоря[/COLOR] мне нужно создать динамический массив, который будет увеличиваться по моей воле, и чтобы я мог легко получать доступ ко всем элементам созданного мной класса.

возможно делаю большую глупость, с указателями "общаюсь на ВЫ". динамические массивы ток начал читать.

*********************************

есть следующий модуль:

Код:
type general_attribute = class
x:integer;
str_1:string;
str_2:integer;
str_3:integer;
str_4:integer;
str_5:integer;
end;

type
    tarray = array [0..maxarraysize] of general_attribute;
    parray = ^tarray;
    tdynarray = object
    p:parray;
    count: integer;
    constructor create(acount: integer);
    procedure setcount(acount: integer);
    procedure reset;
    destructor destroy;
end;

implementation

constructor tdynarray.create(acount: integer);
begin
    p:=nil;
    count := 0;
    setcount(acount);
end;

procedure tdynarray.setcount(acount: integer);
var
    np: parray;
    x: integer;
begin
    if count = acount then exit;
    if p = nil then
    begin

    if acount <= 0 then
    begin
        count := 0;
    end else
    begin
    //for x:=0 to acount do
            begin
                getmem(p, acount * sizeof(general_attribute));
                fillchar(p^, acount * sizeof(general_attribute), 0);
            end;
            count := acount;
        end;
    end; //else
    begin
        if acount <= 0 then
            begin
                for x:=0 to acount do
                    begin
                        freemem(p, count * sizeof(general_attribute));
                        count := 0;
                    end;
            end else
            begin
                    begin
                        getmem(np, acount * sizeof(general_attribute))
                            if acount > count then
                                begin
                                    move(p^, np^, count * sizeof(general_attribute));
                                    fillchar(np^[count], (acount - count) * sizeof(general_attribute),0);
                                end else
                            begin
                                move(p^, np^, acount * sizeof(general_attribute));
                            end;
                        freemem(p, count * sizeof(general_attribute));
                        p:= np;
                        count := acount;
                    end;
            end;
        end;
end;

procedure tdynarray.reset;
begin
    fillchar(p^, count * sizeof(general_attribute), 0);
end;

destructor tdynarray.destroy;
begin
    setcount(0);
end;


код выдрал из инета.

у меня имеется переменная test:tdynarray;
я создаю элемент test.create(1);
далее мне нужно перезаписать например параметр x, пишу test.p[0].x:=1; получается борода) понимаю. возможно глупо записать параметр x если у меня нет к нему адреса. делаю следующее:

создаю переменную типа y:=general_attribute; , задаю отдельно параметры каждому атрибуту и присваиваю её test.p[0]:=y; - все срабатывает. но после завершения программы выдает ошибку. хотя память освобождаю при закрытии формы.

плиз хелп ми.
416
06 октября 2011 года
MaitreDesir
380 / / 02.01.2008
Вообще для таких целей в Delphi лучше использовать что то, вроде TCollection (инструкций в инете море). Если уж говорить о массиве, который может произвольно менять размер и т.д. (все что в требованиях: "который будет увеличиваться по моей воле, и чтобы я мог легко получать доступ ко всем элементам созданного мной класса"), то тогда я бы предложил написать тебе класс-обвертку, основанную на конструкции:
 
Код:
MyArray: array of general_attribute
. Для добавления необходимо выполнить SetLength(N+1), где N - текущий размер массива, ну и создать экземпляр класса general_attribute. За подробностями можно сходить в гугл, по вопросу "Динамические массивы в Delphi".
74K
06 октября 2011 года
sam-music
4 / / 05.10.2011
Цитата:
Для добавления необходимо выполнить SetLength(N+1)


setlength(N) насколько я знаю удаляет все предшествующие значения. решил проверить, прежде чем делать выводы - компилятор заявляет об ошибке.

тогда выходит что во время выполнения программы мне нужно заранее знать количество элементов в массиве. мне же нужно увеличивать количество элементов по надобности. или же создавать еще массив для временного хранения данных. по мне проще было бы сделать указатель и освобождать память по мере необходимости.

Цитата:
Вообще для таких целей в Delphi лучше использовать что то, вроде TCollection...


вот про TCollection сенкс. погрызу гранит науки)

собственно все равно не могу понять суть. почему я в своем коде получаю указатель на i-ый элемент массива в котором 1 ячейка хранит данные созданные мной, но память к любому из под-элементов не освобождена. может дело в string?

416
06 октября 2011 года
MaitreDesir
380 / / 02.01.2008
Код:
uses
  SysUtils;

type
  TData = class
    Data: integer;
    constructor Create(D:Integer);
  end;

  TDataArr=Array of TData;

var
  i:integer;
  NOld:integer=10;
  NNew:Integer=15;
  NTrunc:Integer=12;
  Arr:TDataArr;

constructor TData.Create(D: Integer);
begin
  Data:=D;
end;

procedure PrintArray(P:TDataArr; Count:Integer);
var
  i:integer;
begin
  for i:=0 to Count-1 do write(P.Data,' ');
  writeln;
end;

begin
  SetLength(Arr,NOld);
  for i:=0 to NOld-1 do
    begin
      Arr:=TData.Create(i+1);
    end;
  PrintArray(Arr,NOld);
  SetLength(Arr,NNew);
  for i:=NOld to NNew-1 do
    begin
      Arr:=TData.Create(i+1);
    end;
  PrintArray(Arr,NNew);
  SetLength(Arr,NTrunc);
  PrintArray(Arr,NTrunc);
  readln;
end.

вывод:
 
Код:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
1 2 3 4 5 6 7 8 9 10 11 12
14
07 октября 2011 года
Phodopus
3.3K / / 19.06.2008
TList, TObjectList и т.п.
Array of smth
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог