Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: процедура/функция как параметр процедуры  (Прочитано 16927 раз)
0 Пользователей и 1 Гость смотрят эту тему.
eugrita
Помогающий

ru
Offline Offline

« : 15-03-2011 05:59 » 

Поддерживает ли TP7.0 тип параметра "процедура" или "функция" в списке параметров процедуры?
У меня на попытки объявления

Код:
 Procedure tst (Procedure F); 

компилятор говорит
Error2 Identifier expected
« Последнее редактирование: 15-03-2011 07:07 от Алексей1153++ » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 15-03-2011 06:58 » 

Бррр... Процедуру никак передать нельзя. Есть ли в Паскале понятие указателя на процедуру - затруднюсь сказать, но это было бы единственным решением.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
eugrita
Помогающий

ru
Offline Offline

« Ответ #2 : 15-03-2011 07:02 » 

спасибо. уже подсказали решение
Надо примерно так
Код:
type proc=procedure(a,b:real;var c:real);
{$F+}
procedure Padd(a,b:real;var c:real);
begin
c:=a+b;
end;
procedure Psub(a,b:real;var c:real);
begin
c:=a-b;
end;
{$F-}
procedure PP(p:proc;a,b:real);

правда не понимаю роль ключа {$F+}   
но без него не работает,!!!
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 15-03-2011 07:08 » 

Передачу функций поддерживает, но не так. Нужно либо задать явно имя типа функции и использовать его, либо указать тип полностью в заголовке.
1.
Код: (Pascal)
type MyFuncType=function(x: int):string;

function foo(x: int):string; {функция типа, совпадающего с MyFuncType }
begin
    {some code}
end;

procedure boo (f : MyFuncType);
begin
    {some code}
end;

begin
    boo(foo);
end.

2.
Код: (Pascal)
function foo(x: int):string; {функция, которую будем передавать }
begin
    {some code}
end;

procedure boo (function f (x: int) : string);
begin
    {some code}
end;

begin
    boo(foo);
end.
Код компилировать не пытался, написано из общих соображений.

То, что ты пытаешься делать, по-моему, вообще нарушает конвенции паскаля по объявлению переменных.
upd. опередили Улыбаюсь

Добавлено через 8 минут и 57 секунд:
Выхода вижу два:
первый - использовать этот ключ, т.к. он задаёт "дальнюю" адресацию (то есть влияет на принцип сборки программы, чтобы переданная по значению функция вызывалась)
второй - передавать указатель на функцию, тогда этот ключ, наверное, не будет нужен (хотя за давностью всех дел, не уверен, пусть поправят).

И, кстати, зачем у тебя сложение и вычитание записаны процедурами, тогда как это по семантике функции? То есть, у них есть аргументы и результат, а не аргументы и побочное действие.
« Последнее редактирование: 15-03-2011 07:17 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 15-03-2011 13:53 » 

TP 7.0 работает в DOS. DOS предполагает адресацию памяти процессора 8086, где вся память делится на сегменты по 64 Кб (для совместимости с процессором 8080). Ближний (near) указатель означает адрес внутри известного сегмента - номер байта, сдвиг (offset) от начала сегмента. Дальний (far) указатель означает адрес, состоящий из номера сегмента и offset.

В связи с этим существуют разные модели памяти процесса: tiny - весь процесс умещается в один сегмент (тогда far-адреса не нужны); small - весь процесс размещается в двух сегментах: исполняемый код - в одном, все переменные и стек вызовов (куча, стек) - в другом (тогда far-адреса также не нужны, поскольку всегда понятно, о каком сегменте идёт речь, и указатель на процедуру хранит offset процедуры в сегменте кода); другие модели предполагают наличие нескольких сегментов данных и кода (в разных сочетаниях) и используют far-адреса.

Ключ {$F+} означает, что находящийся после него код может размещаться в нескольких сегментах, и адреса процедур являются far-адресами. Когда-то об этом беспокоились, поскольку дальний вызов выполняется немного медленнее ближнего вызова процедуры; на современных машинах это абсолютно не важно в плане производительности, поэтому можно везде ставить {$F+}.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines