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 :

Plantage avec utilisation de long double


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Points : 21
    Points
    21
    Par défaut Plantage avec utilisation de long double
    Bonjour à tous je suis nouveau sur ce forum.

    Je dois réaliser une série de calculs additionnant des chiffres pouvant aller jusqu'à un écart de 10^8, le problème c'est que l'utilisation des double me fait apparaitre au bout d'un certain moment des infini. Ni une ni deux je me dis "tiens j'ai jamais essayé les long double", je fais un ctrl+R sur l'ensemble de mes fichiers et je compile sereinement.

    Mais au moment de l'exécution : crash direct (évidemment mon code fonctionnait parfaitement avant !). Je fais un debuggueur celui ci me dit que cela vient de ma fonction inserer() mais sans plus d'argument (alors qu'il devrait normalement préciser la valeur des paramètres d'entrées qui sont deux long double et une liste)... Signal SIGSEGV étrange mais pourquoi pas.
    Alors je fais à l'ancienne et en bourrin en regardant un peu ce qu'il passe à coup de printf de bricoleur. Et là... grand mystère !
    J'ai posé un breakpoint juste avant la première instruction du main, aucun problème... dès que je fais nextline et qu'il entamme la première instruction il me fait le rapport ci-dessous

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include "data.h"
    #include "random.h"
    #include "liste.h"
     
    int main(int argc,char* args[])
    { //Breakpoint NTD
        srand(time(NULL)); //Plantage !
        long i, a, s;
        cellule* f = NULL;
        FILE* csv = fopen("Data.csv","w");
        long double T1[100001], T2[100001];
        T1[0] = 0.0;
        T2[0] = 0.0;
        long double m = 0;
     
        //
     
        ...
     
       //
    }
    J'ai beau mettre mon printf bien avant l'exécution de la fonction, et même juste après les déclarations de variables le programme refuse d'afficher mon printf("youpi") et semble donc bugguer avant... On dirait donc qu'il y a un problème au niveau des liens effectués au début pour le compilateur bien avant le main.

    Voilà la tronche de mon rapport debug :
    Call Stack

    0 probe() //Je ne connais pas cette fonction elle n'est pas de moi
    1 insertion()
    2 _mingw_CRTSartup()
    3 mainCRTStartup()
    Merci beaucoup !

  2. #2
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    Vu que tu as deux gros tableau sur la pile, ça va augmenter leur taille et peut être dépasser la capacité de la pile.

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Probablement, la taille des tableaux T1 et T2, alloués sur la pile, est devenue trop grande.
    Envisager dans ce cas l'allocation dynamique ou des variables statiques.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Oh un fan de Glenn Gould !

    Je ne crois pas que cela soit un problème de taille de tableau, le phénomène est aléatoire et se produit quand par exemple j'additionne 80072.898.... + 0.0012909

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Points : 641
    Points
    641
    Par défaut
    le phénomène est aléatoire et se produit quand par exemple j'additionne 80072.898.... + 0.0012909
    Il faut être un peut plus précis, là tu nous dit que ça viens au moment d'une addition (j'en vois pas dans ton code) et plus haut tu nous dit que ça ce produit dès la première instruction ?

    En C on déclare les variables en début de bloc. (le débogueur si retrouvera peut-être mieux.)

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    Hum pardon en fait je pensais qu'il me proposait un autre moyen que les long double pour palier mon problème, j'avais mal compris.

    A ce sujet est-ce que quelqu'un sait comment détecter un infini ?
    J'ai une idée pour légèrement contourner le problème et arrêter le programme dès qu'il y a une apparition d'infini... Mais j'ai un petit problème de connaissance sur le boucle if qui va gérer ça.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par thebop Voir le message
    j'ai jamais essayé les long double", je fais un ctrl+R sur l'ensemble de mes fichiers
    Je pense que tu as déjà du le faire, mais pour les fonctions de type "printf", le format d'affichage des long double est %Lf ou %Lg (avec un L majuscule).

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    À ma connaissance, le printf() de MinGW ne peut pas afficher un long double, car il est basé sur celui de Microsoft, qui n'a pas le même format de long double:
    • GCC: double = 64 bits, long double = 80 bits
    • Microsoft: double = 64 bits, long double = 64 bits aussi.


    Edit: Merci pour le lien, Nicolas, je vais sans doute le garder sous la main.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Lucien63 Voir le message
    En C on déclare les variables en début de bloc. (le débogueur si retrouvera peut-être mieux.)
    Non, plus depuis la norme C99, de 1999, faudrait se mettre à jour de temps en temps...
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À ma connaissance, le printf() de MinGW ne peut pas afficher un long double, car il est basé sur celui de Microsoft, qui n'a pas le même format de long double:
    • GCC: double = 64 bits, long double = 80 bits
    • Microsoft: double = 64 bits, long double = 64 bits aussi.
    http://msdn.microsoft.com/de-de/libr...15(VS.80).aspx
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

Discussions similaires

  1. Pourquoi utiliser un Long ou un Double ?
    Par n!co dans le forum Langage
    Réponses: 7
    Dernier message: 21/02/2007, 17h52
  2. Réponses: 2
    Dernier message: 24/12/2006, 17h33
  3. utilisation de long double
    Par reptils dans le forum C
    Réponses: 16
    Dernier message: 16/05/2006, 16h51
  4. Réponses: 5
    Dernier message: 11/05/2006, 08h51
  5. Réponses: 4
    Dernier message: 12/09/2003, 11h38

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