Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.04.07;
Скачать: CL | DM;

Вниз

Вызов функции с неизвестными параметрами.   Найти похожие ветки 

 
Дмитрий С ©   (2012-12-12 17:19) [0]

Конструктивно.

Есть тип:
TSomeProc = procedure (Sender: TObject {+ любое количество параметров, включая var}) of object; {тут можно выбрать любую декларацию вызова для решения задачи}

Есть три переменных:
A, B, C: TSomeProc;

Есть метод, тело которой и является вопросом ветки.
procedure TSomeObject.DoProc;

Предположим, что A и B заполнено где-то.

Что нужно написать в теле TSomeObject.DoProc, чтобы выполнение следующего кода вызвало A и B с теми же параметрами, что и у C ?
TMethod(C) := TMethod(DoProc);
C(.....);


 
RWolf ©   (2012-12-12 19:39) [1]

вписать значения параметров вместо многоточия?


 
Владислав ©   (2012-12-12 20:05) [2]

Ничего не понял.


 
Игорь Шевченко ©   (2012-12-12 20:41) [3]

Согласен с предыдущим выступающим


 
Студент   (2012-12-12 20:54) [4]

Рекурсия? Игнор?

TMethod(C) := TMethod(DoProc);

procedure DoProc(a,b,c:integer);
begin
if((a = 0) and (b = 0))then
   buddaboom();
end;

procedure DoProc(a,b,c:integer);
begin
if(c <> 0) then
for c := 0 to c do
  if((a = 0) and (b = 0))then
     buddaboom();
else
  buddaboom();
end;


 
TSas   (2012-12-12 23:17) [5]

Tape TMultyParam = Array of variant;
function Func(var X: TMultyParam)...
Func([a, b])?


 
Rouse_ ©   (2012-12-12 23:21) [6]

Бредовая изначально задача, решаемая передачей параметров в виде структуры, у которой первыми 4 байтами идет размер блока параметров (как делают все грамотные апи, которым нужно поддерживать туеву хучу старых вариантов вызовов).
Городить огород на стеке на изменяемом количестве параметром = делать себе больно


 
Юрий Зотов ©   (2012-12-12 23:49) [7]

А прежде всего стоит задуматься - не появилась ли такая странная задача в результате плохой архитектуры, как это нередко бывает? И если да, то не лучше ли такую архитектуру пересмотреть?


 
Дмитрий С ©   (2012-12-13 03:55) [8]


> И если да, то не лучше ли такую архитектуру пересмотреть?

Да-да, задумался и не стал так делать. Но задача в голове осталась, как теоретическая.


> Rouse_ ©   (12.12.12 23:21) [6]

Идея была сделать дженерик-класс для поддержки нескольких слушателей событий. У разных событий ведь может быть разное число параметров. Как я понял можно использовать декларацию вызовов С и просто, не трогая стек, вызвать по порядку все обработчики событий.

Но в итоге сделал так, что у всех событий только один параметр - объект события, как это, например, в JavaScript сделано и задача стала решаться нормальным человеческим паскалем.


 
icWasya ©   (2012-12-13 09:35) [9]

По умолчанию в Delphi используется модель вызова - fastcall, то есть несколько первых параметров передаются через регистры, остальные через стек. И без танцев с бубном(асмом) не обойтись. А есть ещё stdcall, cdecl


 
Anatoly Podgoretsky ©   (2012-12-13 10:29) [10]

Calling conventions
Directive Parameter order Clean-up Passes parameters in registers?
register Left-to-right Routine Yes
pascal Left-to-right Routine No
cdecl Right-to-left Caller No
stdcall Right-to-left Routine No
safecall Right-to-left Routine No



Страницы: 1 вся ветка

Текущий архив: 2013.04.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.006 c
15-1355139429
Котик Б
2012-12-10 15:37
2013.04.07
C++Builder XE3 64 bit - really ?


15-1355382381
alexdn
2012-12-13 11:06
2013.04.07
Антивирус McAfee


15-1355469226
Toha_Nik
2012-12-14 11:13
2013.04.07
Живем все быстрей:)


2-1349043255
ankazh
2012-10-01 02:14
2013.04.07
китайские символы


15-1355171457
Юрий
2012-12-11 00:30
2013.04.07
С днем рождения ! 11 декабря 2012 вторник