Bonjour,

Ce message fait suite à la discussion "Intégration numérique d'une fonction" que j'ai crée. Mais ne savant pas comment changer le titre du sujet, je crée cette nouvelle discussion.
J'ai ("on", avec l'aide des forumers) créé une unit (integration.pas)dans lequel est définie une fonction qui prend en argument une fonction et 2 bornes d'intégration, et qui en retour donne l'intégrale de cette fonction entre ces bornes.
Ensuite, je me mets dans une autre unit, j'appel l'unit Integration, je déclare une fonction test que je veux intégrer entre 1 et 2 par exemple et j'écris integration(1,2,test).
Problème : ça marche seulement si ma fonction test est définie en dehors de ma procédure.
Un membre a suggéré que c'était du à un problème de visibilité, sans pouvoir m'en dire plus. J'ai cherché un peu et me suis renseigné sur cette histoire de visibilité mais ne comprends toujours pas. Surtout que si j'utilise ma fonction test en tant que fonction (test(3) par exemple), ça marche. Mais si je la passe en argument de integration, j'ai le message
[DCC Error] DGL1D_Interface_ThermionicEmission.pas(364): E2094 Local procedure/function 'theta' assigned to procedure variable
Je mets ci-dessous l'unit integration.pas :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
unit Integration;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TOperation = function(X: Extended): Extended;
 
  function Integrale(X1,X2 : Extended; Fonction: TOperation): Extended;
 
implementation
 
   function Integrale(X1,X2 : Extended; Fonction: TOperation): Extended;
Var
   N, i : Integer ;
   Somme, XDeb, XFin, Pas : Extended ;
   YDeb, YFin : Extended ;
begin
  N := 100 ;
  Somme := 0 ;
  Pas := (X2 - X1)/N ;
  For i := 1  to N Do
     Begin
        XDeb := X1 + (i-1) * Pas ;
        XFin := Xdeb + Pas ;
        YDeb :=  Fonction(XDeb) ;
        YFin :=  Fonction(XFin) ;
        Somme := Somme + (YDeb + YFin) / 2 * Pas ;
     End ;
  result := Somme ;
end;
 
end.
et l'unit où je l'utilise :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit XXX;

interface

uses ...,integration;


type

XXX =  class(Z)

  inte:extended;


  // DGLsystem to be solved
  procedure DGLSys; override;                      //DC mode DGL


end;



implementation


uses ...;


function test(B: extended): extended;
begin
  result := B*5;
end;

//steady-state DC DGLSys, Thermionic Emission Interface
procedure TDGL1D_Interface_ThermionicEmission.DGLSys;


var

  dxInt :extended;       

  //Heavyside function
  function theta(xx:Extended):Extended;
  begin
  result := 0;
  if xx<0 then result :=1;
  end;


begin

inte:=Integrale(1.0,2.0,theta); //ceci ne marche pas avec theta, mais marche avec test

theta(1); //ceci marche

end;
Merci d'avance pour votre aide.
Helber