Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Выделение и освобождение памяти [D7]


Цукор5   (17.02.17 14:43


type
 TOneDept = packed record
   DeptId : Integer;
   DeptName : ShortString;
 end;

 TDeptArray = array [0..0] of TOneDept;

 TDept = record
   Status : TStatusRec;
   Count  : Integer;
   Datas  : ^TDeptArray;
 end;

function GetDept (var R:TDept):BOOL;
function GetDeptFree (var R:TDept):BOOL;

function AllocBlock(Size: Integer): Pointer;
begin
 GetMem(Result, Size);
end;

function GetDept (var R:TDept):BOOL;
 var S:String; I:Integer;
 js:TlkJSONobject;
 jsList:TlkJSONlist;
 A: array of TOneDept;
begin
 ...
 js := TlkJSON.ParseText(S) as TlkJSONobject;
 try
   jsList:= js.Field['table'] as TlkJSONlist;
   if Assigned(jsList) then
   begin
     SetLength(A , jsList.Count);
     for I:=Low(A) to High(A) do
     begin
       A[I].DeptId:=(jsList.Child[i] as TlkJSONobject).getInt('Int1');
       A[I].DeptName := (jsList.Child[i] as TlkJSONobject).getString('Str1');
     end;
     R.Count:=Length(A);
      R.Datas:=AllocBlock(SizeOf(TOneDept) * R.Count);
     R.Datas:=@A[0];
   end;
 finally
   js.Free;
 end;
 ...

end;

procedure FreeBlock(P: Pointer);
begin
 FreeMem(P);
end;

function GetDeptFree (var R:TDept):BOOL;
begin
 FreeBlock(R.Datas);
end;

procedure TForm1.Button9Click(Sender: TObject);
 var R:TDept;  I:Integer;
begin
 if GetDept(R) then
 begin
   for I:=0 to R.Count-1 do
   begin
     Memo1.Lines.Add(Format('Dept Id: %d Name: %s',[R.Datas[I].DeptId, R.Datas[I].DeptName]));
   end;
 end;
 GetDeptFree(R);
end;


Что я делаю не так и понять не могу что.
Без выделения и освобождения тоже не работает, т.к. массив успевает разрушиться. Работает, когда выделил, но не освободил, но это не правильно, т.к. утечка.


Давно не заходил   (17.02.17 15:22[1]

Тяжелое наследство ТурбоПаскаля. Почему бы не сделать полем записи TDept динамический массив? Если же оставлять так как есть, то заменить
> R.Datas:=@A[0]
на
Move (A[0], R.Datas^, SizeOf(TOneDept) * R.Count)


Цукор5   (17.02.17 16:06[2]

Спасибо


Dimka Maslov ©   (18.02.17 11:34[3]


> Почему бы не сделать полем записи TDept динамический массив?


А ещё лучше список объектов


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо