IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres IDE Pascal Discussion :

Exception XCPT UNABLE TO GROW STACK [Virtual Pascal]


Sujet :

Autres IDE Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut Exception XCPT UNABLE TO GROW STACK
    Bonjour,

    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 Pascal : 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
     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 Pascal : 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
     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:

    Nom : Exception XCPT UNABLE TO GROW STACK.png
Affichages : 132
Taille : 28,3 Ko

    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.
    Merci d'avance, pour toutes vos réponses.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 167
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Je vois dans les options de VPC :

    Memory sizes: -$M<StackSize[,MaxStackSize]> (default: 16384,1048576)
    509 * 509 * 4 = 1 036 324, ce qui n'est pas loin de la valeur maximale. Donc, peut-être qu'en jouant avec cette option... Mais je ne sais pas jusqu'à quelle valeur on peut aller.

    5001 * 5001 * 4 = 100 040 004.

    Si c'était moi, je créerais un fichier temporaire sur le disque.

    Citation Envoyé par wiwaxia Voir le message
    De quelle expression le terme "XCPT" est-il l'abréviation ?
    XCPT veut dire exception je pense.

    Dans [virtualpascal]/source/rtl/sys/system.pas, je vois ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure _ExceptionHandler(Report,Registration,Context,Void: Pointer); assembler; {&USES ebx,esi,edi} {&FRAME+}
    type
      ExceptionData = record
        No: Longint;
        EC: Byte;
      end;
    const
      ExcpCount = 14;
      ExcpData: array [1..ExcpCount] of ExceptionData =
      (
        { ... }
        (No: XCPT_UNABLE_TO_GROW_STACK;     EC: RTE_Stack_Overflow        ),

  3. #3
    Membre Expert

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Billets dans le blog
    9
    Par défaut 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.

    encore pour ces précieuses informations !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. call stack pour info exceptions
    Par stroumpf dans le forum Langage
    Réponses: 0
    Dernier message: 10/01/2008, 11h34
  2. [Form.Close] System Stack Overflow Exception
    Par Ticoche dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/01/2008, 18h13
  3. Unable to debug System.Net.DigestClient throws an exception
    Par wayak3 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 22/12/2007, 09h08
  4. GDS Exception. 335544721. Unable to complete network request to host "localhost"
    Par oussam dans le forum Connexion aux bases de données
    Réponses: 8
    Dernier message: 28/08/2007, 17h34
  5. [Exception] récupération de la stack trace d'une Throwable
    Par totof2308 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 14/05/2004, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo