Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Указатели


Страницы:   1 2

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 (один битмап - одна картинка). Из плюсов - картинки могут быть в разных палитрах, разных размеров. Из минусов - потерял указатель - утекла память.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо