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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.05.2011, 21:27   #1
Ce4kok
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 40
По умолчанию Не получается вызвать функцию!

Собственно вот: имеем 2 unit'a - в одном описана наша функция вычисления интеграла методом Симпсона, а в другом модуле непосредственно уже вызов этой функции.
Почему-то не хочет вычислять и ругается "undeclared identifier 'Simpson'"

Код:
Сама функция вычисления методом Симпсона:
unit Unit2;
interface
type
  TFunction = function(x: real): real;
{вычисление определенного интеграла методом Симпсона
 a,b-пределы интеграла, eps-точность решения, Fun-подынтегральная функция}

implementation

function Simpson(Fun: TFunction; a,b,eps: real): real;
var
  i,n: Longint;
  h,s0,s: real;
begin
  n:=1; s:=0;
  repeat
    n:=n*2; h:=(b-a)/n; s0:=s;
    s:=Fun(a)+Fun(b);
    for i:=1 to n-1 do
      s:=s+2*(1+i mod 2)*Fun(a+i*h);
    s:=s*h/3;
  until abs(s-s0) <= eps;
  Simpson:=s;
end; {Simpson}

{подынтегральная функция}
function F(x: real): real; far;
begin
  F:=6*sin(x);
end; {F}
end.
___________________________________ ______________________________
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus;

type

  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    ListBox1: TListBox;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    procedure PopupMenu1Popup(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);

  private
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
   uses Unit2;



{$R *.dfm}

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
ComboBox1.AutoComplete := True;
ComboBox1.AutoDropDown := True;
ComboBox1.DroppedDown := True;
ComboBox1.AutoCloseUp := False;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin

if ComboBox1.ItemIndex=0 then
  begin
    ListBox1.Items.Clear;
    ListBox1.Items.Add('6sin(x)');
  end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
 //тут вызываем функцию
  Label2.Caption := FloatToStr(Simpson(F,1,2,0.025));
  //readln;
end;

end.
Ce4kok вне форума Ответить с цитированием
Старый 25.05.2011, 22:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
unit Unit2;
interface
//type
//  TFunction = function(x: real): real;
function Simpson(Fun: TFunction; a,b,eps: real): real;
{вычисление определенного интеграла методом Симпсона
 a,b-пределы интеграла, eps-точность решения, Fun-подынтегральная функция}

implementation

function Simpson(Fun: TFunction; a,b,eps: real): real;
...
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.05.2011, 22:13   #3
Ce4kok
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 40
По умолчанию

ну тогда Дэлфи не понимает что такое TFunction
Ce4kok вне форума Ответить с цитированием
Старый 25.05.2011, 22:17   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А нашиша тебе дался тип TFunction ?
Объявление функц.типа нужно тогда когда адрес точки входа в ф-цию вычисляется в ран-тайм. А у тебя адрес ф-ции известен компилятору уже в момент компиляции..
mss вне форума Ответить с цитированием
Старый 25.05.2011, 22:24   #5
Ce4kok
Пользователь
 
Регистрация: 25.01.2009
Сообщений: 40
По умолчанию

избавился от TFunction, но всё равно компилятор ругается
Ce4kok вне форума Ответить с цитированием
Старый 25.05.2011, 22:27   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

И уж если таки TFunction нужна для обратного вызова подинтегральной ф-ции с соотв.прототипом из юнита Unit1, то в этом же юните следует объявить эту подинтегральную ф-цию и передать ее адрес при вызове ф-ции Симпсона из юнита 2:
mss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать функцию из юнита? Des Общие вопросы Delphi 5 06.11.2010 12:47
QT4 вызвать глобальную функцию kin63camapa Общие вопросы C/C++ 0 30.03.2010 22:20
Не могу вызвать функцию (( NewKoder Общие вопросы C/C++ 4 11.12.2009 17:26
Вызвать функцию ассемблера из С++ Dima88 Помощь студентам 3 11.12.2009 00:54
Как вызвать функцию? blackstersl Общие вопросы Delphi 10 07.06.2009 19:22