![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатели
unknowing © (2007-12-08 21:19:00)type
PMyRec = ^TMyRec;
TMyRec = record
B: Byte;
I: Integer;
end;
implementation
{$R *.dfm}
function GetRes : TMyRec;
begin
Result.B:= Ord('A');
Result.I:=0;
end;
function GetResP : PMyRec;
begin
GetMem(Result,Sizeof(TMyRec));
Result^.B:= Ord('B');
Result^.I:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetRes;
GetResP;
end;
Здравствуйте, уважаемые мастера! Мой вопрос: в каких случаях используют подобные указатели (в моем примере PMyRec)?
antonn (work) (2007-12-09 15:28:00) [1]
> Хранятся они в некоторой внутренней структуре, но скормить
> ей
> можно BITMAP полоской, шириной в n картинок.
да я в кусре, сохраняются они тоже в одном битмапе (правда не полоской :)). Но все не доберусь к компу с дельфей посмотреть.
Leonid Troyanovsky (2007-12-09 15:21:00) [2]
> MetalFan © (09.12.07 13:30) [35]
> разве RTTI тут не при чем?
Ты выдвинул тезис, тебе и обосновывать.
Посмотри CPU, какой код генерируется при вызовах
Dispose( PSomeRec(lPtr)) vs Dispose((lPtr))
Во втором случае вызов Finalize отсутствует.
--
Regards, LVT.
unknowing (2007-12-09 13:34:00) [3]
> Anatoly Podgoretsky © (09.12.07 13:31) [36]
В оффтоп вопрос. Про построение (логику) программы обмена...
Anatoly Podgoretsky (2007-12-09 13:31:00) [4]> unknowing (09.12.2007 13:28:34) [34]
Пока не видно ни динамического (ручного) выделения памяти и необходимости в нем.
MetalFan (2007-12-09 13:30:00) [5]
> Leonid Troyanovsky © (09.12.07 12:56) [33]
а почему и нет?
например:
type
PSomeRec = ^TSomeRec;
TSomeRec = record
Name: string;
Arr: array [0..1024] of byte;
end;
var
lPVar: PSomeRec;
lPtr: Pointer;
begin
New( lPVar );
SetLength( lPVar^.Name, 1024*1024);
lPtr := lPVar;
Dispose( lPtr ); //память нифига не освободилась
//Dispose( PSomeRec(lPtr); //а если сделать так,то все ок
end;
разве RTTI тут не при чем?
поправьте, если ошибаюсь
unknowing (2007-12-09 13:28:00) [6]
> Юрий Зотов © (08.12.07 23:52) [26]
Понял Вас! Если объем передаваемых данных может меняется (недетерминирован, блин), тогда, действительно, не обойтись без динамического выделения.... Но мой вопрос про обмен связан с логикой и принципом построяния программы обмены. К меня идет непрерывный обмен(односторонний). Ус-во посылает данные в формате ID [data] (символьно). Делаю так:
...
type TRSData = packed record
I : Integer;
W : Word;
end;
var //глобальная
RSData : TRSData;
procedure GetBuff();
begin
... //принимаю сиволы с порта (ус-во передает с частотой 5 Гц)
end;
procedure Parse();
begin
... разбираю принятые символы и заполняю структуру RSData
//условно If PacketDataStatus = complete then
begin
RSData.I := PAcketDataI;
RSData.W := PAcketDataW;
end;
end;
//отображаю на компонентах LAbel
procedure Timer(); делаю его с частотой 10 Гц//
begin
Label1.Caption:= IntToStr(I);
Label2.Caption:= IntToStr(W);
end;
Так делают профи? Или опять дилетантств?! ;)
Leonid Troyanovsky (2007-12-09 12:56:00) [7]
> MetalFan © (09.12.07 12:39) [31]
> RTTI
Почему RTTI?
Скорее уж к-н compiler magic.
--
Regards, LVT.
Leonid Troyanovsky (2007-12-09 12:50:00) [8]
> antonn © (08.12.07 23:11) [24]
> хм.. А в timagelist все картинки хранятся в одном битмапе?
> интересно просто :)
Хз.
Хранятся они в некоторой внутренней структуре, но скормить ей
можно BITMAP полоской, шириной в n картинок.
См., например, IImageList::Add Method
--
Regards, LVT.
MetalFan (2007-12-09 12:39:00) [9]
> homm © (09.12.07 11:25) [30]
RTTI
homm (2007-12-09 11:25:00) [10]> [29] MetalFan © (09.12.07 11:01)
> вся память, выделенная под данные в записи будет корректно
> освобождена
Я в шоке. А как рантайм узнает, что ему нужно освободить строки и массивы?
MetalFan (2007-12-09 11:01:00) [11]1. в случае использования внутри программ на делфи память под тип.указатели лучше выделять/освобождать с пом New/Dispose.
в этом случае будет корректно освобождена память из под длинных строк и дин.массивов.
пример:
type
PNodeData = ^TNodeData;
TNodeData = record
Name: string;
Code: string;
Pos: array of integer;
end;
...
var
lNodeData: PNodeData;
...
New( lNodeData );
...
lNodeData^.Name := SomeString;
lNodeData^.Code := SomeCode;
SetLength( lNodeData^.Pos, 10 );
lNodeData^.pos[0] :=....;
....
....
Dispose( lNodeData ); //вся память, выделенная под данные в записи будет корректно освобождена
2. Для удобства работы с данными в памяти, возвращаемыми/передаваемыми WinAPI функциями
Пример:
var
lData: PInternetCacheEntryInfo;
begin
lData := nil;
lEntSize := 0;
if (FindFirstUrlCacheEntry( nil, lData^, lEntSize ) = 0) and
(GetLastError = ERROR_INSUFFICIENT_BUFFER) then
begin
GetMem( lData, lEntSize );
lData^.dwStructSize := SizeOf(TInternetCacheEntryInfo);
lEnumHandle := FindFirstUrlCacheEntry( nil, lData^, lEntSize );
...
Германн (2007-12-09 00:11:00) [12]
> Юрий Зотов © (08.12.07 23:52) [26]
Начал читать ветку решил в качестве варианта привести мою работу с внешними устройствами. Но увы опоздал.
Юрий Зотов (2007-12-09 00:03:00) [13]Уточнение - и оба раза устройство ждет подтверждения приема.
Юрий Зотов (2007-12-08 23:52:00) [14]> unknowing (08.12.07 23:08) [23]
Например, пусть устройство имеет такой протокол обмена:
- сначала передает 4 байта, в которых содержится объем информации, которая сейчас будет передана;
- затем передает саму информацию.
Попробуйте написать читающую программу без использования динамической памяти.
И сразу все поймете.
:о)
homm (2007-12-08 23:36:00) [15]> [10] unknowing (08.12.07 21:59)
> Конкретизирую вопрос. В каких видах задач лучше/практичней/продуктивней/п
> р. используют указатель?
Я же говорил, что ты не то спросил ;)
> [24] antonn © (08.12.07 23:11)
> хм.. А в timagelist все картинки хранятся в одном битмапе?
> интересно просто :)
Вроде да.
antonn (2007-12-08 23:11:00) [16]
> Anatoly Podgoretsky © (08.12.07 22:43) [21]
>
> > antonn (08.12.2007 22:39:20) [20]
>
> А есть TObjectList это что бы не терять.
ну я в общем. Считаю полезно руками собрать то, что уже есть - грабли появляются, сразу лучше понимаешь - что написать что то стоящее и работающее не просто :)
хм.. А в timagelist все картинки хранятся в одном битмапе? интересно просто :)
unknowing (2007-12-08 23:08:00) [17]Спасибо все отозвавшимся!
unknowing (2007-12-08 22:44:00) [18]
> antonn © (08.12.07 22:39) [20]
Спасибо большое! Попробую понять!
Anatoly Podgoretsky (2007-12-08 22:43:00) [19]> antonn (08.12.2007 22:39:20) [20]
А есть TObjectList это что бы не терять.
antonn (2007-12-08 22:39:00) [20]
> unknowing (08.12.07 22:03) [12]
>
>
> > antonn © (08.12.07 22:02) [11]
>
> Если Вас не затруднит, приведите пример.
>
ну смотри. Например у тебя компонент, в котором хранится множество картинок (типа TImageList, но честно - не знаю как он устроен). Можно картинки хранить в одном битмапе последовательно. И когда их запросят - копировать через canvas.rect() на нужный канвас учитывая сдвиг. Итого один массив на все картинки.
А можно сделать Tlist, в который помещать указатели на динамически создаваемые Tbitmap (один битмап - одна картинка). Из плюсов - картинки могут быть в разных палитрах, разных размеров. Из минусов - потерял указатель - утекла память.