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 messageJe mets ci-dessous l'unit integration.pas :[DCC Error] DGL1D_Interface_ThermionicEmission.pas(364): E2094 Local procedure/function 'theta' assigned to procedure variable
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 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.
Merci d'avance pour votre aide.
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;
Helber
Partager