Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.04.2013, 19:17
BigSam BigSam вне форума
Прохожий
 
Регистрация: 28.04.2013
Сообщения: 4
Версия Delphi: Delphi Xe
Репутация: 10
По умолчанию TList And Variant Dynamic Records

Добрый день, интересует как управлять памятью под динамическую запись
типа
Код:
  type
   TRect = packed record
   case Flag: Integer of
     0: (Left, Top, Right, Bottom: Integer);
     1: (TopLeft, BottomRight: Integer);
  end;
Админ: Пользуемсяя тегами для оформления кода.

то есть как правильно инициализировать объект методом New, и
после инициализации и занесения объектов(указателей на них) в список TList как правильно освободить выделенную память?.Ведь размер объектов не фиксированный. Заранее спасибо

Последний раз редактировалось Admin, 28.04.2013 в 19:22.
Ответить с цитированием
  #2  
Старый 28.04.2013, 20:17
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

размер как раз фиксированный и равен SizeOf(TRect) (в данном случае), при использовании условия память под такую запись выделяется на максимально требуемое значение
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #3  
Старый 28.04.2013, 20:38
BigSam BigSam вне форума
Прохожий
 
Регистрация: 28.04.2013
Сообщения: 4
Версия Delphi: Delphi Xe
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
размер как раз фиксированный и равен SizeOf(TRect) (в данном случае), при использовании условия память под такую запись выделяется на максимально требуемое значение

Вот к примеру запись:
Код:
TRec1=record
 a:integer;
 case flag:boolean of
  True: (done:integer);
  False:(b,c:integer)
end;
Var R:TRec1;

Если следовать вашему совету, должно выделиться 20 Б,
но
Код:
ShowMessage(IntToStr( sizeof(r)))
Показывает 16
Ответить с цитированием
  #4  
Старый 28.04.2013, 21:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от BigSam
Вот к примеру запись:
Код:
TRec1=record
 a:integer;
 case flag:boolean of
  True: (done:integer);
  False:(b,c:integer)
end;
Var R:TRec1;

Если следовать вашему совету, должно выделиться 20 Б,
но
Код:
ShowMessage(IntToStr( sizeof(r)))
Показывает 16

А с чего ты решил, что должно быть 20? Integer - это 4 байта.
Ответить с цитированием
  #5  
Старый 28.04.2013, 21:28
BigSam BigSam вне форума
Прохожий
 
Регистрация: 28.04.2013
Сообщения: 4
Версия Delphi: Delphi Xe
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А с чего ты решил, что должно быть 20? Integer - это 4 байта.

20=SizeOf(a)+SizeOf(flag)+SizeOf(done)+SizeOf(b)+S izeOf(c)=5*4
Ответить с цитированием
  #6  
Старый 28.04.2013, 21:35
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

У тебя ЛИБО done, ЛИБО b и c.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #7  
Старый 28.04.2013, 22:03
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Сообщение от BigSam
20=SizeOf(a)+SizeOf(flag)+SizeOf(done)+SizeOf(b)+S izeOf(c)=5*4
16=SizeOf(a)+SizeOf(flag)+SizeOf(b)+SizeOf(c)=4*4
Цитата:
Сообщение от Bargest
У тебя ЛИБО done, ЛИБО b и c.
но память выделена под b и c - как наибольшее (по занимаемой памяти) из возможных вариантов в зависимости от флага
__________________
Понять, что хочет заказчик - бесценно, ведь он платит MasterCard
Ответить с цитированием
  #8  
Старый 28.04.2013, 22:09
BigSam BigSam вне форума
Прохожий
 
Регистрация: 28.04.2013
Сообщения: 4
Версия Delphi: Delphi Xe
Репутация: 10
По умолчанию

Цитата:
Сообщение от cotseec
16=SizeOf(a)+SizeOf(flag)+SizeOf(b)+SizeOf(c)=4*4

но память выделена под b и c - как наибольшее (по занимаемой памяти) из возможных вариантов в зависимости от флага


Большое спасибо, теперь дошло)
Всем, спасибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025