Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

вызов функций с разным количеством аргументов?   Найти похожие ветки 

 
miha29   (2004-07-29 13:12) [0]

Доброго дня.
Подскажите пожста, ответ на следующую проблему:

есть метод бисекции, которому необходимо передавать функцию для вычисления её корня на

заданном интервале. Этот метод определен в отдельном классе и вызывается другими методами из

других классов, причем в качестве функции ему должны передаваться тоже функции, определенные

в разных классах -> с разным (!) количеством параметров.
Не получается сделать универсальный тип функции в параметрах метода бисекции, такой чтобы не

приходилось переопределять каждую вызываемую функцию под тип функции бисекции (максимум на

что я согласен :) - это сделать в каждом классе одну (!) функцию которая сделает необходимое

приведение по количеству параметров).

Изиняюсь за путанное объяснение. Я делаю так:
в первом модуле:

 TmMath = class
     eps: double;
    function bisect(f: tfunc; rmin, rmax, eps: double): double;
......
 end
function TMMath.bisect;
var i: integer;
   fmin, fmax, h: double;
   sign: boolean;
begin
  i:=0; sign:=false;
    while (abs(rmax - rmin) - eps>0) do begin
       h:=(rmin + rmax)/2.0;
//здесь может стоять функция не с одним аргументом, соответственно rmax, rmin векторного

//типа, но как быть с tfunc?
       fmin:=f(rmin); fmax:=f(h);
         if fmin*fmax<0 then begin sign:=true; rmax:=h end
            else rmin:=h;
    end;
     if not sign then begin result:=0; exit; end else result:=h;
end;

во втором модуле:

type
  tfunc = function(xi, T: double): double of object far;
в третьем модуле:
 TmLPhase = class (TmPhase)
    function dG(xi, T: double): double; override; //здесь такой же тип как и tfunc
...
 end;

 TmL1Phase = class (TmPhase)
    function dG(xi, T, h: double): double; override; //тоже нужно использовать бисекцию

//(tfunc здесь не проходит)
...
 end;

использование в программе:

a:=mmath.bisect(mLPhase.dG, 0, 5, 1e-4);
b:=mmath.bisect(mL1Phase.dG, 0, 5, 1e-4); //несоответствие типа функции.....


 
Reindeer Moss Eater ©   (2004-07-29 13:20) [1]

Параметрами что выступает, вещественные числа?

function MyFunction(const Data; AItemCount: Word) : TMyResult;


 
TUser ©   (2004-07-29 13:24) [2]

overload
еще можно передавать множество или динамический массив


 
имя   (2004-07-29 17:47) [3]

Удалено модератором


 
panov ©   (2004-07-29 17:56) [4]

А если так, например:

function MyFunc(arg1: Double=0;arg2: Double=0;arg3: Double=0;arg4: Double=0;arg5: Double=0): Double;

Обращение:

MyFunc(10.1,2);
MyFunc(1);
MyFunc(1,1,1,1);

??


 
Анонимщик ©   (2004-07-29 18:27) [5]

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


 
panov ©   (2004-07-29 18:41) [6]

А самое простое - передавать открытый массив в качестве параметра.


 
miha2   (2004-07-30 12:41) [7]

наверное, я неконкретно выразился....

передавать массив в качестве аргумента - не пойдет, параметры передать не проблема, проблема в передаче функции (у которой может быть 1, 2 и т.д. аргументов) . Например:

type
tvec = array of double;
tf1 = function(x: double): double of object;
tf2 = function(x, x1: double): double of object;

var
function bisect(f: tf1; x: double): double;

function TMyObj.root(func: tf1; p: tvec): double;
begin
...
result:={мат метод - находит корень функции 1-й переменной}mmath.bisect(func, p[0]);
end;

function TMyObj.root(func: tf2; p: tvec): double;
var f2: tf1;
begin
...
{здесь как-то нужно преобразовать func в f2}{внутри бисекции происходит вызов функции одной переменной, можно было бы сделать указатель (еще вопрос как?) на нужный процедурный тип и потом просто подменять, но как тогда быть с передачей параметров?}
result:={мат метод - находит корень функции 1-й переменной}mmath.bisect(f2, p[1]);
end;


...проблема грамотно все это объявить и сделать приведение процедурных типов... если так можно выразиться


 
miha2   (2004-07-30 12:46) [8]

еще уточню :)
нужно не передавать разное количество аргументов функции,
а передавать в функцию-1 функцию-2 как аргумент, причем функция-2 в разных классах определена с разным кол-вом аргументов.
Overload делать очень не хочется! (так уже сделано, но кривость и объем кода бесит)


 
GuAV ©   (2004-07-30 12:52) [9]

type tf = function(x: array of double): double of object;

в функциях f1, f2 вместо x1, x2, x3, ...  юзать x[0], x[1], x[2] ...

и тогда никого не надо приводить.
вызывать так: r:=fnc([a, b, c]);


 
Sandman25 ©   (2004-07-30 12:53) [10]

Лучше const x: array of double.
Если, конечно, не нужно изменять аргументы


 
GuAV ©   (2004-07-30 13:19) [11]


> нужно не передавать разное количество аргументов функции,
> а передавать в функцию-1 функцию-2 как аргумент, причем
> функция-2 в разных классах определена с разным кол-вом аргументов.

А как вызвать функцию-2 переданную как аргумент, если в разных классах она определена с разным кол-вом аргументов, и при этом нужно не передавать разное количество аргументов функции?


 
dtm   (2004-07-30 15:03) [12]

А VarArray тут не поможет ?



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

Форум: "Основная";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.033 c
1-1091528329
Heretic1
2004-08-03 14:18
2004.08.15
Сорздать на форме N шт. TButton s (N=1..n)


3-1090448400
Viner
2004-07-22 02:20
2004.08.15
ADO и MySQL


14-1091352610
vidiv
2004-08-01 13:30
2004.08.15
Какие основные операции выполняемые над бинарным деревом?


14-1091107443
rea
2004-07-29 17:24
2004.08.15
Trial


14-1091217398
NNM
2004-07-30 23:56
2004.08.15
Старое доброе мужество





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский