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 :

Compilation mais bug à l'execution


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut Compilation mais bug à l'execution
    Bonjour,

    A la compilation, dev c++ ne me retroune pas d'erreur et pourtant à l'execution le programme bug, je ne sais pas d'où cela peut-il bien provenir ! peut être que c'est un problème de mémoire enfin je sais pas !
    Tout ce que je peux vous dire c'est que dès le début du programme quelque chose ne marche pas. j'ai mis chaque ligne en partant de la fin en commentaire pour arriver au début du code et cela bug mais je ne vois pas l'erreur surement un truc de noob ne fois de plus !

    Voici le code

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main (void)
    {
     
        float pas=0.1;
        int i=1,j=0,k=1;
        float x,y,r;
        float dAP[1365][610], dBP[1365][610], dCP[1365][610];
        float precision=0.00001;
     
        for (i;i<=1365;i++)
            {
                           for (j;j<=610;j++)
                               {
                                             x=i*pas*cos(60);
                                             r=x/cos(j*pas);
                                             y=r*sin(j*pas);
     
                                             dAP[i][j]=sqrt(x*x+y*y);
                                             dBP[i][j]=sqrt((x-273)*(x-273)+y*y);
                                             dCP[i][j]=sqrt((x-136,5)*(x-136,5)+(y-273*sin(60))*(y-273*sin(60)));
     
                                             for (k;k<=1365;k++)
                                                 {
                                                                if (     ( ((k-precision)<=dAP[i][j] )&&( (k+precision)>=dAP[i][j]) ) 
                                                                       &&( ((k-precision)<=dBP[i][j] )&&( (k+precision)>=dBP[i][j]) ) 
                                                                       &&( ((k-precision)<=dCP[i][j] )&&( (k+precision)>=dCP[i][j]) )     )
     
                                                                   {
                                                                       printf("dAP=%f\n",dAP[i][j]);
                                                                       printf("dAP=%f\n",dBP[i][j]);
                                                                       printf("dAP=%f\n",dCP[i][j]);
                                                                       getch();
                                                                   }
     
     
                                                             else  {
                                                                       printf("r=%f, x=%f, y=%f, dAP=%f, dBP=%f, dCP=%f FAILURE\n",r,x,y,dAP[i][j],dBP[i][j],dCP[i][j]);
                                                                   }
                                                 }
     
                               }
            }
     
    }
    Merci d'avance !

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    A la compilation, dev c++ ne me retroune pas d'erreur et pourtant à l'execution le programme bug, je ne sais pas d'où cela peut-il bien provenir !
    La compilation et l'exécution sont deux choses complètement différentes. Si l'on prend l'erreur la plus classique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * p_char;
    p_char = NULL;
    char character = *p_char;
    La compilateur ne va absolument rien te dire car pour lui, tout est correcte. Mais quand tu vas executer .. ca va crasher . 90% des crashs d'un executable, en C++, provienne de pointeur NULL..

  3. #3
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Dans ton cas, je pencherais pour un mauvais parcours de tes tableaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    float dAP[1365][610];
     
    for (i = 0;i<1365;i++)
    {
        for (j = 0;i<610;i++)     
        {
            ///.. dAP[i][j] ...
        }
    }
    Pour rappel, les index d'un tableau vont de 0 à n-1 .. pour un tableau de taille n.

    Pense à réinitialiser tes index de tes boucles for, car nottemment pour le j, rien n'indique qu'elle doit recommencer à zero

  4. #4
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Pourtant au début j'ai initialisé i et j respectivement à 1 et 0.
    J'ai quand même fais les modifications proposées mais cela ne change pas !
    j'ai toujours ce satané "ne pas envoyer"!

    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
    int main (void)
    {
     
        float pas=0.1;
        int i=1,j=0,k=1;
        float x,y,r;
        float dAP[1366][611], dBP[1366][611], dCP[1366][611];
        float precision=0.00001;
     
        for (i=1;i<=1365;i++)
            {
                           for (j=0;j<=610;j++)
                               {
                                             x=i*pas*cos(60);
                                             r=x/cos(j*pas);
                                             y=r*sin(j*pas);
     
                                             dAP[i][j]=sqrt(x*x+y*y);
                                             dBP[i][j]=sqrt((x-273)*(x-273)+y*y);
                                             dCP[i][j]=sqrt((x-136,5)*(x-136,5)+(y-273*sin(60))*(y-273*sin(60)));
     
                                             for (k=1;k<=1365;k++)
                                                 {
                                                                if (     ( ((k-precision)<=dAP[i][j] )&&( (k+precision)>=dAP[i][j]) ) 
                                                                       &&( ((k-precision)<=dBP[i][j] )&&( (k+precision)>=dBP[i][j]) ) 
                                                                       &&( ((k-precision)<=dCP[i][j] )&&( (k+precision)>=dCP[i][j]) )     )
     
                                                                   {
                                                                       printf("dAP=%f\n",dAP[i][j]);
                                                                       printf("dAP=%f\n",dBP[i][j]);
                                                                       printf("dAP=%f\n",dCP[i][j]);
                                                                       getch();
                                                                   }
     
     
                                                             else  {
                                                                       printf("r=%f, x=%f, y=%f, dAP=%f, dBP=%f, dCP=%f FAILURE\n",r,x,y,dAP[i][j],dBP[i][j],dCP[i][j]);
                                                                   }
                                                 }
     
                               }
            }
     
    }

  5. #5
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    Pourtant au début j'ai initialisé i et j respectivement à 1 et 0.
    Y a t'il une raison particulière de faire commencer ton i et ton k par 1 ??


    Citation Envoyé par darkwall_37 Voir le message
    J'ai quand même fais les modifications proposées mais cela ne change pas !
    j'ai toujours ce satané "ne pas envoyer"!
    Qu'est que ton "ne pas envoyer" ???? Ton problème est un problème d'exécution genre crash ou "segmentation fault" ? ou un problème de comportement de ton code, il ne fait pas ce que tu veux ?

  6. #6
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Ce programme est censé me trouvé les points appartenant à un triangle equilateral de coté 273 dont les distances aux trois sommets sont entières.
    J'opère dans le demi triangle equilatéral et puis par symétrie ...

    A la base si mais maintenant que j'y refléchis plus il faudrait que cela demarre à 0 : mauvais calcul de ma part ! donc i et k seront initialisés à 0 finalement !

    Quant au "ne pas envoyer" c'est l'erreur windows qui demande si l'on veut leur envoyer un rapport, et ne me dites pas que vous ne l'avez jamais eu cette erreur !

    En gros dès l'execution, l'invite apparait mais j'ai de suite après le rapport de windows comme quoi le programme a rencontré un problème et doit fermer. "Nous vous prions de nous excuser pour le désagrément encouru."
    Puis demande si l'on veut envoyer le rapport d'erreur ou non !

    J'ai bien répondu à votre question ?


    cordialement

  7. #7
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Donc ton problème est effectivement une crash de l'application, tu essaye certainement d'accéder à une valeur en dehors du tableau.

  8. #8
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Ton premier problème, qui n'a rien a voir avec un crash, est que sin et cos prend la valeur des angle en radian ...

    Pour ton problème principal, j'ai essayé ton code .. et il s'avère qu'un tableau de flottant de 1366 * 611 semble trop gros ... "stack overflow" ...

  9. #9
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Ok pour les angles j'aurais du y penser ! suffit de convertir, ça devrait aller ! merci
    Par contre pour la dimension des tableaux c'est la mémoire de l'ordinateur qui va limiter dans ce cas là ? parce que si c'est cela sur mon pc à mon apart est bien plus puissant que là ou je me trouve en ce moment donc ça marcherait peut être mieux ?
    La valeur de Pi en C je dois inclure quel bibliothèque pour la récupérer ? un truk du genre math je suppose ?
    Ou je déclare float Pi=3.141592654 ?

    Voici le nouveau code,

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    int main (void)
    {
     
        float Pi=3.141592654; 
        float pas=0.1;
        int i=0,j=0,k=0;
        float x,y,r;
        float dAP[1376][611], dBP[1376][611], dCP[1376][611];
        float precision=0.00001;
     
        for (i=0;i<=1376;i++)
            {
                           for (j=0;j<=610;j++)
                               {
                                             x=i*pas*cos(Pi/3);
                                             r=x/cos(j*pas*Pi/180);
                                             y=r*sin(j*pas*Pi/180);
     
                                             dAP[i][j]=sqrt(x*x+y*y);
                                             dBP[i][j]=sqrt((x-273)*(x-273)+y*y);
                                             dCP[i][j]=sqrt((x-136,5)*(x-136,5)+(y-273*sin(Pi/3))*(y-273*sin(Pi/3)));
     
                                             for (k=0;k<=1376;k++)
                                                 {
                                                                if (     ( ((k-precision)<=dAP[i][j] )&&( (k+precision)>=dAP[i][j]) ) 
                                                                       &&( ((k-precision)<=dBP[i][j] )&&( (k+precision)>=dBP[i][j]) ) 
                                                                       &&( ((k-precision)<=dCP[i][j] )&&( (k+precision)>=dCP[i][j]) )     )
     
                                                                   {
                                                                       printf("dAP=%f\n",dAP[i][j]);
                                                                       printf("dAP=%f\n",dBP[i][j]);
                                                                       printf("dAP=%f\n",dCP[i][j]);
                                                                       getch();
                                                                   }
     
     
                                                             else  {
                                                                       printf("r=%f, x=%f, y=%f, dAP=%f, dBP=%f, dCP=%f FAILURE\n",r,x,y,dAP[i][j],dBP[i][j],dCP[i][j]);
                                                                   }
                                                 }
     
                               }
            }
     
    }








    Merci encore

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Feo,
    Citation Envoyé par darkwall_37 Voir le message
    Ok pour les angles j'aurais du y penser ! suffit de convertir, ça devrait aller ! merci
    Par contre pour la dimension des tableaux il faut que je réduise alors très largement le pas mais à combien suis-je limité ?

    La valeur de Pi en C je dois inclure quel bibliothèque pour la récupérer ? un truk du genre math je suppose ?
    Ou je déclare float Pi=3.141592654 ?

    Voici le nouveau code,

    [CODE]...
    float dAP[1376][611], dBP[1376][611], dCP[1376][611];
    float precision=0.00001;

    for (i=0;i<=1376;i++)
    {
    for (j=0;j<=610;j++)
    {
    ...
    Je n'ai pas lu en détails, mais tu persistes avec les dépassements de tableaux.

    Les indices commençant à 0, un tableau déclaré de taille N dispose des indices de 0 à N-1, et les boucles dans ton cas doivent donc être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
        float dAP[1376][611], dBP[1376][611], dCP[1376][611];
        float precision=0.00001;
        
        for (i=0;i<1376;i++)
            {
                           for (j=0;j<=610;j++)
                               {
    ...
    curieusement, tu as pourtant corrigé le problème sur la boucle j, et tu l'avais effectivement corrigé dans un premier temps

    D'autre part, il n'est pas recommandé d'utiliser des valeurs "magiques", c'est à dire écrites en clair dans le programme.
    L'utilisation de constantes pour utiliser ces valeurs aide énormément, ne serait-ce que pour la maintenance du programme, en cas de changement des valeurs.

  11. #11
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Voici le code modifié, j'espère ne pas avoir mal intérprété ce que vous avez dit concernant les constantes !
    Le programme crash encore


    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
    int main (void)
    {
     
        float pas=0.1;
        int i=0,j=0,k=0;
        float x,y,r;
        float dAP[1376][611], dBP[1376][611], dCP[1376][611];
        float precision=0.00001;
        float radian=3.141592654/180;
        float project_y=273*sin(60*radian);
     
        for (i=0;i<1376;i++)
            {
                           for (j=0;j<611;j++)
                               {
                                             x=i*pas*cos(60*radian);
                                             r=x/cos(j*pas*radian);
                                             y=r*sin(j*pas*radian);
     
                                             dAP[i][j]=sqrt(x*x+y*y);
                                             dBP[i][j]=sqrt((x-273)*(x-273)+y*y);
                                             dCP[i][j]=sqrt((x-136,5)*(x-136,5)+(y-project_y)*(y-project_y));
     
                                             for (k=0;k<1376;k++)
                                                 {
                                                                if (     ( ((k-precision)<=dAP[i][j] )&&( (k+precision)>=dAP[i][j]) ) 
                                                                       &&( ((k-precision)<=dBP[i][j] )&&( (k+precision)>=dBP[i][j]) ) 
                                                                       &&( ((k-precision)<=dCP[i][j] )&&( (k+precision)>=dCP[i][j]) )     )
     
                                                                   {
                                                                       printf("dAP=%f\n",dAP[i][j]);
                                                                       printf("dAP=%f\n",dBP[i][j]);
                                                                       printf("dAP=%f\n",dCP[i][j]);
                                                                       getch();
                                                                   }
     
     
                                                             else  {
                                                                       printf("r=%f, x=%f, y=%f, dAP=%f, dBP=%f, dCP=%f FAILURE\n",r,x,y,dAP[i][j],dBP[i][j],dCP[i][j]);
                                                                   }
                                                 }
     
                               }
            }
     
    }


    Si par exemple je mets 100 pour les dimensions des tableaux et que je réadapte le boucles, le programme s'execute cette fois. Mais est-ce que c'est la capacité du pc qui limite les dimensions du tableau ? ou non j'ai du mal à me rendre compte.

    Merci d'avance

  12. #12
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Sinon bah tant pis je decuplerais le programme et je changerais les indices !

  13. #13
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Bonjour !

    Just pour dire que j'ai trouvé la solution ! en fait pas besoin de tableaux donc je peux mettre le pas que je veux desormais sans avoir les problèmes de dimensions !

    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
    int main (void)
    {
        system("title Recherche du point");
        system("MODE CON lines=55 cols=120");
        float pas=0.1; 
        printf("Veuillez entrer le pas :");
        scanf("%f",&pas);
        int max_i=(273/pas+1);
        int max_j=(60/pas+1);
        int i=1,j=0,k=0;
        float x,y,r;
        float dAP, dBP, dCP;
        float precision=0.00001;
        FILE *f=("resultat.txt","w");
     
        for (i=1;i<max_i;i++)
            {
                           for (j=0;j<max_j;j++)
                               {
                                             x=i*pas*cos(60);
                                             r=x/cos(j*pas);
                                             y=r*sin(j*pas);
     
                                             dAP=sqrt(x*x+y*y);
                                             dBP=sqrt((x-273)*(x-273)+y*y);
                                             dCP=sqrt((x-136,5)*(x-136,5)+(y-273*sin(60))*(y-273*sin(60)));
     
                                             for (k=1;k<=237;k++)
                                                 {
                                                                if (     ( ((k-precision)<=dAP)&&( (k+precision)>=dAP) ) 
                                                                       &&( ((k-precision)<=dBP)&&( (k+precision)>=dBP) ) 
                                                                       &&( ((k-precision)<=dCP)&&( (k+precision)>=dCP) )     )
     
                                                                   {
                                                                       printf("dAP=%f\n",dAP);
                                                                       printf("dAP=%f\n",dBP);
                                                                       printf("dAP=%f\n",dCP);
                                                                       fprintf(f,"r=%f, x=%f, y=%f, dAP=%f, dBP=%f, dCP=%f FAILURE\n",r,x,y,dAP,dBP,dCP);
                                                                       getch();
                                                                   }
     
     
                                                             else  {
                                                                       printf("r=%f, x=%f, y=%f, dAP=%f, dBP=%f, dCP=%f FAILURE\n",r,x,y,dAP,dBP,dCP);
                                                                   }
                                                 }
     
                               }
            }
     
    }
    J'ai fais des tests pour voir le nombre de tests moyens éffectés par seconde : environ 80000.
    A cette allure pour un pas de 0.01 il me faut 27300*6000*273/8000 secondes soit environs 6 jours et 12h dans le pire des cas :S !

    Merci pour votre aide ! @+

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

Discussions similaires

  1. Paquetage bien compilé mais non executé.
    Par Flodelarab dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/12/2008, 20h23
  2. Réponses: 8
    Dernier message: 24/08/2007, 11h18
  3. dll qui compile mais qui bloque en appel
    Par darkman10 dans le forum Windows
    Réponses: 7
    Dernier message: 09/05/2006, 15h02
  4. Réponses: 4
    Dernier message: 08/01/2006, 18h26
  5. Réponses: 2
    Dernier message: 23/09/2003, 14h32

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