Присвоение указателя переменной

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Сообщение Sphinx » 27.09.2005 21:03:03

Может вопрос и глупый...но надеюсь на ответ :)

Передаю из одной процедуры указатель на другую, примерно таким способом
Код: Выделить всё
type
 TSomeFunc = function(inValue: Double): HResult; stdcall;
 pSomeFunc = ^TSomeFunc;
...
callFunc(@MyCoolFunc);
...
procedure callFunc(pFunc: pSomeFunc);
var
 MyFunc: TSomeFunc;
begin
 @MyFunc = pFunc;
 if Assigned(MyFunc) then MyFunc;
...

в Делфи и режиме фрипаскаля <span style='color:blue'>{$MODE DELPHI}</span> компилируется без проблем, а вот в режиме <span style='color:blue'>{$MODE OBJFPC}</span> отказывается.
Хотелось бы использовать не режим совместимости с делфи, а режим объектного паскаля...
Как правильно передать и вызвать функцию в этом режиме ???

Или я вообще все принципиально не правильно делаю ?
Sphinx
 

Сообщение STAKANOV » 27.09.2005 21:06:20

Ругается на callFunc(@MyCoolFunc) ?

Попробуй callFunc(pSomeFunc(@MyCoolFunc))
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Guest » 27.09.2005 21:07:15

STAKANOV
Нет, ругается на @MyFunc = pFunc; сорри что забыл сказать
Guest
 

Сообщение Sphinx » 27.09.2005 21:08:48

Зарегиться чтоли :)

Вот что конкретно говорит:
Error: Can't assign values to an address
Sphinx
 

Сообщение STAKANOV » 27.09.2005 21:09:53

Guest писал(а): STAKANOV
Нет, ругается на @MyFunc = pFunc; сорри что забыл сказать

замени на

MyFunc = pFunc^;


хотя я бы сделал
Код: Выделить всё
procedure callFunc(pFunc: pSomeFunc);
var
MyFunc: pSomeFunc;  {<<===== см. сюда}
begin
MyFunc = pFunc;
if Assigned(MyFunc) then MyFunc;


но все зависит от того, что там далбше ;)
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sphinx » 27.09.2005 21:15:15

STAKANOV
Пробовал, компилится (и в Делфи и в фрипаскале), но при вызове функции приложение падает с AV (опять же и в Делфи и в фрипаскале)
Sphinx
 

Сообщение STAKANOV » 27.09.2005 21:17:25

Sphinx писал(а): STAKANOV
Пробовал, компилится (и в Делфи и в фрипаскале), но при вызове функции приложение падает с AV (опять же и в Делфи и в фрипаскале)

Это наверняка из-за if Assigned(MyFunc) then MyFunc;

я тут выше свон сообщение дополнял немного :rolleyes:
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sphinx » 27.09.2005 21:30:08

Убрал if Assigned(MyFunc) then MyFunc;

остался просто вызов MyFunc(0.05);
на такое компиляторы ругнулись:

FPC 2.0.1:
Fatal: Syntax error, ")" expected but "(" found

Delphi7
Missing operator or semicolon

переделал на
MyFunc^(0.05);

скомпилировалось, при вызове - AV.

А дальше там ни чего нет.
Суть задачи - в dll находится код создания окна и основной цикл
Код: Выделить всё
while (recRenderTargetWindow.WindowMessage.message <> WM_QUIT) do

и пероидически управление возвращается из dll в приложение, для этого и передается ссылка на процедуру обратного вызова.

Не проблема откомпилировать с совместимостью в Делфи, но тогда бы хотелось понять, почему в объектном режиме я не могу присвоить процедуре значение, а в режиме делфи могу.

Предполагаю из-за того, что поразному передаются параметры, но для этого и указал явно, что процедура с параметром "stdcall".
Sphinx
 

Сообщение STAKANOV » 27.09.2005 21:54:05

переделал на
MyFunc^(0.05);

скомпилировалось, при вызове - AV.

Если MyFunc по прежнему типа TSomeFunc, то так и должно быть. ты обращаешься к функции как к указателю, а это уже функции. Корректно MyFunc(0.05).

Не проблема откомпилировать с совместимостью в Делфи, но тогда бы хотелось понять, почему в объектном режиме я не могу присвоить процедуре значение, а в режиме делфи могу.


эээ.... чего? ;)

на самом деле здесь вся тонкость в работе с указателями (сам путаюсь в них иногда)

ключ в @MyFunc = pFunc, такое можно только с {$MODE DELPHI}

покажи получившийся последний код, примерно так как это в первом сообщении
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sphinx » 27.09.2005 22:04:12

STAKANOV
Переделал как написали в примере:

Вот компилируюшийся вариант (но вылетающий с ошибкой):
Код: Выделить всё
type
 TSomeFunc = function(inValue: Double): HResult; stdcall;
 pSomeFunc = ^TSomeFunc;
...
function MyCoolFunc(inValue: Double): HResult; stdcall;
begin
 Result := S_OK;
end;
...
callFunc(@MyCoolFunc);
...
procedure callFunc(pFunc: pSomeFunc);
var
 MyFunc: pSomeFunc;
begin
 MyFunc = pFunc;
 MyFunc^(0.05); // <- тут выскакивает AV
...
Sphinx
новенький
 
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение Sphinx » 27.09.2005 22:08:58

ключ в @MyFunc = pFunc, такое можно только с {$MODE DELPHI}

Вот собственно и вопрос...почему именно <span style='color:blue'>{$MODE DELPHI}</span>
На этом сайте в статьях написано следующее:
{$MODE DELPHI} от {$MODE OBJFPC} отличается весьма незначительно:

    * Во-первых, необязательно в секции implementation повторять заголовок процедуры или функции.
    * И, во-вторых, не разрешена перегрузка функций, процедур и операторов.

Поэтому и понять не могу...
Сперва FPC ругнулся что он не желает присваивать значение функции вида pSomeFunc функции function(inValue: Double): HResult; register; после чего я принудительно указал stdcall - прогресс, мне просто говорят не могу и всё тут :)
Sphinx
новенький
 
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение STAKANOV » 27.09.2005 22:10:13

Странно, но все правильно.

А callFunc и MyCoolFunc у тебя не в разных бинарниках? (просто ты что-то говорил про dll)
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение STAKANOV » 27.09.2005 22:13:45

Sphinx писал(а):
ключ в @MyFunc = pFunc, такое можно только с {$MODE DELPHI}

Вот собственно и вопрос...почему именно <span style='color:blue'>{$MODE DELPHI}</span>

не знаю, но факт :huh:
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение Sphinx » 27.09.2005 22:14:58

STAKANOV
В разных !!!
конкретно MyCoolFunc в .exe, а callFunc в .dll
Sphinx
новенький
 
Сообщения: 33
Зарегистрирован: 27.09.2005 21:52:09

Сообщение STAKANOV » 27.09.2005 22:23:51

Sphinx писал(а): STAKANOV
В разных !!!
конкретно MyCoolFunc в .exe, а callFunc в .dll

подозриваю, что дело только в этом
B)
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 58

Рейтинг@Mail.ru