Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 6

Вызов процедуры строкой

24.07.2009, 12:36. Показов 4954. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Корявое название,блин. В чем проблема-помню во время учебы препод показал как например строку "Procedure1" преобразовать и вызвать ее(если она описана и существует).
т.е. код был примерно такой
Pascal
1
2
3
4
5
6
7
8
9
10
...
procedure Proc1;
begin
...
end.
var str1:string;
begin
str1:='Proc1';
та самая функция\процедура(Str1);
end;
Напомните ее пожайлуста,и если можно ее альтернативы в делфии и с++
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2009, 12:36
Ответы с готовыми решениями:

Вызов процедуры в процедуре
Собственно вопрос: можно ли в процедуре вызвать другую процедуру? И если можно, то как? У меня не получается. Это нужно проделать в...

Вызов пользовательской процедуры из процедуры по указателю
Такая задача: Нужно вызвать функцию с параметрами и передать ей указатель на другую функцию чтобы она в цикле вызывала сама функцию и...

Вызов процедуры из другой процедуры с параметрами
Не подскажете как вызвать процедуру StringGrid1KeyUp procedure TMainForm.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift:...

26
 Аватар для dim-hj
28 / 25 / 1
Регистрация: 28.07.2009
Сообщений: 109
29.07.2009, 07:15
Pascal
1
2
3
4
5
type TProc = procedure;
var str1 : TProc;
begin
  str1 := @Proc1;
end.
Примерно так.
1
109 / 95 / 9
Регистрация: 19.02.2009
Сообщений: 312
29.07.2009, 07:59
Можно вызвать строкой, если:

1. ф-я или процедура экспортируется из DLL/EXE, т.е. явно прописана в таблице экспорта (getprocaddress)
2. вы предварительно создадите спискок всех доступных функций
3. используется к-либо движок интерпритации (явно паскаль и делфи не предусматривают такого run-time вызова процедур.
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 6
29.07.2009, 10:31  [ТС]
Цитата Сообщение от dim-hj Посмотреть сообщение
Pascal
1
2
3
4
5
type TProc = procedure;
var str1 : TProc;
begin
  str1 := @Proc1;
end.
Примерно так.
вот,это точто надо.спасибо ответившим. тему можно закрыть.
единсвенно что можно дополнить то что вызов теперь процедуры выглядит
Pascal
1
str1;
0
118 / 118 / 10
Регистрация: 12.05.2010
Сообщений: 1,207
29.07.2009, 22:49
Простите, а какой в этом смысл?
Можете привести вразумительный пример для пояснения? Или вы свой калькулятор пишете?
0
 Аватар для lexus_ilia
3067 / 727 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
29.07.2009, 22:57
Ну если подумать логически, то теперь можно описать процедуру и сделать таких процедур много, я имею ввиду следующее:
Pascal
1
2
type TProc = procedure;
var str1,str2,str3,...,strN : TProc;
А другого смысла я тоже, если честно, не вижу.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.07.2009, 08:07
Мне кажется это вообще какая-то туфта и работать это правильно не будет.
0
 Аватар для dim-hj
28 / 25 / 1
Регистрация: 28.07.2009
Сообщений: 109
30.07.2009, 08:35
Нет, это не туфта.

Callback
0
0 / 0 / 0
Регистрация: 24.07.2009
Сообщений: 6
30.07.2009, 17:08  [ТС]
я хочу это использовать в игре,для вызова процедур которые нужны не в данный момент а скажем через пару минут. в массив их добовлять и потом проверять по времени и если подошел момент то запускать.
0
Человек
 Аватар для mustardandrew
97 / 82 / 7
Регистрация: 16.06.2009
Сообщений: 229
30.07.2009, 18:14
Delphi
1
2
3
4
5
6
type TProc = procedure;
var arr : array[1..10] of TProg;
...
begin
  arr[random(10)+1];
end;
Ето очень удобно если нужно виполнить любую процедуру.
не надо писать дополнительний код
0
Эксперт по компьютерным сетямЭксперт Pascal/Delphi
 Аватар для TAVulator
4191 / 1292 / 237
Регистрация: 27.07.2009
Сообщений: 3,962
30.07.2009, 18:58
а как этим воспользоваться?
можете привести пример какой-нить?
попробовал сделать вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
type TProc = procedure;
var arr: array[1..5] of TProc;
 
Procedure ar(s: string);
Begin
 writeln(s);
End;
 
Begin
 arr[1]:=ar;
 arr[1];
End.
не катит...
0
Посланник моего господина
111 / 106 / 52
Регистрация: 02.05.2009
Сообщений: 181
30.07.2009, 20:25
Переменные процедурного типа позволяют хранить адрес процедуры (функции) в памяти и при необходимости косвенно вызывать его с теми аргументами, которые прописаны в объявлении типа.

В случае TAVulator правильной будет запись
Pascal
1
2
3
4
5
6
7
8
9
10
type TProc = procedure(s:string);
var arr:array[1..5] of TProc;
procedure ar(s:string); Far;
begin
writeln(s) 
end;
begin 
arr[1]:=ar; 
arr[1]('Hello world!'); 
end.
Примечание: слово Far для компилятора Turbo Pascal 7.0 необходимо.

Ранее автор писал, что ему нужно вызывать процедуру через некоторое время после определения этой процедуры. В таком случае можно использовать, если программа пишется на Делфи, процедуры вида procedure(arguments:array of const). При этом параметр функции — список аргуметов разных типов. Это удобно для хранения процедур, которые работают с различными типами данных.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.07.2009, 20:44
Так сразу всю эту фигню и не понял. Чем это все отличается от обычного использования функционального(процедурного) типа.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses crt;
type TProc = procedure(s:string);
var arr:array[1..5] of TProc;
{$F+}
procedure ar(s:string);
begin
writeln(s) 
end;
{$F-}
begin
clrscr;
arr[1]:=ar; 
arr[1]('Hello world!');
readln
end.
0
Эксперт по компьютерным сетямЭксперт Pascal/Delphi
 Аватар для TAVulator
4191 / 1292 / 237
Регистрация: 27.07.2009
Сообщений: 3,962
30.07.2009, 20:55
Попробовал как посоветовал Messenger of G. - не работает.
привожу свой исходник, может чего напутал при переписывании:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
type TProc = procedure(s: string);
var arr: array[1..5] of TProc;
 
Procedure ar(s: string); Far;
Begin
 writeln(s);
End;
 
Begin
 arr[1]:=ar;
 arr[1]('Hello');
End.
аналогично и с примером Puporev:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
type TProc = procedure(s: string);
var arr: array[1..5] of TProc;
{$F+}
Procedure ar(s: string);
Begin
 writeln(s);
End;
{$F-}
Begin
 arr[1]:=ar;
 arr[1]('Hello');
End.
в обоих случаях ругается на эту строку:
Pascal
1
arr[1]:=ar;
Добавлено через 59 секунд
Примечание: Испытывал в Free Pascal
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.07.2009, 20:57
В Турбо все работает, вот программа.
Вложения
Тип файла: rar 1_1.rar (236 байт, 22 просмотров)
0
Эксперт по компьютерным сетямЭксперт Pascal/Delphi
 Аватар для TAVulator
4191 / 1292 / 237
Регистрация: 27.07.2009
Сообщений: 3,962
30.07.2009, 21:12
Puporev, да сейчас в Турбо Паскале все проверил - работают оба примера. Почему же тогда во Free Pascal не хочет работать?

И еще вопрос:
в данном примере написано:
Pascal
1
type TProc = procedure(s: string);
а если мне нужно создать массив процедур с разными входными параметрами?
например
Procedure A(D: string);
Procedure B(I: integer);
ну и чтобы arr[1] = A и arr[2] = B
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
30.07.2009, 21:16
а на что компилятор ругается?

Messenger of G. тебе кста писал, как с разными типами параметров поступать
0
Эксперт по компьютерным сетямЭксперт Pascal/Delphi
 Аватар для TAVulator
4191 / 1292 / 237
Регистрация: 27.07.2009
Сообщений: 3,962
30.07.2009, 21:22
Lolcht0, ругается на этот кусок:
Pascal
1
arr[1]:=ar;
такими словами:
Error: Wrong number of parameters specified for call to "ar"
Цитата Сообщение от Lolcht0 Посмотреть сообщение
Messenger of G. тебе кста писал, как с разными типами параметров поступать
можно подробней и с примером на Turbo Pascal?
0
Посланник моего господина
111 / 106 / 52
Регистрация: 02.05.2009
Сообщений: 181
30.07.2009, 21:25
Ты используешь Free Pascal. Скажи, что говорит он по поводу ошибки в коде.

Вариант array of const на TP7 не пройдет. Можно пойти другим путём: разделять процедуры двух типов и работать с адресами.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
type TProc1 = procedure(D: string);
TProc2 = procedure(I: integer);
type kind = (proc1,proc2);
var arr:array[1..5] of pointer;
var types:array[1..5] of kind;
 
Procedure A(D: string);
Procedure B(I: integer);
 
begin
{сохранение}
arr[1]:=@A; types[1]:=proc1; {процедура берёт строку}
arr[2]:=@B; types[2]:=proc2; {процедура берёт число}
{вызов}
if types[1]=proc1 then TProc1(arr[1])('Hello!') else TProc2(arr[1])(20);
if types[2]=proc1 then TProc1(arr[2])('Hello!') else TProc2(arr[2])(20);
end.
0
125 / 123 / 0
Регистрация: 30.03.2009
Сообщений: 766
30.07.2009, 21:28
мммм, может компилятор ar выполнить пытается? в pascal же не обязательно ставить скобки после функции, если ей не передаются параметры? тогда, может быть имеет смысл написать
Pascal
1
arr[1]:=@ar;
Добавлено через 1 минуту 28 секунд
Messenger of G., он на free pascal пишет, так что мож и пройдет)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.07.2009, 21:28
Помогаю со студенческими работами здесь

Массивы. Загрузите программу, проверьте ее исполнение, замените вызов процедуры ввода на вызов присваивания и снова исполните программу
Загрузите программу lab11.pas, проверьте ее исполнение, замените вызов процедуры ввода на вызов присваивания и снова исполните программу: ...

Вызов функции по имени, заданному строкой
В некоторых языках возможен вызов функции по ее имени из строки, что весьма удобно. Как это реализовать на delphi? Если такого нет...

Вызов процедуры из процедуры (с параметрами)
Заранее, извиняюсь за свой вопрос - вполне может быть для кого то очевидный :) Если не трудно помогите. 1. Есть процедура ...

Вызов процедуры из хранимой процедуры
подскажите плз. кто сталкивался по теме. необходима так же передача параметров. За ранее всем благодарен

Вызов процедуры внутри процедуры
Здравствуйте, Как правильно это сделать? alter procedure . as BEGIN SELECT DateN FROM Nakl (По факту там одна строка....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru