Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2011, 16:03   #1
Alaysor
 
Регистрация: 30.12.2010
Сообщений: 5
По умолчанию закончить выполнение процедуры из тела другой процедуры

есть програма бот для одной онлайн игры, принцип таков, что получается я вызываю 1 процедуру, которая вызывает вторую, которая потом опять вызывает первую та - третью, та - опять первую, но так как код в паскале выполняется последовательно, то я предполагаю, что у меня в запущенном екзешнике будет накапливаться куча посыланий на код который врядли когда будет доделан.. получается чтот тип такого

Код:
var i:integer;
procedure one;
begin
i:=i*999;
top;
end;

procedure two;
begin
i:=i*99;
top;
end;

procedure top;
begin
i:=i+20;
if(i>0) then one else two;
end;

тоесть когда я вызывают топ то получаю кучу запусков других процедур
как убить програмно процедуру предка которая вызвала процедуру потомка?

Последний раз редактировалось Stilet; 22.01.2011 в 16:17.
Alaysor вне форума Ответить с цитированием
Старый 22.01.2011, 16:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

ИМХО тут не кросссылками нужно делать а просто цикл замутить, и в цикле процедуры эти вызывать последовательно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2011, 16:26   #3
Alaysor
 
Регистрация: 30.12.2010
Сообщений: 5
По умолчанию

хм как вариант, но вопрос незакрыт и тоже имеет место быть ваши предложения по этому вопросу
Alaysor вне форума Ответить с цитированием
Старый 22.01.2011, 16:27   #4
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Я так и не понял... =(
Код:
var i:integer;
procedure one;
begin
 i:=i*999;
end;

procedure two;
begin
 i:=i*99;
end;

procedure top;
begin
 while(true)
  begin
   i:=i+20;
   if(i>0) then one else two;
  end;
end;
А вообще если хотите изменять адрес куда переходит процесс работы, то только через асму, т.к. все это в стеках процессора сидит...
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 22.01.2011, 16:28   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

сделайте функцию с типом boolean и далее если она вернет false то выходим с процедуры.

Цитата:
т.к. все это в стеках процессора сидит...
стек это область памяти.
а не часть процессора.
Цитата:
А вообще если хотите изменять адрес куда переходит процесс работы, то только через асму
exit и любой вызов функции меняет адрес след команды вообще то

так что прежде чем писать такое, надо подумать немного.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Stilet; 22.01.2011 в 16:31.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.01.2011, 16:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но вопрос незакрыт и тоже имеет место быть ваши предложения по этому вопросу
А ты его и не открывал
Ну вот откуда мы знаем каким функционалом должны обладать эти твои процедуры? может там вообще нельзя реализовать такую схему, может в них не будет условия выхода?

Цитата:
то только через асму, т.к. все это в стеках процессора сидит...
Ога, чтоб антивирь понервничал. Такой себе сплойтик.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2011, 16:31   #7
Alaysor
 
Регистрация: 30.12.2010
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
сделайте функцию с типом boolean и далее если она вернет false то выходим с процедуры.
недопонял сути мне нужно както узнать айди процедуры и передать его дочерней процедуре чтоб та в начале своего тела по этому ид убила предка...

Цитата:
Сообщение от Stilet Посмотреть сообщение
может там вообще нельзя реализовать такую схему, может в них не будет условия выхода?
условием выхода есть вызов дочерней процедуры

Последний раз редактировалось Stilet; 22.01.2011 в 16:33.
Alaysor вне форума Ответить с цитированием
Старый 22.01.2011, 16:33   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чтоб та в начале своего тела по этому ид убила предка...
Забудь. Честное слово затея с полиморфом добром не кончится...
Максимум что можно заменить процедуры классами, и грохать объекты.
Цитата:
условием выхода есть вызов дочерней процедуры
Хы... Но ведь у тебя все процедуры друг дружке дочери
Зациклится и вылетит прога с переполнением стека...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2011, 16:37   #9
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты его и не открывал
Ну вот откуда мы знаем каким функционалом должны обладать эти твои процедуры? может там вообще нельзя реализовать такую схему, может в них не будет условия выхода?


Ога, чтоб антивирь понервничал. Такой себе сплойтик.
Что есть сплойтик?
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 22.01.2011, 16:38   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
недопонял сути мне нужно както узнать айди процедуры и передать его дочерней процедуре чтоб та в начале своего тела по этому ид убила предка...
вы хоть представляете себе как идет выполнение процедур?
процедуры это вам не компоненты.
Код:
var i:integer;
function one:boolean;
begin
Result:=true;
i:=i*999;
if not top then begin Result:=false;exit;end;
end;

function two:boolean;
begin
Result:=true;
i:=i*99;
if i>50000 then begin Result:=false;exit;end;//условие выхода
if not top then begin Result:=false;exit;end;
end;

function top:boolean;
begin
Result:=true;
i:=i+20;
if(i>0) 
 then if not one then begin Result:=false;exit;end
 else if not two then begin Result:=false;exit;end;
end;
код не оптимизирован конечно но вродб рабочий.

хотя вообще это кривость.
благо у вас при таком случае стек переполнится.

тут циклом надо в общем то.(особенно учитывая задачу)

а у вас бесконечная рекурсия.

еще кстати можно через флаг сделать.(если флаг установлен то не вызывем дальше, а просто выходим)
Цитата:
Максимум что можно заменить процедуры классами, и грохать объекты.
и потом весело ловить AV.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 22.01.2011 в 16:41.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ламер: выполнение процедуры, описанной в первой форме - из второй формы spiritos Помощь студентам 4 31.03.2010 15:12
Как отменить выполнение процедуры? AK BULLETS Общие вопросы Delphi 0 25.03.2010 11:52
time.h - узнать время потраченное на выполнение процедуры Serg12 Общие вопросы C/C++ 7 24.03.2010 10:37
ADOStoredProc выполнение процедуры с параметрами funball БД в Delphi 3 18.11.2009 15:13
Выполнение хранимой процедуры с output параметром Иванчо БД в Delphi 5 26.10.2007 14:59