1 pièce(s) jointe(s)
Exception XCPT UNABLE TO GROW STACK
Bonjour, :D
Il m'est arrivé plusieurs fois d'être confronté à des plantages de programmes de traitement d'images, qui intervenaient lors de leur exécution, après que leur compilation se soit bien passée.
Quelques recherches ont permis de vérifier que le blocage était lié à la déclaration d'une variable tableau de volume suffisamment important, comme on peut le voir sur les exemples suivants, délibérément simplifiés, dans lesquels intervient une matrice carrée d'entiers longs:
# Premier programme, réalisant l'initialisation de tous les éléments de la variable:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| PROGRAM Var_Tableau;
USES Crt;
CONST Max = 5000;
TYPE Tab_E = ARRAY[0..Max, 0..Max] OF LongInt;
VAR Matrice: Tab_E;
PROCEDURE Calc_M1(VAR M_: Tab_E);
VAR i, j: Word;
BEGIN
FOR i:= 0 TO Max DO
FOR j:= 0 TO Max DO BEGIN
M_[i, j]:= 555555;
GotoXY(10, 15); Write(i:4)
END;
ReadLn
END;
BEGIN
Calc_M1(Matrice)
END. |
Ici l'exécution se déroule comme prévu.
# Second programme, proche du précédent:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| PROGRAM Var_Tableau;
USES Crt;
CONST Max = 5000;
TYPE Tab_E = ARRAY[0..Max, 0..Max] OF LongInt;
PROCEDURE Calc_M2;
VAR i, j: Word; Matrice: Tab_E;
BEGIN
FOR i:= 0 TO Max DO
FOR j:= 0 TO Max DO BEGIN
Matrice[i, j]:= 555555;
GotoXY(10, 15); Write(i:4)
END;
ReadLn
END;
BEGIN
Calc_M2
END. |
Bien que la compilation se déroule là encore avec succès, le lancement du programme est immédiatement suivi de son arrêt, avec l'affichage suivant:
dès que l'on a Max > 507.
Le plantage est donc déclenché dès lors que Matrice devient une variable locale de taille supérieure à environ 1 Mo (1032256). Cette difficulté se contourne bien sûr aisément, mais elle apparaît regrettable dans la mesure où il s'agissait, dans les programmes antérieurs beaucoup plus vastes, d'un simple intermédiaire de calcul conduisant à toute autre chose (en l'occurrence, un tableau de pixels).
Je ne comprend pas l'origine de cette contrainte, et n'ai pas trouvé sur la Toile d'informations claires.
Quelqu'un peut-il me fournir des indications sur le sujet ?
Y a-t-il des variantes envisageables pour la programmation, pas ex. l'intervention de pointeurs, qui permettraient de garder Matrice comme variable locale ?
De quelle expression le terme "XCPT" est-il l'abréviation ? Beaucoup de messages d'erreur me paraissent totalement hermétiques. :oops:
Merci d'avance, pour toutes vos réponses.
Exception XCPT UNABLE TO GROW STACK
Ça y est, j'ai compris ! J'avais complètement oublié que les variables locales sont réservées dans la pile ... il faut donc déclarer d'emblée les tableaux de grande taille en variables globales.
L'option du fichier temporaire m'avait échappé ... idée à creuser.
Je regarderai les limitations de taille retenues sur mon logiciel, et les programmes sources dans les dossiers que tu as évoqués.
:merci: encore pour ces précieuses informations !