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 :

Bug dans programme de génération de nombre premier sous Windows


Sujet :

C

  1. #1
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut Bug dans programme de génération de nombre premier sous Windows
    Mon programme compilé sous Dev C++ fonctionne jusqu'à 40, à 41, un message apparait comme quoi "Nbpremier.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru."

    Voici le programme :

    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
    #include <stdio.h>
    #include <math.h>
    #include <conio.h>
     
    int main()
    {
    int GrandeBoucle; /* Nombre étudié*/
    int IndiceNombrePremier; /* Indice du nombre premier */
    int IndiceDernierNbPremierTrouve; /* Indice du dernier nombre premier trouvé */
    int NOMBREMAX; /* Nombre étudié */
    int TABLEAU[IndiceNombrePremier]; /* Liste des J-1 nombres premiers */
    double NbEuclide; /* Nombre du crible d'Euclide */
     
    printf(" ******************************************************************************\n");
    printf(" *                                                                            *\n");
    printf(" *      PROGRAMME DE DETERMINATION DE TOUS LES NOMBRES PREMIERS DE 2 A N      *\n");
    printf(" *                                                                            *\n");
    printf(" ******************************************************************************\n");
     
     
    printf("\n\n\n\n\nEntrez une valeur N positive et superieure a 5 : ");
    scanf("%d",&NOMBREMAX);
    TABLEAU[0]=2;
    TABLEAU[1]=3;
     
    printf("\n\nListe des nombres premiers jusqu'a %d : %4d%4d",NOMBREMAX,TABLEAU[0],TABLEAU[1]);
    IndiceDernierNbPremierTrouve=1;
     
    for (GrandeBoucle=5;GrandeBoucle<=NOMBREMAX;GrandeBoucle+=2)
        {
        NbEuclide=floor(sqrt(GrandeBoucle));
        IndiceNombrePremier=0;
        while(GrandeBoucle%TABLEAU[IndiceNombrePremier]!=0 && TABLEAU[IndiceNombrePremier]<=NbEuclide)
                 {
                 IndiceNombrePremier++;
                 if (TABLEAU[IndiceNombrePremier]>NbEuclide)
                    {
                    IndiceDernierNbPremierTrouve=IndiceDernierNbPremierTrouve+1;
                    TABLEAU[IndiceDernierNbPremierTrouve]=GrandeBoucle;
                    printf("%4d",TABLEAU[IndiceDernierNbPremierTrouve]);
                    }
                 }
        }
    getch();
    return 0;
    }

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int IndiceNombrePremier; /* Indice du nombre premier */
    int IndiceDernierNbPremierTrouve; /* Indice du dernier nombre premier trouvé */
    int NOMBREMAX; /* Nombre étudié */
    int TABLEAU[IndiceNombrePremier]; /* Liste des J-1 nombres premiers */
    Problème majeur: Tu tentes de créer un VLA avec un nombre non-initialisé...
    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.

  3. #3
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut
    Merci pour ta réponse mais je débute en programmation.

    Qu'est ce qu'un Pb de VLA et quelles sont mes variables non initialisées.

    Je te répète que le programme fonctionne jusqu'à 40 sans message d'erreur et qu'à partir de 41, le message apparait

  4. #4
    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
    1. Sois poli et ne parle pas sans savoir. Dès qu'il y a une variable non-initalisée, alors ça ne "fonctionne" pas: Ça tombe en marche...
    2. VLA = Variable-Length Array: Un tableau sur la pile, dont la longueur est passée dans une variable. Ça nécessite un compilateur compatible C99, ce qui n'est pas un problème en soi quand on lui passe une valeur non-initialisée.
      • Ta variable locale TABLEAU est un VLA
    3. Non-initialisé: Ta variable IndiceNombrePremier n'est jamais à gauche d'un = avant son utilisation. Elle peut contenir absolument n'importe quoi, et tu l'utilises immédiatement pour ton VLA nommé TABLEAU --> BUG.

    De plus, utiliser des majuscules pour autre chose que des macros et des constantes est une mauvaise pratique.
    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.

  5. #5
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut
    Merci, ça fonctionne quand on donne une taille précise au tableau

    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 <stdio.h>
    #include <math.h>
    #include <conio.h>
     
    int main()
    {
    int GrandeBoucle; /* Nombre étudié*/
    int IndiceNombrePremier; /* Indice du nombre premier */
    int IndiceDernierNbPremierTrouve; /* Indice du dernier nombre premier trouvé */
    int NOMBREMAX; /* Nombre étudié */
    int TABLEAU[100000]; [/B]/* Liste des J-1 nombres premiers */
    double NbEuclide; /* Nombre du crible d'Euclide */
     
    printf(" ******************************************************************************\n");
    printf(" *                                                                            *\n");
    printf(" *      PROGRAMME DE DETERMINATION DE TOUS LES NOMBRES PREMIERS DE 2 A N      *\n");
    printf(" *                                                                            *\n");
    printf(" ******************************************************************************\n");
     
     
    printf("\n\n\n\n\nEntrez une valeur N positive et superieure a 5 : ");
    scanf("%d",&NOMBREMAX);
    TABLEAU[0]=2;
    TABLEAU[1]=3;
     
    printf("\n\nListe des nombres premiers jusqu'a %d : %10d%10d",NOMBREMAX,TABLEAU[0],TABLEAU[1]);
    IndiceDernierNbPremierTrouve=1;
     
    for (GrandeBoucle=5;GrandeBoucle<=NOMBREMAX;GrandeBoucle+=2)
        {
        NbEuclide=floor(sqrt(GrandeBoucle));
        IndiceNombrePremier=0;
        while(GrandeBoucle%TABLEAU[IndiceNombrePremier]!=0 && TABLEAU[IndiceNombrePremier]<=NbEuclide)
                 {
                 IndiceNombrePremier++;
                 if (TABLEAU[IndiceNombrePremier]>NbEuclide)
                    {
                    IndiceDernierNbPremierTrouve=IndiceDernierNbPremierTrouve+1;
                    TABLEAU[IndiceDernierNbPremierTrouve]=GrandeBoucle;
                    printf("%9d",TABLEAU[IndiceDernierNbPremierTrouve]);
                    }
                 }
        }
    getch();
    return 0;
    }

  6. #6
    Membre régulier Avatar de zozoman
    Homme Profil pro
    Futur ex-prof
    Inscrit en
    Décembre 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Allier (Auvergne)

    Informations professionnelles :
    Activité : Futur ex-prof
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 119
    Points : 72
    Points
    72
    Par défaut ça y est, ça marche
    Il me manquait une boucle.

    Peut on encore accélérer le programme et peut on augmenter la taille du tableau, j'ai trouvé des sites sans le programme ou la liste va au delà de plusieurs milliards ?

    Merci à toi

    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 <stdio.h>
    #include <math.h>
    #include <conio.h>
     
    int main()
    {
        int nombre_etudie; /* Nombre étudié*/
        int i; // Indice du nombre premier utilise
        int j; /* Indice du dernier nombre premier trouvé */
        int valeur_entree; // Valeur entrée
        int liste[200000]; /* Liste des J-1 nombres premiers */
        double NbEuclide; /* Nombre du crible d'Euclide */
     
        printf(" ******************************************************************************\n");
        printf(" *                                                                            *\n");
        printf(" *      PROGRAMME DE DETERMINATION DE TOUS LES NOMBRES PREMIERS DE 2 A N      *\n");
        printf(" *                                                                            *\n");
        printf(" ******************************************************************************\n");
     
     
        printf("\n\n\n\n\nEntrez une valeur N positive et superieure a 5 : ");
        scanf("%d",&valeur_entree);
        liste[0]=2;
        liste[1]=3;
     
        printf("\n\nListe des nombres premiers jusqu'a %d :\n %d\t%d\t",valeur_entree,liste[0],liste[1]);
        j=1;
     
        for (nombre_etudie=5;nombre_etudie<=valeur_entree;nombre_etudie+=2)
            {
                NbEuclide=floor(sqrt(nombre_etudie));
                i=0;
                while(nombre_etudie%liste[i]!=0 && liste[i]<=NbEuclide)
                 {
                    i++;
                    if (liste[i]>NbEuclide)
                        {
                            j=j+1;
                            liste[j]=nombre_etudie;
                            printf("%d\t",liste[j]);
                        }
                 }
            }
        getch();
        printf("\n\n");
        return 0;
    }

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

Discussions similaires

  1. Génération de fichiers stub sous Windows
    Par eddieange dans le forum NetBeans
    Réponses: 4
    Dernier message: 27/01/2010, 10h55
  2. Réponses: 2
    Dernier message: 20/02/2008, 23h44
  3. Programmation de jeux 2D en C sous Windows
    Par fred61 dans le forum Windows
    Réponses: 1
    Dernier message: 06/04/2007, 11h15
  4. Réponses: 9
    Dernier message: 23/11/2006, 21h52
  5. bug dans programme d'extraction de données d'une page web
    Par youpimevla dans le forum Web & réseau
    Réponses: 11
    Dernier message: 31/08/2006, 11h02

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