Lazarus и указатели

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
itfx
незнакомец
Сообщения: 9
Зарегистрирован: 26.08.2005 15:55:51

Сообщение itfx »

В дельфях есть функция прямого перевода адреса в поинтер...
Ptr(address)=pointer.
Во freepascale тоже есть эта функция, но она немного другая...
В общем код

Код: Выделить всё

var
 i:longint; // прямой адрес (указатель на структуру MSG из WinAPI функции)
 s:^tagmsg;
 ms:msg;
begin
 s:=ptr(i); //в FPC:  s:=ptr(чего-то там);
 ms:=s^;

Все работало в дельфи,
в FPC не хочет...
Ведь FPC требует другой тип данных:
Ptr возвращает farpointer, а s - указатель (^tagmsg).

Вопрос: а как делать правильно? :blink:
Alexander

Сообщение Alexander »

Не знаю про то ли я. Но вот такой код работает. Указатель и есть LongInt.

Код: Выделить всё

type
       TRe = record
       a : Longint;
       b : Longint;
       c : Longint;
       end;
       PTRe = ^TRe;


  var
       L : LongInt;
       R : TRe;
      
begin

R.a := 88888;

L := LongInt(Pointer(@R));

WriteLn(l);

WriteLn(PTRe(l)^.a);

end.
itfx
незнакомец
Сообщения: 9
Зарегистрирован: 26.08.2005 15:55:51

Сообщение itfx »

Вот оно...

Код: Выделить всё

WriteLn(PTRe(l)^.a);
- вот оно...
Если честно - первый раз вижу подобную конструкцию,
а ведь работает. Спасибо, помогли.
Аватара пользователя
pda
постоялец
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Сообщение pda »

itfx писал(а):В дельфях есть функция прямого перевода адреса в поинтер...
Ptr(address)=pointer.
Во freepascale тоже есть эта функция, но она немного другая...

...
itfx писал(а):Вопрос: а как делать правильно?  :blink:

RTFM :D

Это - устаревшая функция.
Вот, что пишут в Delphi help:
In Delphi code, Ptr converts the given address to a pointer. A call to this function generates no code, but simply treats the 32-bit value given by Address as a pointer.

А вот, что пишут в доке FPC (файл rtl.pdf):
Ptr returns a pointer, pointing to the address specified by segment Sel and offset Off.
Remark:
1.In the 32-bit flat-memory model supported by Free Pascal, this function is obsolete.
2.The returned address is simply the offset.


Короче, в flat модели давно надо делать прямое преобразование типа. А лучше - сразу описывать ссылочные типы. :)
itfx
незнакомец
Сообщения: 9
Зарегистрирован: 26.08.2005 15:55:51

Сообщение itfx »

Все это хорошо, но на практике, когда мало времени,
хочется использовать СТАРЫЕ, проверенные
временем, методы.
Возникают проблемы, когда эти старые методы
не работают.
Можно много рассуждать об удобстве и
скорости работы, но все равно спасибо за консультацию :)
Ответить