Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Procedural types in statements and expressions 
V
    Опции темы
Christoph
Дата 30.1.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



нашел в справке такую инфу

Код


if F = MyFunction then ...;
In this case, the occurrence of F results in a function call; the compiler calls the function pointed to by F, then calls the function MyFunction, then compares the results. The rule is that whenever a procedural variable occurs within an expression, it represents a call to the referenced procedure or function. In a case where F references a procedure (which doesn't return a value), or where F references a function that requires parameters, the previous statement causes a compilation error. To compare the procedural value of F with MyFunction, use

if @F = @MyFunction then ...;

@F converts F into an untyped pointer variable that contains an address, and @MyFunction returns the address of MyFunction.

To get the memory address of a procedural variable (rather than the address stored in it), use @@. For example, @@F returns the address of F.


так вот написано что @F хранит адресс, адресс функции, и написано чтоб получить адресс процедурной переменны, то надо писать @@F, разве @F и @@F отличаются? Вот решил написать небольшой пример, но есть своки бока


Код

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
   end;
TProc=function(k:integer):integer;
function Fun(i:integer):Integer;
var
  Form1: TForm1;
  Proc:Tproc;
implementation

{$R *.dfm}
function Fun(i:integer):integer;
begin
  Result:=i*2;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Proc:=@Fun;
ShowMessage(String(@Proc));
end;



Правильно ли я вывожу адресс? а то мне выводит пустое окно, а если пишу так:
Код

ShowMessage(String(@@Proc));


...то ошибка  вылетает, ошибка AV. Можете помочь разъяснить ситуацию? Спасибо

Это сообщение отредактировал(а) Christoph - 30.1.2009, 23:14


--------------------
user posted image
PM MAIL ICQ   Вверх
Bose
Дата 30.1.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



procedure TForm1.FormCreate(Sender: TObject);
begin
Proc:=@Fun;
ShowMessage(IntToStr(@Proc));
end;

Добавлено @ 19:25
К тому же всё это можно записать как:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
Proc:=Fun;
ShowMessage(IntToStr(Proc));
end;


Добавлено @ 19:25
без заморочек с @

Это сообщение отредактировал(а) Bose - 30.1.2009, 19:25
PM MAIL WWW Skype   Вверх
bems
Дата 30.1.2009, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



тут еще нужно привести указатель к целому


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Christoph
Дата 30.1.2009, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Bose, ты ошибаешся, запись

Код

Proc:=Fun;


Будет требовать параметры, и будет пытаться присвоить результат переменной Proc.Была бы процедура другое дело, А переменная Proc у меня другого типа  smile 

Мне кажется что приведения IntToStr не сработает) потом что там указатель и string, я не знаю, я чуть позже попробую


--------------------
user posted image
PM MAIL ICQ   Вверх
bems
Дата 30.1.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Код

ShowMessage(IntToStr(cardinal(@Proc)));



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Bose
Дата 30.1.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Цитата(Christoph @  30.1.2009,  18:42 Найти цитируемый пост)
Bose, ты ошибаешся, запись
Код

Proc:=Fun;

Будет требовать параметры, и будет пытаться присвоить результат переменной Proc.Была бы процедура другое дело, А переменная Proc у меня другого типа  smile 

Мне кажется что приведения IntToStr не сработает) потом что там указатель и string, я не знаю, я чуть позже попробую 


Не ошибаюсь. Точнее ошибаюсь, но не в этой строке.
правильно будет вот так:
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Proc:=Fun;
  ShowMessage(IntToStr(Proc(12)));
end;

Здесь ShowMessage показывает результат выполнения функции Fun(12).


А результат выполнения этого:
Код

ShowMessage(IntToStr(cardinal(@Proc)));

Цитата

4552572

Здесь ShowMessage показывает адрес переменной Proc.

PM MAIL WWW Skype   Вверх
bems
Дата 30.1.2009, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Bose @  30.1.2009,  21:20 Найти цитируемый пост)
Здесь ShowMessage показывает адрес переменной Proc.
а разве не это надо было?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Christoph
Дата 30.1.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: 5
Всего: 11



Bose, да прости чуть не продумал, не хотел тебя обвенять smile

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  Proc:=Fun;
  ShowMessage(IntToStr(cardinal(@@Proc)));
end;


Выводит 4545536

Код

Во такой код
procedure TForm1.FormCreate(Sender: TObject);
begin
  Proc:=Fun;
  ShowMessage(IntToStr(cardinal(@Proc)));
end;


Выводит 4530368, адресса разные, что же получается?! Пример для наглядности

Код

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(IntToStr(cardinal(@@Proc))); //4545536
end;
// и...
procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowMessage(IntToStr(cardinal(@Proc)));  //0
end;

// и..

procedure TForm1.FormCreate(Sender: TObject);
begin
ShowMessage(IntToStr(cardinal(@Fun))); //4530368
end;


Значит получается так и есть что @@Proc возращает адресс переменной Proc, а @Proc указывает на адресс начало функции, и не разу не видел чтоб был оператор @@,эх ну ладно, надо учить асм)
bems, Bose, спасибо за обсуждение темы.
P.s если не будет комментариев я тему закрываю

Это сообщение отредактировал(а) Christoph - 30.1.2009, 23:41


--------------------
user posted image
PM MAIL ICQ   Вверх
Bose
Дата 31.1.2009, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 8
Всего: 51



Цитата(bems @  30.1.2009,  20:51 Найти цитируемый пост)
а разве не это надо было?

Это.  smile это я решил что важнее результат.

PM MAIL WWW Skype   Вверх
bems
Дата 31.1.2009, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Christoph @  30.1.2009,  23:39 Найти цитируемый пост)
Значит получается так и есть что @@Proc возращает адресс переменной Proc, а @Proc указывает на адресс начало функции

а зачем авторам хелпа распространять ложную информацию? ну да, так и есть
Цитата(Christoph @  30.1.2009,  23:39 Найти цитируемый пост)
не разу не видел чтоб был оператор @@

значит мало кода читал. Это встречается.
Цитата(Christoph @  30.1.2009,  23:39 Найти цитируемый пост)
надо учить асм)

ну для общего развития оно не помешает, но как это вытекает из этого топика я не понял. Тут и без знания ассемблера все складывается в нормальную картинку



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.