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

 C++ Discussion :

Petite question sur la pile


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 65
    Points : 58
    Points
    58
    Par défaut Petite question sur la pile
    Bonjour,

    je viens de créer un programme qui tourne relativement bien, en fait le but est un calcul de vecteur dans une boucle, du type ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while(F>eps)
    {
      F = F + G;
      condition = square(F,2);
    }
    Pour faire vite, eps est la précision que je demande, square est une fonction qui me calcule un produit scalaire.
    Bref tout se passe bien, jusqu'à un moment où le programme plante et me renvoie une erreur du type BDD:

    L'exception Dépassement de capacité en virgule flottante.
    (0xc0000091) s'est produite dans l'application à l'emplacement 0x00403ce4.


    Bref, je me dis qu'il doit y avoir un problème de mémoire, que j'ai omis de détruire quelques pointeurs par ci par là, et donc j'aimerais tester la mémoire de la pile et du tas, pour voir si toutes deux restent disponibles.
    En premier lieu, je décide de vérifier à chaque itération la pile, en utilisant la variable globale _stklen du dos.h, et là surprise, le compilateur me renvoie à la figure que cette variable n'est pas déclarée.

    Je précise que je compile avec Borland C++ Builder. Pourriez-vous me dire d'où cette erreur provient ? Je vous remercie.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je ne pense pas que ça aie à voir avec un problème de mémoire. Il s'agirait plutôt d'une erreur de calcul flottant : ton calcul génère un résultat trop grand et ne peut être représenté ce qui aboutit à l'exception. Cela se règle probablement sur la vérification des conditions de ton algo.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Non, je crois que le message d'erreur est clair.

    Tu essaies de mettre dans un de tes flottants un nombre plus grand que ce qu'il ne sait gérer et cela génère une exception.

    Est qu'il est normal que tu arrives à une valeur aussi grande ?
    • Si la réponse est non, tu as un problème dans ton algorithme.
    • Si la réponse est oui, utilise un type de données plus grans qui permet de gérer ces tailles de nombre (attention, tu ne fais que repousser le problème)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 65
    Points : 58
    Points
    58
    Par défaut
    Merci pour ces réponses.

    Je vais vérifier les nombres. Ce qui m'ennuie, c'est que j'utilise des long double, donc j'ai vérifié que mes nombres étaient limités à la valeur 10^308.

    Je vais regarder ça, et vous remercie de votre aide.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est vraiment le code qui tu as écrit ?

    Parceque si c'est le cas, la condition d'arrêt peut ne jamais être vérifiée, et donc, square(F,2) dépasser les valeurs souhaitées...

    Si tu prends F > eps au début de la boucle, et.... G positif... ca s'arrête jamais !
    Et au bout d'un moment (Finitial + n*G)*2 dépasse la taille d'un long doule (n étant le nombre d'itérations)
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 65
    Points : 58
    Points
    58
    Par défaut
    Non Non, j'ai simplifié le code, car c'est un code confidentiel normalement. En fait, j'ai retranscris de façon très simpliste ce que je veux faire. Mais G est un vecteur calculé à partir d'une méthode très complexe, et, de la même manière que l'algo de Newton Raphson, le produit scalaire de F peut diminuer en déça d'une valeur eps.

    Bref, j'ai résolu mon problème de dépassement, c'était justement un problème de produit scalaire mal calculé. Merci pour le coup de main.

    Cependant, par curiosité, pour en revenir au contrôle de la pile, comment se fait-il que je ne puisse pas utiliser la variable globale _stklen du dos.h ? Faut-il un compilateur spécifique plus performant comme borland builder ou visual ?

  7. #7
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par ketchupi Voir le message
    comment se fait-il que je ne puisse pas utiliser la variable globale _stklen du dos.h ?
    Parce que tu n'es plus sous DOS...
    Pour ma part, sous VC2008, je n'ai même plus cette fonction déclarée non plus !

    Quand tu passes en mode Debug, tu as la trace complète de la pile, avec contexte d'exécution, paramètres et tout et tout, ce qui rend ce genre de truc et astuce datant du DOS légèrement obsolète...

    De plus, sous un Windows actuel (XP et plus donc), la taille de la pile n'a plus rien à voir avec celle que l'on utilisait avec le DOS. Sous DOS, tu ne pouvais pas dépasser 64 ko de pile, et pour des raisons d'économie mémoire, on la redimensionnait souvent à des valeurs bien inférieures.

    Actuellement, la taille par défaut d'une pile varie entre un et quatre mégas, et ceci pour chaque thread du processus... Quand la pile explose, c'est plus une erreur de conception ou un bon gros bug des familles (fuite mémoire) qu'une "vraie" limite, y compris dans les fonctions récursives.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    Actuellement, la taille par défaut d'une pile varie entre un et quatre mégas, et ceci pour chaque thread du processus... Quand la pile explose, c'est plus une erreur de conception ou un bon gros bug des familles (fuite mémoire) qu'une "vraie" limite, y compris dans les fonctions récursives.
    Une erreur qu'on voit souvent est la déclaration d'un tableau très gros sur la pile.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 65
    Points : 58
    Points
    58
    Par défaut
    Merci merci, tout cela me parait clair.

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Une erreur qu'on voit souvent est la déclaration d'un tableau très gros sur la pile.
    Exact. Ce qui est bien une erreur de conception, d'ailleurs...
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

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

Discussions similaires

  1. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  2. [Visuel XP] Petite question sur le theme XP...
    Par ZoumZoumMan dans le forum C++Builder
    Réponses: 12
    Dernier message: 20/01/2005, 14h41
  3. petite question sur le composant IBX ...
    Par vbcasimir dans le forum Bases de données
    Réponses: 4
    Dernier message: 05/01/2005, 10h33
  4. Réponses: 3
    Dernier message: 08/12/2004, 13h58
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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