Bonjour,
J’utilise souvent le site depuis sa création pour y trouver des réponses, mais c’est la première fois que je coince sur un problème, d’où cette petite demande d’aide.
Je désire effectuer le traitement statistique d’un tableau dynamique assez volumineux (>100.000 élements) dans une fonction : ce calcul nécessite un tri du tableau dans la fonction, mais je dois récupérer le tableau dans sa forme d’avant l’appel de la fonction (non trié donc).
J’ai lu les quelques conseils sur les déclarations et l’utilisation de gros tableaux sur le site ou ailleurs, j’ai néanmoins un débordement de pile au delà de 103.000 éléments.
En appliquant les conseils trouvés (notamment le passage de paramètre en var ), je n’ai pas d’erreur, mais ça ne réponds pas à mon problème car le tableau se trouve trié en sortant de la fonction.
Ci-dessous un code minimaliste illustrant le souci.
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 Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls ; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Déclarations privées } A : array of extended; B : array of extended; public { Déclarations publiques } end; var Form1: TForm1; implementation {$R *.dfm} procedure MaProc1( var A : array of extended); begin //-- code contenant un tri du tableau A -> mais du coup, le tableau A est trié en sortie end; procedure MaProc2( A : array of extended); begin //<-- erreur d'exécution ici : débordement de pile ici //-- code contenant un tri du tableau A -> le tableau A n'est pas trié en sortie end; procedure TForm1.Button1Click(Sender: TObject); var i : integer; begin SetLength(A, 110000); for i:=low(A) to high (A) do A[i]:=random ; MaProc1(A); //-- fonctionne MaProc2(A); //-- erreur : débordement de pile Finalize(A); end; end.
Je peux contourner le problème en utilisant un tableau intermédiaire B comme ceci :
Du coup, le tableau A n'est pas touché, mais comme ma fonction est exécutée des millions de fois, si je pouvais éviter cette étape de copie… (toute milliseconde de traitement gagnée est bonne à prendre ;-)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SetLength(B, 110000); Move(Pointer(A)^, Pointer(B)^, SizeOf(A[0])* Length(A)); MaProc1(B);
J'espère avoir été clair. Merci d’avoir pris le temps de me lire.
Yann
Partager