Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon programme bug, pas d'erreur

    17 janvier 2017 à 22:11:54

    Bonjour à tous,


    J'essaie de réaliser un programme, qui bug malheureusement.  Le programme s'arrête au bout de quelques secondes, puis j'ai droit au message suivant : " a problem cause the program to stop working correctly. Window will close the program and notify you if a solution is available"

    Souci : aucun message d'erreur. J'ai demandé à une connaissance ingénieur en informatique de m'aider, il n'a pas pu m'aider. Par contre il m'a conseillé de m'y mettre au PHP, comme quoi j'aurai plus de problèmes de définitions des variables.

    Pour info je simule un jeu de carte ou je compte les cartes. L'objectif final est d'obtenir Une EV ( expected value, espérance de gain) pour ma stratégie. Avez vous une idée pour que je puisse réussir à faire marcher mon programme ? Peut être changer d'IDE ?  ( J'utilise code blocs). Changer de langage de programmation ? Mon ami m'a parlé de la problématique 32/64 bits...?

    Merci d'avance, je suis désespéré.

    Le code ! :

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    #define NCARTESABOT 416
    #define PEN 359
    #define FALSE 0
    #define TRUE 1
    
    
    
    /* Globals */
    double u[97],c,cd,cm;
    int i97,j97;
    int test = FALSE;
    
    /*
       This is the initialization routine for the random number generator.
       NOTE: The seed variables can have values between:    0 <= IJ <= 31328
                                                            0 <= KL <= 30081
       The random number sequences created by these two seeds are of sufficient
       length to complete an entire calculation with. For example, if sveral
       different groups are working on different parts of the same calculation,
       each group could be assigned its own IJ seed. This would leave each group
       with 30000 choices for the second seed. That is to say, this random
       number generator can create 900 million different subsequences -- with
       each subsequence having a length of approximately 10^30.
    */
    void RandomInitialise(int ij,int kl)
    {
       double s,t;
       int ii,i,j,k,l,jj,m;
    
       /*
          Handle the seed range errors
             First random number seed must be between 0 and 31328
             Second seed must have a value between 0 and 30081
       */
       if (ij < 0 || ij > 31328 || kl < 0 || kl > 30081) {
    		ij = 1802;
    		kl = 9373;
       }
    
       i = (ij / 177) % 177 + 2;
       j = (ij % 177)       + 2;
       k = (kl / 169) % 178 + 1;
       l = (kl % 169);
    
       for (ii=0; ii<97; ii++) {
          s = 0.0;
          t = 0.5;
          for (jj=0; jj<24; jj++) {
             m = (((i * j) % 179) * k) % 179;
             i = j;
             j = k;
             k = m;
             l = (53 * l + 1) % 169;
             if (((l * m % 64)) >= 32)
                s += t;
             t *= 0.5;
          }
          u[ii] = s;
       }
    
       c    = 362436.0 / 16777216.0;
       cd   = 7654321.0 / 16777216.0;
       cm   = 16777213.0 / 16777216.0;
       i97  = 97;
       j97  = 33;
       test = TRUE;
    }
    
    /*
       This is the random number generator proposed by George Marsaglia in
       Florida State University Report: FSU-SCRI-87-50
    */
    double RandomUniform(void)
    {
       double uni;
    
       /* Make sure the initialisation routine has been called */
       if (!test)
       	RandomInitialise(1802,9373);
    
       uni = u[i97-1] - u[j97-1];
       if (uni <= 0.0)
          uni++;
       u[i97-1] = uni;
       i97--;
       if (i97 == 0)
          i97 = 97;
       j97--;
       if (j97 == 0)
          j97 = 97;
       c -= cd;
       if (c < 0.0)
          c += cm;
       uni -= c;
       if (uni < 0.0)
          uni++;
    
       return(uni);
    }
    
    /*
      ALGORITHM 712, COLLECTED ALGORITHMS FROM ACM.
      THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
      VOL. 18, NO. 4, DECEMBER, 1992, PP. 434-435.
      The function returns a normally distributed pseudo-random number
      with a given mean and standard devaiation.  Calls are made to a
      function subprogram which must return independent random
      numbers uniform in the interval (0,1).
      The algorithm uses the ratio of uniforms method of A.J. Kinderman
      and J.F. Monahan augmented with quadratic bounding curves.
    */
    double RandomGaussian(double mean,double stddev)
    {
       double  q,u,v,x,y;
    
    	/*
    		Generate P = (u,v) uniform in rect. enclosing acceptance region
          Make sure that any random numbers <= 0 are rejected, since
          gaussian() requires uniforms > 0, but RandomUniform() delivers >= 0.
    	*/
       do {
          u = RandomUniform();
          v = RandomUniform();
       	if (u <= 0.0 || v <= 0.0) {
           	u = 1.0;
           	v = 1.0;
       	}
          v = 1.7156 * (v - 0.5);
    
          /*  Evaluate the quadratic form */
          x = u - 0.449871;
       	y = fabs(v) + 0.386595;
          q = x * x + y * (0.19600 * y - 0.25472 * x);
    
          /* Accept P if inside inner ellipse */
          if (q < 0.27597)
    			break;
    
          /*  Reject P if outside outer ellipse, or outside acceptance region */
        } while ((q > 0.27846) || (v * v > -4.0 * log(u) * u * u));
    
        /*  Return ratio of P's coordinates as the normal deviate */
        return (mean + stddev * v / u);
    }
    
    /*
       Return random integer within a range, lower -> upper INCLUSIVE
    */
    int RandomInt(int lower,int upper)
    {
       return((int)(RandomUniform() * (upper - lower + 1)) + lower);
    }
    
    /*
       Return random float within a range, lower -> upper
    */
    double RandomDouble(double lower,double upper)
    {
       return((upper - lower) * RandomUniform() + lower);
    }
    
    //FIN CODE GNR, DEBUT BACCARAT
    
    
    int valeur(int nombre)
    {
        if ((nombre%13<=9)&&(nombre%13>=1))
        {
            return nombre%13;
        }
    
        return 0;
    
    }
    
    int modulo10(int a,int b)
    {
        if (a+b<10)
        {
            return a+b;
        }
        else if (a+b<20)
        {
            return a+b-10;
        }
        else
        {
            return a+b-20;
        }
    }
    int retourResultat(int banque,int joueur)
    {
        if (valeur(banque)==valeur(joueur))
        {
            return valeur(banque);
        }
        else if (valeur(banque)<valeur(joueur))
        {
            return 10;
        }
        else
        {
            return 11;
        }
    }
    
    
    
    int tag6(int a)
    {
    
    if ((a>=1)&&(a<=5))
    {
    return 0;
    }
    else if(a==6)
    {
    return -6;
    }
    else if(a==7)
    {
    return 0;
    }
    else if((a==0)||(a==8)||(a==9))
    {
    return 1;
    }
    
    }
    
    
    
    int tag7(int a)
    {
    if ((a>=1)&&(a<=6))
    {
    return 0;
    }
    else if(a==7)
    {
    return -6;
    }
    else if((a==0)||(a==8)||(a==9))
    {
    return 1;
    }
    
    }
    
    int tag8(int a)
    {
    
    if ((a>=1)&&(a<=3))
    {
    return 1;
    }
    else if ((a>=4)&&(a<=7))
    {
    return 0;
    }
    else if(a==8)
    {
    return -7;
    }
    else if(a==9)
    {
    return 0;
    }
    else if(a==0)
    {
    return 1;
    }
    }
    
    
    int tag9(int a)
    {
    if ((a>=1)&&(a<=3))
    {
    return 1;
    }
    else if ((a>=4)&&(a<=8))
    {
    return 0;
    }
    else if(a==9)
    {
    return -7;
    }
    else if(a==0)
    {
    return 1;
    }
    }
    
    
    int test8(int a)
    {
    if (a==8)
    {
    return -1;
    }
    else
    {
    return 0;
    }
    }
    
    int main()
    {
    
    
        int i,j,k,l,m,n,a,compteur,inter,memoire=0,elu=0;
        int Sabot[NCARTESABOT+1];
        int valeurSabot[NCARTESABOT+1];
        int tab[NCARTESABOT+1];
        int mainBanque=0,mainJoueur=0,pc=1,nRound=0;
        int resultat[60001];
        int aide=0;
        int nbanque=0,njoueur=0,ntie=0,ntie7=0,ntie6=0,ntie8=0,ntie9=0,ntie0=0,ntie1=0,ntie2=0,ntie3=0,ntie4=0,ntie5=0,n3g8=0;
        double sommebanque=0;
        double sommeround=0;
        double sommejoueur=0,sommetie=0,sommetie6=0,sommetie7=0,sommetie8=0,sommetie9=0,sommetie0=0,sommetie1=0,sommetie2=0,sommetie3=0,sommetie4=0,sommetie5=0,somme3g8=0;
        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev3g8180=0;
        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=150,cqv=180,huit=8;
    
    
    int nSabot=0;
    
    
    double rc6=0,rc7=0,rc8=0,rc9=0,tc6=0,tc7=0,tc8=0,tc9=0,tc3g8=0,rc3g8=32;
    double ncartesrestantes=416,cq2=52,decksrestants=0;
    int drapeau6=0,drapeau7=0,drapeau8=0,drapeau9=0,drapeau3g8=0;
    int ndrapeau6=0,ndrapeau7=0,ndrapeau8=0,ndrapeau9=0;
    double sommedrapeau6=0,sommedrapeau7=0,sommedrapeau8=0,sommedrapeau9=0,sommedrapeau3g8=0;
    double tabdrapeau6[60001],tabdrapeau7[60001],tabdrapeau8[60001],tabdrapeau9[60001],tabdrapeau3g8[60001],resultat3g8[60001];
    
    int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommescore3g8=0;
    
    double ev6magu=0,ev7magu=0,ev8magu=0,ev9magu=0,evmagu=0;
    double frequence6=0,frequence7=0,frequence8=0,frequence9=0,frequence3g8=0;
    
    
    
    
        for(i=1;i<=60000;i++)
       {
          resultat[i]=-1;
       }
    
    
    for (k=1;k<=1;k++)
    {
    
      /*  if (k%100==0)
        {
            printf("k=%d\n\n",k);
        }
    */
        nbanque=0;
        nRound=0;
        ntie=0;
        njoueur=0;
        ntie0=0;
        ntie1=0;
        ntie2=0;
        ntie3=0;
        ntie4=0;
        ntie5=0;
        ntie6=0;
        ntie7=0;
        ntie8=0;
        ntie9=0;
    
        n3g8=0;
    
    
    for(j=1;nRound<20000;j++)
    {
      pc=1;
      ncartesrestantes=416;
      rc6=0;
      rc7=0;
      rc8=0;
      rc9=0;
    
    for(i=1;i<=NCARTESABOT;i++)
       {
            tab[i]=1;
       }
    
    
        for(a=NCARTESABOT;a>=1;a--)
        {
    
    
            compteur=0;
         elu=RandomInt(1,a);
        for(i=1;(compteur!=elu);i++)
       {
           if (tab[i]==1)
           {
               compteur++;
               inter=i;
           }
       }
    
        Sabot[NCARTESABOT+1-a]=inter;
      //  printf("%d\n%d\n%d\n",NCARTESABOT,inter,i);
        tab[inter]=0;
                }
    
    
    for(i=1;i<=NCARTESABOT;i++)
       {
          valeurSabot[i]=valeur(Sabot[i]);
         //   printf("%d\t%d\n",valeurSabot[i],i);
       }
    
    
         //  printf("\n\n\n\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\n\n\n");
    
    
    
    
    
    while(pc<=PEN)
    {
    
    printf("PC=%d\n\n",pc);
    
        memoire=pc;
        mainBanque=modulo10(valeur(valeurSabot[pc]),valeur(valeurSabot[pc+2]));
        mainJoueur=modulo10(valeur(valeurSabot[pc+1]),valeur(valeurSabot[pc+3]));
      //  printf("%d\t%d\t%d\t%d\t%d\t%d\nMainJoueur=%d\tMainBanque=%d\t\n\n\n",valeurSabot[memoire+1],valeurSabot[memoire+3],valeurSabot[memoire],valeurSabot[memoire+2],valeurSabot[memoire+4],valeurSabot[memoire+5],mainJoueur,mainBanque);  //A SUPPRIMER
    
        if ((mainBanque==8)||(mainBanque==9)||(mainJoueur==8)||(mainJoueur==9)||((mainJoueur>=6)&&(mainBanque>=6)))
            {
                pc=pc+4;
            }
        else if((mainJoueur>=6)&&(mainBanque<=5))
        {
            mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+4]));
            pc=pc+5;
        }
    
        else
        {
             mainJoueur=modulo10(mainJoueur,valeur(valeurSabot[pc+4]));
            aide=valeurSabot[pc+4];
    
            	if ((mainBanque==3)&&(valeur(valeurSabot[pc+4])==8))     //3G8 PARTIE
    		 {
    			n3g8++;
    			resultat3g8[nRound+1]=1;
    		  }
    		else
    		{
    		resultat3g8[nRound+1]=0;
    		}
    
            if (mainBanque<=2)
            {
                mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                pc=pc+6;
            }
            else if((mainBanque==3)&&((valeurSabot[pc+4])!=8))
            {
                mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                pc=pc+6;
            }
            else if((mainBanque==4)&&(aide>=2)&&(aide<=7))
            {
                mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                pc=pc+6;
            }
    
            else if((mainBanque==5)&&(aide>=4)&&(aide<=7))
            {
                mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                pc=pc+6;
            }
    
            else if((mainBanque==6)&&(aide>=6)&&(aide<=7))
            {
                mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                pc=pc+6;
            }
            else{
                    pc=pc+5;
                  //  printf("5emecarte=%d\tMainJoueur=%d\n",valeur(valeurSabot[memoire+4]),mainJoueur);
                }
    
        }
    nRound++;
    resultat[nRound]=retourResultat(mainBanque,mainJoueur);
    //printf("%d\t%d\t%d\t%d\t%d\t%d\nMainJoueur=%d\tMainBanque=%d\tResultat=%d\npc=%d\n\n",valeurSabot[memoire+1],valeurSabot[memoire+3],valeurSabot[memoire],valeurSabot[memoire+2],valeurSabot[memoire+4],valeurSabot[memoire+5],mainJoueur,mainBanque,resultat[nRound],pc);  //A SUPPRIMER
    
    
    for(m=memoire;m<pc;m++)
    {
    //printf("\n\nrc6=%f\nTAG6:%d\nrc6=%f\n\n",rc6,tag6(valeurSabot[m]),rc6+tag6(valeurSabot[m]));
     rc6=rc6+tag6(valeurSabot[m]);
     rc7=rc7+tag7(valeurSabot[m]);
     rc8=rc8+tag8(valeurSabot[m]);
     rc9=rc9+tag9(valeurSabot[m]);
    // rc3g8=rc3g8+test8(valeurSabot[m]);
    
    
    printf("%d\t",valeurSabot[m]);
    }
    
    
    ncartesrestantes=ncartesrestantes-(pc-memoire);
    
    
    
    
    
    tc6=rc6*cq2/ncartesrestantes;
    tc7=rc7*cq2/ncartesrestantes;
    tc8=rc8*cq2/ncartesrestantes;
    tc9=rc9*cq2/ncartesrestantes;
    //tc3g8=rc3g8*cq2/ncartesrestantes;
    
    drapeau6=(tc6>=8);
    drapeau7=(tc7>=4);
    drapeau8=(tc8>=7);
    drapeau9=(tc9>=7);
    //drapeau3g8=(tc3g8>=5);
    
     printf("\n\nnRound=%d\n\nRC6:%f\tRC7:%f\tRC8:%f\tRC9:%f\t\n\n",nRound,rc6,rc7,rc8,rc9);
     printf("NCRestantes:%f\tTC6:%f\tTC7:%f\tTC8:%f\tTC9:%f\t\n\n",ncartesrestantes,tc6,tc7,tc8,tc9);
     printf("Drapeau6=%d\tDrapeau7=%d\tDrapeau8=%d\tDrapeau9=%d\t",drapeau6,drapeau7,drapeau8,drapeau9);
    
    
    tabdrapeau6[nRound]=(tc6>=8);
    tabdrapeau7[nRound]=(tc7>=4);
    tabdrapeau8[nRound]=(tc8>=7);
    tabdrapeau9[nRound]=(tc9>=7);
    //tabdrapeau3g8[nRound]=(tc3g8>=5);
    
    
    
    
    }   //FIN BOUCLE WHILE
    
    nSabot++;
    printf("\n\n\n\n*************\nFINSABOT\nFINSABOT\nFINSABOT\tSabotsJouees=%d\nFINSABOT\n*************\n**********\n\n\n\n",nSabot);
    
    
    }   //FIN BOUCLE J
    for(i=1;i<=nRound;i++)
       {
          if (resultat[i]==11)
          {
              nbanque++;
          }
          else if (resultat[i]==10)
          {
              njoueur++;
          }
          else
          {
              ntie++;
              if (resultat[i]==7)
              {
                  ntie7++;
              }
              else if (resultat[i]==6)
              {
                  ntie6++;
              }
              else if (resultat[i]==8)
              {
                  ntie8++;
              }
              else if (resultat[i]==9)
              {
                  ntie9++;
              }
              else if (resultat[i]==0)
              {
                  ntie0++;
              }
              else if (resultat[i]==1)
              {
                  ntie1++;
              }
              else if (resultat[i]==2)
              {
                  ntie2++;
              }
              else if (resultat[i]==3)
              {
                  ntie3++;
              }
              else if (resultat[i]==4)
              {
                  ntie4++;
              }
              else if (resultat[i]==5)
              {
                  ntie5++;
              }
          }
       }
    
          somme3g8=somme3g8+n3g8;
    
       sommebanque=sommebanque+nbanque;
       sommeround=sommeround+nRound;
       sommejoueur=sommejoueur+njoueur;
       sommetie=sommetie+ntie;
    
       sommetie7=sommetie7+ntie7;
        sommetie8=sommetie8+ntie8;
        sommetie9=sommetie9+ntie9;
         sommetie6=sommetie6+ntie6;
          sommetie0=sommetie0+ntie0;
        sommetie1=sommetie1+ntie1;
        sommetie2=sommetie2+ntie2;
         sommetie3=sommetie3+ntie3;
        sommetie4=sommetie4+ntie4;
        sommetie5=sommetie5+ntie5;
    
    
    //printf("Score6:%f\tScore7:%f\tScore8:%f\tScore9:%f\t\n\n",score6,score7,score8,score9);
    
    
    for (m=2;m<=nRound;m++)
    {
    
    //printf("66666666\n\nm=%d\n\n",m);
     if (tabdrapeau6[m-1])
    {
    sommedrapeau6++;
    if (resultat[m]==6)
    {
    score6+=45;
    }
    else
    {
    score6--;
    }
    }
    }
    
    
    for (m=2;m<=nRound;m++)
    {
    //printf("77777777777\n\nm=%d\n\n",m);
    
     if (tabdrapeau7[m-1])
    {
    sommedrapeau7++;
    if (resultat[m]==7)
    
    {
    score7=score7+45;
    }
    else
    {
    score7=score7-1;
    }
    }
    }
    
    
    for (m=2;m<=nRound;m++)
    {
    //printf("88888888\n\nm=%d\n\n",m);
    
     if (tabdrapeau8[m-1])
    {
        sommedrapeau8++;
    if (resultat[m]==8)
    {
    
    score8=score8+80;
    }
    else
    {
    score8=score8-1;
    }
    }
    }
    
    
    
    for (m=2;m<=nRound;m++)
    {
     //   printf("999999999999\n\nm=%d\n\n",m);
    
     if (tabdrapeau9[m-1])
    {
    sommedrapeau9++;
    
    
    if (resultat[m]==9)
    {
    
    score9=score9+80;
    
    }
    else
    {
    score9=score9-1;
    }
    }
    }
    
    
    /*
    for (m=2;m<=nRound;m++)
    {
     if (tabdrapeau3g8[m-1])
    {
    sommedrapeau3g8++;
    if (resultat3g8[m]==1)
    {
    score3g8=score3g8+200;
    }
    else
    {
    score3g8=score3g8-1;
    }
    }
    }
    
    */
    
    
    
    
    
    }  //FIN BOUCLE K
    /*
    ev7=(sommetie7*quarantecinq-(sommeround-sommetie7))/sommeround*100;
    ev6=(sommetie6*quarantecinq-(sommeround-sommetie6))/sommeround*100;
    ev8=(sommetie8*quatrevingt-(sommeround-sommetie8))/sommeround*100;
    ev9=(sommetie9*quatrevingt-(sommeround-sommetie9))/sommeround*100;
    
    ev0=(sommetie0*cc-(sommeround-sommetie0))/sommeround*100;
    ev1=(sommetie1*dcq-(sommeround-sommetie1))/sommeround*100;
    ev2=(sommetie2*dcvc-(sommeround-sommetie2))/sommeround*100;
    ev3=(sommetie3*deuxcent-(sommeround-sommetie3))/sommeround*100;
    ev4=(sommetie4*centvingt-(sommeround-sommetie4))/sommeround*100;
    ev5=(sommetie5*centdix-(sommeround-sommetie5))/sommeround*100;
    
    evbanque=(sommebanque*utile-sommejoueur)/sommeround*100;
    evjoueur=(sommejoueur-sommebanque)/sommeround*100;
    evtie=(sommetie*8-(sommeround-sommetie))/sommeround*100;
    
    
    ev3g8200=(somme3g8*deuxcent-(sommeround-somme3g8))/sommeround*100;
    ev3g8180=(somme3g8*cqv-(sommeround-somme3g8))/sommeround*100;
    
    
           //UTILE =0.95
    
    printf("DEBUT SIMS ENLEVEMENT DE LA CARTE : %d\n\n",l);
    printf("Sommeround=%f\tSommeBanque=%f\tSommeJoueur=%f\tSommeTie=%f\n\nEvBanque=%f\tEvJoueur=%f\tEvtie=%f\n\n",sommeround,sommebanque,sommejoueur,sommetie,evbanque,evjoueur,evtie);
    printf("Sommetie6=%f\tSommetie7=%f\tSommetie8=%f\tSommetie9=%f\n\n",sommetie6,sommetie7,sommetie,sommetie9);
    printf("Sommetie0=%f\tSommetie1=%f\tSommetie2=%f\tSommetie3=%f\tSommetie4=%f\tSommetie5=%f\n\nSomme3g8=%f\n\n",sommetie0,sommetie1,sommetie2,sommetie3,sommetie4,sommetie5,somme3g8);
    
    
    
    printf("EV0=%f\tEV1=%f\tEV2=%f\tEV3=%f\tEV4=%f\tEV5=%f\t\n",ev0,ev1,ev2,ev3,ev4,ev5);
    printf("EV6=%f\tEV7=%f\tEV8=%f\tEV9=%f\t\n\n",ev6,ev7,ev8,ev9);
    
    printf("Ev3g8200=%f\nEv3g8180=%f\n\n",ev3g8200,ev3g8180);
    printf("CHANGEMENTCHANGEMENTCHANGEMENT\nCHANGEMENTCHANGEMENTCHANGEMENT\nCHANGEMENTCHANGEMENTCHANGEMENT\nCHANGEMENTCHANGEMENTCHANGEMENT\n\n\n");
    
         somme3g8=0;
    
       sommebanque=0;
       sommeround=0;
       sommejoueur=0;
       sommetie=0;
    
       sommetie7=0;
        sommetie8=0;
        sommetie9=0;
         sommetie6=0;
          sommetie0=0;
        sommetie1=0;
        sommetie2=0;
         sommetie3=0;
        sommetie4=0;
        sommetie5=0;
    */
    
    sommeround=nRound;
    
    ev6magu=score6/sommeround;
    ev7magu=score7/sommeround;
    ev8magu=score8/sommeround;
    ev9magu=score9/sommeround;
    evmagu=score3g8/sommeround;
    
    frequence6=sommedrapeau6/sommeround;
    frequence7=sommedrapeau7/sommeround;
    frequence8=sommedrapeau8/sommeround;
    frequence9=sommedrapeau9/sommeround;
    
    
    
    
    printf("Nombre Opportunites nombre de mises ou TC est OK\nN6=%f\tN7=%f\tN8=%f\tN9=%f\tN3G8=\n\n",sommedrapeau6,sommedrapeau7,sommedrapeau8,sommedrapeau9);
    
    //printf("%f",sommedrapeau3g8);
    //LIGNE A DEBUGER 783
    printf("Nombre Opportunites frequence de mises ou TC est OK\nf6=%f\tf7=%f\tf8=%f\tf9=%f\tf3G8=%f\n\n",frequence6,frequence7,frequence8,frequence9,frequence3g8);
    
    
    printf("ev7mag=%f\n",ev7magu);
    printf("ev8mag=%f\n",ev8magu);
    printf("ev6mag=%f\n",ev6magu);
    printf("ev9mag=%f\n",ev9magu);    //EVMAGU 7 et 8 BUG !!
    
    
    
    printf("Sommedrapeau6=%f\tSommedrapeau7=%f\tSommedrapeau8=%f\tSommedrapeau9=%f\t\n\n",sommedrapeau6,sommedrapeau7,sommedrapeau8,sommedrapeau9);
    
    //printf("Score6:%f\tScore7:%f\tScore8:%f\tScore9:%f\t\n\n",score6,score7,score8,score9);
    
    
    
    
        return 0;
    
    
    }  //FIN MAIN
    
    



    -
    Edité par Roibabax 17 janvier 2017 à 22:16:06

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2017 à 23:04:17

      Bonsoir,

      - Soignez l'indentation: plus de la moitié du code est illisible!

      - En C, l'indice des tableaux a pour plage [0, TAILLE[. Les déclarer comme tableau[TAILLE+1] juste pour faire les boucles for commencer à 1 est d'une lourdeur très pénible à voir ...

      - compiler avec les options pour inclure tous les warnings, ce n'est pas le cas par defaut! Voyez la doc de votre compilateur!

      - On ne vas pas vérifier vos ~838lignes de codes! Utilisez un debogueur!

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        17 janvier 2017 à 23:10:35

        Sur GNU/Linux (32bit + 64bit), je n'ai aucun problème, cependant, avec wine, il y a une stack overflow en 32 bits.

        La raison est qu'il y a trop de récursivité/variables différentes, c'est un problème d'optimisation.

        Il y a plusieurs solutions : 

         - Optimiser le programmer et éviter les récursivitées

         - Utiliser un drapeau de compilation pour augmenter la taille de la pile :

        -Wl,--stack=268435455



        -
        Edité par TSnake41 17 janvier 2017 à 23:10:48

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2017 à 23:27:59


          breizhbugs a écrit:

          Bonsoir,

          - Soignez l'indentation: plus de la moitié du code est illisible!

          - En C, l'indice des tableaux a pour plage [0, TAILLE[. Les déclarer comme tableau[TAILLE+1] juste pour faire les boucles for commencer à 1 est d'une lourdeur très pénible à voir ...

          - compiler avec les options pour inclure tous les warnings, ce n'est pas le cas par defaut! Voyez la doc de votre compilateur!

          - On ne vas pas vérifier vos ~838lignes de codes! Utilisez un debogueur!


          Bonsoir. Pour l'indentation, je reconnais que c'est illisible. Le problème c'est que je n'ai pas programmé depuis longtemps, et il semble que l'IDE que j'utilise, par défaut ne mets pas d'indentation. Je vais regardez pour changez ça. Pour les indices et les tableaux, je comprends votre point de vue mais j'avoue que contrairement à vous je préfère ce choix.

          Je vais me renseigner pour les warnings, vous me dîtes que tous les warnings ne sont pas inclus par défaut, très intéressant.

          Pour le débogueur, j'en ai un, il ne me dit rien à part des warning non dangereux ( variables inutilisés), il ne m'affiche pas d'erreurs sur ce code ( alors que la fonction erreur du debogueur est active).

          Merci pour votre réponse, n'hésitez pas à me re répondre.

          TSnake41 a écrit:

          Sur GNU/Linux (32bit + 64bit), je n'ai aucun problème, cependant, avec wine, il y a une stack overflow en 32 bits.

          La raison est qu'il y a trop de récursivité/variables différentes, c'est un problème d'optimisation.

          Il y a plusieurs solutions : 

           - Optimiser le programmer et éviter les récursivitées

           - Utiliser un drapeau de compilation pour augmenter la taille de la pile :

          -Wl,--stack=268435455



          -
          Edité par TSnake41 il y a 17 minutes

          Bonjour snake, merci pour votre réponse. "La raison est qu'il y a trop de récursivité/variables différentes, c'est un problème d'optimisation.". Pour éviter les récursivités et variables différentes, pouvez vous me donner des pistes?

          Autre question, mais ne devrais je pas changer de language de programmation pour éviter ce problème ? Si vous pensez qu'un language m'évitera à tout jamais ce problème particulier, je suis preneur.

          "- Utiliser un drapeau de compilation pour augmenter la taille de la pile :"

          J'ai copié votre code tout en haut de mon programme, çela ne fonctionne pas. Pouvez vous m'indiquer comment l'utiliser, ou un début de piste ?


          Plus généralement, me conseillez vous de changer d'IDE, ou de language de programmation pour être tranquille ?

          Roibabax

          -
          Edité par Roibabax 17 janvier 2017 à 23:40:01

          • Partager sur Facebook
          • Partager sur Twitter
            17 janvier 2017 à 23:48:35

            Roibabax a écrit:

            Pour le débogueur, j'en ai un, il ne me dit rien à part des warning non dangereux ( variables inutilisés), il ne m'affiche pas d'erreurs sur ce code ( alors que la fonction erreur du debogueur est active).


            J'ai l'impression que vous confondez debogueur (a l'execution, surveille le déroulement de votre programme, et prends la main sur celui ci quand il plante!) et compilateur (transforme le code source en un programme executable s'il n'y a pas d'erreur. Des warnings sont souvent mauvais signes mais - par défaut- le compilateur continue quand même et produit un executable)

            Essai de toujours corrigé les warnings!

            N'utilisant pas codeblock je te redirige vers http://www.cplusplus.com/doc/tutorial/introduction/codeblocks/  pour que tu y ajoutes les options de compilation proposée pas tsnake41 (dans "other options")

            -
            Edité par breizhbugs 17 janvier 2017 à 23:50:42

            • Partager sur Facebook
            • Partager sur Twitter
            ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
              18 janvier 2017 à 0:07:59

              > Pour le débogueur, j'en ai un, il ne me dit rien à part des warning non dangereux ( variables inutilisés), il ne m'affiche pas d'erreurs sur ce code ( alors que la fonction erreur du debogueur est active).
              . 
              Il faut l'utiliser pour suivre pas à pas ce que fait le programme (quelles sont les valeurs des variables ? etc.)
              . 
              Si, comme moi, tu ne sais pas te servir d'un débogueur, il faut à tout prix commencer par détecter l'erreur : à partir de quelle ligne ça plante ? C'est quand même la base ! Si le matin, ta voiture ne démarre pas, tu ne vas pas aussitôt téléphoner au garagiste, n'est-ce pas ? Non, même quelqu'un qui n'y connaît rien commence par vérifier qu'il y a de l'essence (en regardant le voyant), que la batterie n'est pas à plat (en actionnant les essuie-glace), etc. Là c'est pareil : commence par trouver où se situe l'erreur. La corriger, ce sera l'étape n°2.
              . 
              Mettons que TSnake41 ait raison : la pile est saturée. Ça m'est arrivé à deux reprises : une fois avec de très gros tableaux (je n'étais alors pas au courant de cette histoire de limitation de pile), une autre fois avec de la récursivité (et je ne m'y attendais vraiment pas). Ce que j'ai fait, c'est que j'ai mis des printf un peu partout, affichant les valeurs des variables importantes, et je me suis aperçu que ça plantait dans la fonction récursive. Alors j'ai mis des printf dans celle-ci, affichant les valeurs de certaines variables, et je me suis aperçu que ça marchait très bien au début, puis boum ! plantage ! Ayant soupçonné un problème de dépassement de capacité de la pile, j'ai modifié le programme pour diminuer la profondeur de la récursivité et cette fois ça marchait. Moralité : j'utilise la récursivité le moins souvent possible (seulement contraint et forcé ─ de toute façon je n'aime pas trop ça), et seulement avec des variables dynamiques (on ne sait jamais).
              . 
              Bref, si tu ne sais pas te servir d'un débogueur, mets des printf partout et identifie l'endroit précis où ça plante. Ensuite seulement on pourra se demander comment corriger ça.

              -
              Edité par robun 18 janvier 2017 à 0:09:38

              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2017 à 0:17:52

                Merci pour vos réponses. Je vais essayer d'appliquer vos conseils.

                Juste, pour éviter ces problèmes de dépassement de capacité de la pile, de récursivité et autres, ne devrais je pas utiliser un autre langage ?
                Parce que là concrètement si je reste sur le C, je vois pas comment faire.

                Comment tu as fait robun pour utiliser moins de récursivité ?

                -
                Edité par Roibabax 18 janvier 2017 à 0:25:51

                • Partager sur Facebook
                • Partager sur Twitter
                  18 janvier 2017 à 0:57:46

                  Roibabax a écrit:

                  Juste, pour éviter ces problèmes de dépassement de capacité de la pile, de récursivité et autres, ne devrais je pas utiliser un autre langage ?


                  Non, c'est commun a tous les langages. https://openclassrooms.com/courses/la-recursivite-1 -> exemple en php

                  On peut dérécursivé (ca se dit?)en faisant des boucles (while / for)

                  • Partager sur Facebook
                  • Partager sur Twitter
                  ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                    18 janvier 2017 à 6:25:03

                    Bonjour,

                    Roibabax a écrit:


                    breizhbugs a écrit:

                    Bonsoir,

                    - Soignez l'indentation: plus de la moitié du code est illisible!

                    - En C, l'indice des tableaux a pour plage [0, TAILLE[. Les déclarer comme tableau[TAILLE+1] juste pour faire les boucles for commencer à 1 est d'une lourdeur très pénible à voir ...

                    - compiler avec les options pour inclure tous les warnings, ce n'est pas le cas par defaut! Voyez la doc de votre compilateur!

                    - On ne vas pas vérifier vos ~838lignes de codes! Utilisez un debogueur!


                    Bonsoir. Pour l'indentation, je reconnais que c'est illisible. Le problème c'est que je n'ai pas programmé depuis longtemps, et il semble que l'IDE que j'utilise, par défaut ne mets pas d'indentation. Je vais regardez pour changez ça. Pour les indices et les tableaux, je comprends votre point de vue mais j'avoue que contrairement à vous je préfère ce choix.

                    Hum, il y a très longtemps le seul moyen d'indenter était l'utilisation réfléchie de la barre espace et de la touche tabulation (je parle d'un temps que les moins de vingt ans …) ; cela est toujours d'actualité :) Pas besoin d'automatisme dans l'IDE (même si ça aide).

                    Roibabax a écrit:

                    Je vais me renseigner pour les warnings, vous me dîtes que tous les warnings ne sont pas inclus par défaut, très intéressant.

                    Évidemment tous les warnings ne peuvent pas être émis car il y aurait bien trop de faux positifs. Par exemple avec le code donné et un max de warnings on obtient avec clang 73 warnings :

                    hor.c:15:5: warning: no previous extern declaration for non-static variable 'test' [-Wmissing-variable-declarations]
                    int test = FALSE;
                        ^
                    hor.c:29:6: warning: no previous prototype for function 'RandomInitialise' [-Wmissing-prototypes]
                    void RandomInitialise(int ij,int kl)
                         ^
                    hor.c:77:8: warning: no previous prototype for function 'RandomUniform' [-Wmissing-prototypes]
                    double RandomUniform(void)
                           ^
                    hor.c:118:14: warning: declaration shadows a variable in the global scope [-Wshadow]
                       double  q,u,v,x,y;
                                 ^
                    hor.c:13:8: note: previous declaration is here
                    double u[97],c,cd,cm;
                           ^
                    hor.c:116:8: warning: no previous prototype for function 'RandomGaussian' [-Wmissing-prototypes]
                    double RandomGaussian(double mean,double stddev)
                           ^
                    hor.c:153:5: warning: no previous prototype for function 'RandomInt' [-Wmissing-prototypes]
                    int RandomInt(int lower,int upper)
                        ^
                    hor.c:161:8: warning: no previous prototype for function 'RandomDouble' [-Wmissing-prototypes]
                    double RandomDouble(double lower,double upper)
                           ^
                    hor.c:169:5: warning: no previous prototype for function 'valeur' [-Wmissing-prototypes]
                    int valeur(int nombre)
                        ^
                    hor.c:180:5: warning: no previous prototype for function 'modulo10' [-Wmissing-prototypes]
                    int modulo10(int a,int b)
                        ^
                    hor.c:195:5: warning: no previous prototype for function 'retourResultat' [-Wmissing-prototypes]
                    int retourResultat(int banque,int joueur)
                        ^
                    hor.c:213:5: warning: no previous prototype for function 'tag6' [-Wmissing-prototypes]
                    int tag6(int a)
                        ^
                    hor.c:233:1: warning: control may reach end of non-void function [-Wreturn-type]
                    }
                    ^
                    hor.c:237:5: warning: no previous prototype for function 'tag7' [-Wmissing-prototypes]
                    int tag7(int a)
                        ^
                    hor.c:252:1: warning: control may reach end of non-void function [-Wreturn-type]
                    }
                    ^
                    hor.c:254:5: warning: no previous prototype for function 'tag8' [-Wmissing-prototypes]
                    int tag8(int a)
                        ^
                    hor.c:277:1: warning: control may reach end of non-void function [-Wreturn-type]
                    }
                    ^
                    hor.c:280:5: warning: no previous prototype for function 'tag9' [-Wmissing-prototypes]
                    int tag9(int a)
                        ^
                    hor.c:298:1: warning: control may reach end of non-void function [-Wreturn-type]
                    }
                    ^
                    hor.c:301:5: warning: no previous prototype for function 'test8' [-Wmissing-prototypes]
                    int test8(int a)
                        ^
                    hor.c:639:6: warning: implicit conversion turns floating-point number into integer: 'double' to '_Bool'
                          [-Wfloat-conversion]
                     if (tabdrapeau6[m-1])
                     ~~  ^~~~~~~~~~~~~~~~
                    hor.c:658:6: warning: implicit conversion turns floating-point number into integer: 'double' to '_Bool'
                          [-Wfloat-conversion]
                     if (tabdrapeau7[m-1])
                     ~~  ^~~~~~~~~~~~~~~~
                    hor.c:678:6: warning: implicit conversion turns floating-point number into integer: 'double' to '_Bool'
                          [-Wfloat-conversion]
                     if (tabdrapeau8[m-1])
                     ~~  ^~~~~~~~~~~~~~~~
                    hor.c:699:6: warning: implicit conversion turns floating-point number into integer: 'double' to '_Bool'
                          [-Wfloat-conversion]
                     if (tabdrapeau9[m-1])
                     ~~  ^~~~~~~~~~~~~~~~
                    hor.c:338:5: warning: unused variable 'ndrapeau6' [-Wunused-variable]
                    int ndrapeau6=0,ndrapeau7=0,ndrapeau8=0,ndrapeau9=0;
                        ^
                    hor.c:329:93: warning: unused variable 'dcvc' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                                                                                ^
                    hor.c:337:49: warning: unused variable 'drapeau3g8' [-Wunused-variable]
                    int drapeau6=0,drapeau7=0,drapeau8=0,drapeau9=0,drapeau3g8=0;
                                                                    ^
                    hor.c:340:84: warning: unused variable 'tabdrapeau3g8' [-Wunused-variable]
                    double tabdrapeau6[60001],tabdrapeau7[60001],tabdrapeau8[60001],tabdrapeau9[60001],tabdrapeau3g8[60001],resultat3g...
                                                                                                       ^
                    hor.c:329:102: warning: unused variable 'dcq' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                                                                                         ^
                    hor.c:329:110: warning: unused variable 'cc' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                                                                                                 ^
                    hor.c:338:29: warning: unused variable 'ndrapeau8' [-Wunused-variable]
                    int ndrapeau6=0,ndrapeau7=0,ndrapeau8=0,ndrapeau9=0;
                                                ^
                    hor.c:338:17: warning: unused variable 'ndrapeau7' [-Wunused-variable]
                    int ndrapeau6=0,ndrapeau7=0,ndrapeau8=0,ndrapeau9=0;
                                    ^
                    hor.c:329:117: warning: unused variable 'cqv' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=150,cq...
                                                                                                                                        ^
                    hor.c:329:125: warning: unused variable 'huit' [-Wunused-variable]
                      ...utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=150,cqv=180,h...
                                                                                                                                          ^
                    hor.c:342:80: warning: unused variable 'sommescore8' [-Wunused-variable]
                    int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommesc...
                                                                                                   ^
                    hor.c:342:94: warning: unused variable 'sommescore9' [-Wunused-variable]
                    int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommesc...
                                                                                                                 ^
                    hor.c:342:52: warning: unused variable 'sommescore6' [-Wunused-variable]
                    int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommesc...
                                                                       ^
                    hor.c:342:66: warning: unused variable 'sommescore7' [-Wunused-variable]
                    int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommesc...
                                                                                     ^
                    hor.c:328:71: warning: unused variable 'ev4' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                                          ^
                    hor.c:328:77: warning: unused variable 'ev5' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                                                ^
                    hor.c:328:65: warning: unused variable 'ev3' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                                    ^
                    hor.c:328:83: warning: unused variable 'evjoueur' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                                                      ^
                    hor.c:335:56: warning: unused variable 'tc3g8' [-Wunused-variable]
                    double rc6=0,rc7=0,rc8=0,rc9=0,tc6=0,tc7=0,tc8=0,tc9=0,tc3g8=0,rc3g8=32;
                                                                           ^
                    hor.c:328:59: warning: unused variable 'ev2' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                              ^
                    hor.c:328:94: warning: unused variable 'evtie' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                                                                 ^
                    hor.c:342:108: warning: unused variable 'sommescore3g8' [-Wunused-variable]
                    int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommesc...
                                                                                                                               ^
                    hor.c:328:102: warning: unused variable 'ev3g8200' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                                                                         ^
                    hor.c:328:53: warning: unused variable 'ev1' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                        ^
                    hor.c:328:47: warning: unused variable 'ev0' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                                  ^
                    hor.c:328:113: warning: unused variable 'ev3g8180' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev3g81...
                                                                                                                                    ^
                    hor.c:335:64: warning: unused variable 'rc3g8' [-Wunused-variable]
                    double rc6=0,rc7=0,rc8=0,rc9=0,tc6=0,tc7=0,tc8=0,tc9=0,tc3g8=0,rc3g8=32;
                                                                                   ^
                    hor.c:328:36: warning: unused variable 'evbanque' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                       ^
                    hor.c:338:41: warning: unused variable 'ndrapeau9' [-Wunused-variable]
                    int ndrapeau6=0,ndrapeau7=0,ndrapeau8=0,ndrapeau9=0;
                                                            ^
                    hor.c:328:30: warning: unused variable 'ev9' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                                 ^
                    hor.c:336:36: warning: unused variable 'decksrestants' [-Wunused-variable]
                    double ncartesrestantes=416,cq2=52,decksrestants=0;
                                                       ^
                    hor.c:329:12: warning: unused variable 'utile' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                               ^
                    hor.c:328:24: warning: unused variable 'ev8' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                           ^
                    hor.c:317:15: warning: unused variable 'l' [-Wunused-variable]
                        int i,j,k,l,m,n,a,compteur,inter,memoire=0,elu=0;
                                  ^
                    hor.c:329:23: warning: unused variable 'quarantecinq' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                          ^
                    hor.c:329:39: warning: unused variable 'quatrevingt' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                          ^
                    hor.c:328:18: warning: unused variable 'ev7' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                                     ^
                    hor.c:317:19: warning: unused variable 'n' [-Wunused-variable]
                        int i,j,k,l,m,n,a,compteur,inter,memoire=0,elu=0;
                                      ^
                    hor.c:328:12: warning: unused variable 'ev6' [-Wunused-variable]
                        double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev...
                               ^
                    hor.c:329:54: warning: unused variable 'centdix' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                                         ^
                    hor.c:329:66: warning: unused variable 'centvingt' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                                                     ^
                    hor.c:339:72: warning: unused variable 'sommedrapeau3g8' [-Wunused-variable]
                    double sommedrapeau6=0,sommedrapeau7=0,sommedrapeau8=0,sommedrapeau9=0,sommedrapeau3g8=0;
                                                                                           ^
                    hor.c:329:80: warning: unused variable 'deuxcent' [-Wunused-variable]
                        double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=15...
                                                                                                   ^
                    hor.c:412:28: warning: variable 'inter' may be uninitialized when used here [-Wconditional-uninitialized]
                        Sabot[NCARTESABOT+1-a]=inter;
                                               ^~~~~
                    hor.c:317:37: note: initialize the variable 'inter' to silence this warning
                        int i,j,k,l,m,n,a,compteur,inter,memoire=0,elu=0;
                                                        ^
                                                         = 0
                    hor.c:13:8: warning: no previous extern declaration for non-static variable 'u' [-Wmissing-variable-declarations]
                    double u[97],c,cd,cm;
                           ^
                    hor.c:13:14: warning: no previous extern declaration for non-static variable 'c' [-Wmissing-variable-declarations]
                    double u[97],c,cd,cm;
                                 ^
                    hor.c:13:16: warning: no previous extern declaration for non-static variable 'cd' [-Wmissing-variable-declarations]
                    double u[97],c,cd,cm;
                                   ^
                    hor.c:13:19: warning: no previous extern declaration for non-static variable 'cm' [-Wmissing-variable-declarations]
                    double u[97],c,cd,cm;
                                      ^
                    hor.c:14:5: warning: no previous extern declaration for non-static variable 'i97' [-Wmissing-variable-declarations]
                    int i97,j97;
                        ^
                    hor.c:14:9: warning: no previous extern declaration for non-static variable 'j97' [-Wmissing-variable-declarations]
                    int i97,j97;
                            ^
                    73 warnings generated.


                    Sinon en essayant une exécution avec valgrind on obtient le log suivant (que j'ai volontairement tronqué aux quelques dernières lignes) :

                    ==1365== Invalid read of size 4
                    ==1365==    at 0x109AF1: main (hor.c:490)
                    ==1365==  Address 0xffed79e84 is on thread 1's stack
                    ==1365==  in frame #0, created by main (hor.c:314)
                    ==1365== 
                    ==1365== Invalid write of size 4
                    ==1365==    at 0x109B00: main (hor.c:490)
                    ==1365==  Address 0xffed79e84 is on thread 1's stack
                    ==1365==  in frame #0, created by main (hor.c:314)
                    ==1365== 
                    ==1365== Invalid read of size 4
                    ==1365==    at 0x109B06: main (hor.c:491)
                    ==1365==  Address 0xffed79e8c is on thread 1's stack
                    ==1365==  in frame #0, created by main (hor.c:314)
                    ==1365== 
                    ==1365== Invalid read of size 4
                    ==1365==    at 0x109932: main (hor.c:458)
                    ==1365==  Address 0xffed79ec8 is on thread 1's stack
                    ==1365==  in frame #0, created by main (hor.c:314)
                    ==1365== 
                    ==1365== Invalid read of size 4
                    ==1365==    at 0x109939: main (hor.c:459)
                    ==1365==  Address 0xffed79e90 is on thread 1's stack
                    ==1365==  in frame #0, created by main (hor.c:314)
                    ==1365== 
                    ==1365== Invalid write of size 8
                    ==1365==    at 0x10994C: main (hor.c:459)
                    ==1365==  Address 0xffef8bc38 is on thread 1's stack
                    ==1365==  in frame #0, created by main (hor.c:314)
                    ==1365== 
                    ==1365== 
                    ==1365== More than 10000000 total errors detected.  I'm not reporting any more.
                    ==1365== Final error counts will be inaccurate.  Go fix your program!
                    


                    Ik faut absolument apprendre à utiliser l'environnement de développement (IDE, compilateur, debuger, OS), les bases de la programmation (un bon tuto C ne ferait pas de mal, quelques notions d'algo et de sdd) avant de se lancer dans une aventure de ce genre.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    First solve the problem. Then, write the code. ~ John Johnson
                      18 janvier 2017 à 6:32:51

                      Roibabax a écrit:

                      Comment tu as fait robun pour utiliser moins de récursivité ?

                      Le programme qui m'avait posé problème était un essai de construction de courbes fractales. Pour un segment donné, je définissais un point intermédiaire, ce qui construisait deux segments fils, chacun d'eux étant ensuite construits de même. Il y avait donc deux appels récursifs dans la fonction, ce qui donne une complexité en 2^n (et non en n, comme dans une récursivité simple du genre calcul de factorielle). La fonction se terminait quand la longueur du segment père était inférieure à une valeur limite fixée à l'avance (en pixels). Mais l'algorithme générait des segments de tailles très diverses (c'était fait pour, afin ne pas avoir de régularité), si bien que certains segments conservaient une longueur pas trop petite même lorsqu'on atteignait un niveau élevé de profondeur récursive (alors que d'autres étaient bien à presque 0). Ça arrivait lorsque la fonction coupait un segment père en deux sous-segments fils presque aussi grands que le père (ce qui arrive fréquemment quand on génère des lignes très "chaotiques"). Et puis la courbe fractale prenait de la longueur (là encore c'était fait pour), donc la condition d'arrêt n'arrivait pas très vite, et pendant ce temps la pile se remplissait...

                      Bref, j'ai modifié la valeur limite en passant de 1 pixel à plusieurs pixels et ça s'est bien passé. Mais je sais que ce n'est pas satisfaisant, et qu'en réalité le problème vient de mon algorithme trop simpliste. Comme c'était juste des essais, j'ai laissé tomber (c'était pour m'entraîner à la programmation graphique). Si vraiment il fallait refaire ça, je connais la solution : il faut utiliser des listes doublement chaînées : chaque sommet de segment sera représenté par un maillon, et comme ce sera une variable dynamique, il utilisera non pas la pile mais le tas.

                      -
                      Edité par robun 18 janvier 2017 à 6:35:34

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 janvier 2017 à 6:40:02

                        robun a écrit:

                        Roibabax a écrit:

                        Comment tu as fait robun pour utiliser moins de récursivité ?

                        ...

                        Désolé Robun de réduire ton intervention à quelques points ^^

                        Le tout n'est pas d'utiliser moins de récursivité, le tout est de l'utiliser à bon escient.

                        Une fonction récursive terminale, avec les compilateurs modernes, sera automatiquement dérécursivée. Une approche récursive sera quasi toujours gagnante avec les sff récursives (arbre, graphes, moins évident avec les listes).

                        De toute façon la pile n'est apparemment pas explosée par la récursivité mais plus par des accès hors limite à certains tableaux, pour ce que je lis du log de valgrind. En gros ce n'est apparemment pas la pile qu'on arrive pas à agrandir mais des écritures qui se font en dehors du cadre alloué. valgrind donne 347 contextes où cela arrive (en gros endroits différents).

                        • Partager sur Facebook
                        • Partager sur Twitter
                        First solve the problem. Then, write the code. ~ John Johnson
                          18 janvier 2017 à 11:38:11

                          Merci encore pour vos réponses.

                          breizhbugs a écrit:

                          Roibabax a écrit:

                          Juste, pour éviter ces problèmes de dépassement de capacité de la pile, de récursivité et autres, ne devrais je pas utiliser un autre langage ?


                          Non, c'est commun a tous les langages. https://openclassrooms.com/courses/la-recursivite-1 -> exemple en php

                          On peut dérécursivé (ca se dit?)en faisant des boucles (while / for)

                          C'est commun à tous les langages, mais est ce aussi problématique, je veux dire est ce que le problème est aussi fréquent en PHP ? Excuse moi d'insister mais mon ami ingénieur a insisté pour que j'utilise le PHP. Il est vrai que mes connaissances sont limitées, je sais juste écrire à peu près un code d'algorithme classique (déclaration des variables, utiliser les boucles, fonctions etc). J'ai lu le tutoriel du site du zéro sur le C, il faudra peut être que je me replonge dedans, mais si il y a moyen d'utiliser le PHP sans soucis...

                          Merci Robin, je dois avouer que je ne comprends pas tout à ton message, mais ça a l'air très intéressant.

                          PicoDev a écrit:

                          robun a écrit:

                          Roibabax a écrit:

                          Comment tu as fait robun pour utiliser moins de récursivité ?

                          ...

                          Désolé Robun de réduire ton intervention à quelques points ^^

                          Le tout n'est pas d'utiliser moins de récursivité, le tout est de l'utiliser à bon escient.

                          Une fonction récursive terminale, avec les compilateurs modernes, sera automatiquement dérécursivée. Une approche récursive sera quasi toujours gagnante avec les sff récursives (arbre, graphes, moins évident avec les listes).

                          De toute façon la pile n'est apparemment pas explosée par la récursivité mais plus par des accès hors limite à certains tableaux, pour ce que je lis du log de valgrind. En gros ce n'est apparemment pas la pile qu'on arrive pas à agrandir mais des écritures qui se font en dehors du cadre alloué. valgrind donne 347 contextes où cela arrive (en gros endroits différents).


                          Que veut dire à bon escient ? Tu veux dire utiliser la récursivité avec parcimonie ? Je comprends pas trop, mon programme c'est du pipi de chat à compare de certains programmes pros, la longueur est pas énorme. Comment fais un type qui veut en utiliser énormément ? Il peut plus programmer ? A moins que tu veux dire que j'utilise avec une mauvaise manière la récursivité ?

                          "Une fonction récursive terminale, avec les compilateurs modernes, sera automatiquement dérécursivée. Une approche récursive sera quasi toujours gagnante avec les sff récursives (arbre, graphes, moins évident avec les listes)."

                          Mon compilateur est un compilateur moderne ? Ca veut dire que je n'ai pas à me prendre la tête avec la récursivité c'est ça ?

                          "De toute façon la pile n'est apparemment pas explosée par la récursivité mais plus par des accès hors limite à certains tableaux, pour ce que je lis du log de valgrind. En gros ce n'est apparemment pas la pile qu'on arrive pas à agrandir mais des écritures qui se font en dehors du cadre alloué. valgrind donne 347 contextes où cela arrive (en gros endroits différents)."

                          Concrètement, que devrais je faire ? Travailler les chapitres d'allocation de la mémoire sur le site du zéro ? Je veux dire, en utilisant bien la mémoire et en travaillant "bien", il ne devrait pas y avoir de souci ? Si je relis les chapitres sur le cours sur openclassrooms, je ne devrais plus avoir aucun problèmes ?

                          J'ai lu il y a longtemps, 2 fois, le cours. A l'époque c'était pour les cours en fac de math en L1, ou pour mon fun à faire des programmes tout petits...Je devais avoir le même niveau qu'aujourd'hui, c'était suffisant pour ce que je faisais. Si je dois revoir et travailler en profondeur le cours (notamment sur l'allocation de la mémoire), je le ferai, mais je préférerais si vous me  dîtes qu'en programmant bien il n'y a aucun souci, avec le langage C :)


                          Pour l'indentation, je veux bien utiliser un tab, mais je dois le faire à chaque ligne, c'est pénible ! Si je n'avais qu'à le faire une fois au moment de la création de la boucle, ça irait...Mon ami ingénieur m'a dit qu'on pouvait trouver des sites ou on pouvait balancer son code et le texte devenait indenté, je vais voir.

                          Je me permets de reposer ma question :

                          Pour éviter ce problème d'allocation de mémoire, il n'est pas utile de changer de langage, par exemple passer au PHP ? Cet ingénieur me certifiait que si.

                          N'hésitez pas me corriger et à me "remettre en place". Par contre juste si vous pouvez me des pistes...

                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 janvier 2017 à 11:47:55

                            "Pour éviter ce problème d'allocation de mémoire, il n'est pas utile de changer de langage, par exemple passer au PHP ? Cet ingénieur me certifiait que si."

                            Non !

                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 janvier 2017 à 12:00:56

                              Tu es sûr d'avoir un problème d'allocation de mémoire ? PicoDev a soulevé un autre problème.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 janvier 2017 à 12:40:47

                                Roibabax a écrit:

                                Concrètement, que devrais je faire ? Travailler les chapitres d'allocation de la mémoire sur le site du zéro ? Je veux dire, en utilisant bien la mémoire et en travaillant "bien", il ne devrait pas y avoir de souci ? Si je relis les chapitres sur le cours sur openclassrooms, je ne devrais plus avoir aucun problèmes ?


                                J'ai lu il y a longtemps, 2 fois, le cours. A l'époque c'était pour les cours en fac de math en L1, ou pour mon fun à faire des programmes tout petits...Je devais avoir le même niveau qu'aujourd'hui, c'était suffisant pour ce que je faisais. Si je dois revoir et travailler en profondeur le cours (notamment sur l'allocation de la mémoire), je le ferai, mais je préférerais si vous me  dîtes qu'en programmant bien il n'y a aucun souci, avec le langage C :)


                                Pour l'indentation, je veux bien utiliser un tab, mais je dois le faire à chaque ligne, c'est pénible ! Si je n'avais qu'à le faire une fois au moment de la création de la boucle, ça irait...Mon ami ingénieur m'a dit qu'on pouvait trouver des sites ou on pouvait balancer son code et le texte devenait indenté, je vais voir.


                                Concrètement ? Je dirai qu'il y a du boulot mais que ce n'est pas insurmontable. Tu as déjà réussi à copier/coller un bout de code que tu as trouvé. Ensuite le problème vient de ce que tu as produit par toi-même. En vrac:

                                • oui, l'indentation c'est hyper important car si tu ne traduis pas visuellement les relations entre les morceaux du code tu vas tellement t'embrouiller que tu devras réfléchir pour savoir où rajouter une ligne, où trouver l'erreur. Il y a une correspondance entre ta démarche, l'algorithme et le code, et l'indentation traduit en partie cela. Maintenant si tu trouves pénible d'utiliser la tabulation … je ne peux rien pour toi, normalement c'est un automatisme de ta part avant d'être un automatisme de ton environnement.

                                • Apprendre à programmer, et en disant cela je ne parle pas d'apprendre à programmer en C. Il faut avoir un minimum de notions en algorithmie, et cela va un peu au-delà des boucles, des conditionnelles ou d'autres structure de contrôle. Tu n'as, par exemple, aucune structure rien que des variables à plat. Cela montre que tu n'es pas passé par une phase de réflexion pour construire ton code. ok, tu as sans doute écrit sur une feuille quelques formules que tu as simplement réécrit dans ta version de C. Mais cela n'est pas construire un programme. Une partie de ça est fait en apprenant le C. Donc un conseil, suis un tutoriel en C pour apprendre : les structures, les algos de base, et plus techniquement en C les pointeurs, l'allocation dynamique, etc. Le plus dur pour toi (je pense) sera d'arriver à créer un modèle qui représente les objets que tu veux manipuler.

                                • oublie la récursivité, je pourrais te donner un tas d'exemple où elle est inutile, utile ou indispensable. Je ne pense pas que cela servirait à quelque chose dans l'état actuel de tes connaissances, mais un jour viendra où …

                                • plie toi aussi au langage plus que l'inverse ; utiliser les tableaux de manière à commencer l'indexation à 1 n'est pas une bonne idée en C (sauf cas particuliers). Cela va certainement introduire des erreurs. 

                                • changer de langage ? oui et non. Ton problème  principal n'est pas le langage mais la conception donc dans un sens ou dans l'autre …

                                • PHP n'est pas forcément un langage que je te conseillerais en premier. Si tu veux t'essayer à un langage «moins rugueux» que le C je te conseillerais plutôt Python, mais hélas, l'indentation sera obligatoire.

                                • apprend aussi à te servir des outils qui sont à ta disposition. Si tu as un IDE, configure-le convenablement. Si tu as un compilateur, configure-le convenablement. Ne te restreins pas à ces outils, d'autres (comme valgrind sous unix/mac) ou un debuger  sont indispensables.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                First solve the problem. Then, write the code. ~ John Johnson
                                  18 janvier 2017 à 18:17:40

                                  Merci beaucoup pour vos réponses, particulièrement à Pico.

                                  "Maintenant si tu trouves pénible d'utiliser la tabulation … je ne peux rien pour toi, normalement c'est un automatisme de ta part avant d'être un automatisme de ton environnement."


                                  Je trouve surtout très dommage que l'IDE ne le fasse pas. Je vais voir si on ne peut pas mettre une option. Il n'y a pas de "normalement" !  Je ne suis pas programmeur et je n'ai jamais suivi d'études d'informatiques, je ne travaille pas pour une boîte ( et donc pas pour une boîte d'informatique) j'ai juste besoin de lancer de tels programmes pour mon activité, ça serait un gros +. Je suis justement ici pour apprendre les automatismes, donc merci, sincèrement, je ferai gaffe maintenant à indenter. Je pense quand même que c'est très dommage que l'IDE ne le fasse pas de lui même.

                                  "Cela montre que tu n'es pas passé par une phase de réflexion pour construire ton code."

                                  Si ! Maintenant, que tu la trouves baclé et médiocre, pas de soucis. D'ailleurs :

                                  " Tu as déjà réussi à copier/coller un bout de code que tu as trouvé.: "


                                  C'est faux et je ne vois pas comment tu peux sortir ça ? Tout le code vient de moi, excepté les fonctions avant le "main" qui sont des justes des fonctions permettant de générer des nombres au hasard.

                                  "Donc un conseil, suis un tutoriel en C pour apprendre : les structures, les algos de base, et plus techniquement en C les pointeurs, l'allocation dynamique, etc. Le plus dur pour toi (je pense) sera d'arriver à créer un modèle qui représente les objets que tu veux manipuler."

                                  Ok merci je vais me retapper le cours, je l'avais déjà fait deux fois, mais comme c'était juste pour la curiosité intelectuelle ( j'ai lu le cours sur le C en terminale en sachant que je ne bosserai jamais dans l'informatique, et puis une autre fois pour une  UE pour un seul semestre à la fac de maths) , j'ai jamais vraiment pratiqué sérieusement la programmation, du coup j'ai oublié un peu des parties du cours, et surtout je travaille pas proprement.

                                  "changer de langage ? oui et non. Ton problème  principal n'est pas le langage mais la conception donc dans un sens ou dans l'autre …"

                                  Ok, mais honnêtement, mon problème principal ( ok il y a 10K choses à redire sur mon code :) ) a l'air d'être une histoire de cadre alloué aux tableaux, de domaine de définition. Sur du python franchement mon code serait passé ou pas ?

                                  Merci sincèrement pour les conseils plus "généraux" sur le C, je peux t'assurer que je vais vraiment essayer de m'améliorer.


                                  Par ailleurs, pour en revenir à mon code plus précisément, j'aimerai bien essayer de le faire tourner, tout en m'améliorant sur le C en parallèle,

                                  Tu as dit que :

                                  "De toute façon la pile n'est apparemment pas explosée par la récursivité mais plus par des accès hors limite à certains tableaux, pour ce que je lis du log de valgrind. En gros ce n'est apparemment pas la pile qu'on arrive pas à agrandir mais des écritures qui se font en dehors du cadre alloué. valgrind donne 347 contextes où cela arrive (en gros endroits différents)."

                                  Des écritures en dehors du cadre alloué ? Ca veut dire que j'appelle des tableaux dans des domaines ou ils sont pas définis ?

                                  Par exemple, ça serait une erreur du type :

                                  Je déclare un tableau de taille 10, et j'écris tableau[13] alors que le tableau est de taille 10 ? C'est bien ça ?

                                  "

                                  -
                                  Edité par Roibabax 18 janvier 2017 à 18:20:37

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 janvier 2017 à 18:44:01

                                    Roibabax a écrit:

                                    Merci beaucoup pour vos réponses, particulièrement à Pico.

                                    "Maintenant si tu trouves pénible d'utiliser la tabulation … je ne peux rien pour toi, normalement c'est un automatisme de ta part avant d'être un automatisme de ton environnement."


                                    Je trouve surtout très dommage que l'IDE ne le fasse pas. Je vais voir si on ne peut pas mettre une option. Il n'y a pas de "normalement" !  Je ne suis pas programmeur et je n'ai jamais suivi d'études d'informatiques, je ne travaille pas pour une boîte ( et donc pas pour une boîte d'informatique) j'ai juste besoin de lancer de tels programmes pour mon activité, ça serait un gros +. Je suis justement ici pour apprendre les automatismes, donc merci, sincèrement, je ferai gaffe maintenant à indenter. Je pense quand même que c'est très dommage que l'IDE ne le fasse pas de lui même.

                                    Change d'IDE car effectivement c'est un plus même si ce n'est pas la panacée. C'est désormais une fonctionnalité de base. Quel IDE utilises-tu ?

                                    Roibabax a écrit:

                                    "Cela montre que tu n'es pas passé par une phase de réflexion pour construire ton code."

                                    Si ! Maintenant, que tu la trouves baclé et médiocre, pas de soucis. D'ailleurs :

                                    " Tu as déjà réussi à copier/coller un bout de code que tu as trouvé.: "


                                    C'est faux et je ne vois pas comment tu peux sortir ça ? Tout le code vient de moi, excepté les fonctions avant le "main" qui sont des justes des fonctions permettant de générer des nombres au hasard.

                                    Comme je le disais, tu as sans doute des formules et plus ou moins un plan de base. Ce qui te fait défaut, à mon avis, c'est toute la partie algorithmique et conception. En très gros on essaye toujours de «construire» des types qui représentent des objets du monde réel avec une floppée de fonctions qui manipulent des objets de ce type. Le code que tu montres n'en contient aucun. Ce n'est pas forcément grave en soi, mais ça nuit fortement à la lisibilité et à la facilité de compréhension.
                                    En ce qui concerne le copié/collé je ne parlais évidemment que de cette partie sur laquelle tu avais ouvert un sujet ici-même il y a quelques temps.

                                    Roibabax a écrit:

                                    "Donc un conseil, suis un tutoriel en C pour apprendre : les structures, les algos de base, et plus techniquement en C les pointeurs, l'allocation dynamique, etc. Le plus dur pour toi (je pense) sera d'arriver à créer un modèle qui représente les objets que tu veux manipuler."

                                    Ok merci je vais me retapper le cours, je l'avais déjà fait deux fois, mais comme c'était juste pour la curiosité intelectuelle ( j'ai lu le cours sur le C en terminale en sachant que je ne bosserai jamais dans l'informatique, et puis une autre fois pour une  UE pour un seul semestre à la fac de maths) , j'ai jamais vraiment pratiqué sérieusement la programmation, du coup j'ai oublié un peu des parties du cours, et surtout je travaille pas proprement.

                                    "changer de langage ? oui et non. Ton problème  principal n'est pas le langage mais la conception donc dans un sens ou dans l'autre …"

                                    Ok, mais honnêtement, mon problème principal ( ok il y a 10K choses à redire sur mon code :) ) a l'air d'être une histoire de cadre alloué aux tableaux, de domaine de définition. Sur du python franchement mon code serait passé ou pas ?

                                    Disons que d'autres langages ne forcent pas une gestion fine de la mémoire ; leur gestion est plus simple. Mais bon, comme ton code est horrible à lire je ne suis pas rentré dedans. Toutefois quand on utilise des noms de variables identique à un suffixe numérique près (ntie,ntie0,ntie1, …, ntie9) on se dit qu'un tableau+enum aurait sans doute été plus approprié. Tes données n'ont aucune structure alors qu'il s'en dégage quelques unes à la lecture. C'est surtout de cela dont je parle : le manque de structure dans tes données qui sont bien trop «brutes».
                                    Donc en python ou en C ce sera le même problème au final. La différence étant qu'en python (par exemple) tu auras bien moins de soucis avec la gestion de la mémoire.

                                    Roibabax a écrit:

                                    Par ailleurs, pour en revenir à mon code plus précisément, j'aimerai bien essayer de le faire tourner, tout en m'améliorant sur le C en parallèle,

                                    Tu as dit que :

                                    "De toute façon la pile n'est apparemment pas explosée par la récursivité mais plus par des accès hors limite à certains tableaux, pour ce que je lis du log de valgrind. En gros ce n'est apparemment pas la pile qu'on arrive pas à agrandir mais des écritures qui se font en dehors du cadre alloué. valgrind donne 347 contextes où cela arrive (en gros endroits différents)."

                                    Des écritures en dehors du cadre alloué ? Ca veut dire que j'appelle des tableaux dans des domaines ou ils sont pas définis ?

                                    Par exemple, ça serait une erreur du type :

                                    Je déclare un tableau de taille 10, et j'écris tableau[13] alors que le tableau est de taille 10 ? C'est bien ça ?

                                    "

                                    -
                                    Edité par Roibabax il y a 6 minutes

                                    Ce n'est qu'une supposition car je ne suis pas rentré dans ton code. C'est une intuition à une lecture rapide de log de valgrind.

                                    Toujours pour en revenir aux langages, que ce soit en C ou en Python ou en quoi que ce soit d'autre, il va falloir de toute façon apprendre à utiliser des outils ; le debuger étant le minimum vital.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    First solve the problem. Then, write the code. ~ John Johnson
                                      18 janvier 2017 à 18:47:07

                                      Roibabax a écrit:

                                       D'ailleurs :

                                      " Tu as déjà réussi à copier/coller un bout de code que tu as trouvé.: "


                                      1-C'est faux et je ne vois pas comment tu peux sortir ça ? Tout le code vient de moi, 2-excepté les fonctions avant le "main" qui sont des justes des fonctions permettant de générer des nombres au hasard.

                                      1-C'est l'évidence même
                                      2- car c'est bien de cette partie la qu'il parle (avec les commentaires en anglais en plus! et bien indenté en plus ;)

                                      Et tu n'as pas quoté la partie qui parle de ce que tu as fait toi même:

                                      PicoDev a écrit:

                                      Concrètement ? Je dirai qu'il y a du boulot mais que ce n'est pas insurmontable. Tu as déjà réussi à copier/coller un bout de code que tu as trouvé. Ensuite le problème vient de ce que tu as produit par toi-même. En vrac:



                                      Roibabax a écrit:

                                      Des écritures en dehors du cadre alloué ? Ca veut dire que j'appelle des tableaux dans des domaines ou ils sont pas définis ?


                                      Par exemple, ça serait une erreur du type :

                                      Je déclare un tableau de taille 10, et j'écris tableau[13] alors que le tableau est de taille 10 ? C'est bien ça ?


                                      Oui, c'est ce qu'il veut dire.

                                      D'ailleurs même ecrire tableau[10] est incorrecte puisque les indices valables vont de 0 à 9 inclus! C'est le problème avec ta manie de vouloir commencer avec l'indice à 1: c'est que même dans le cas le plus simple tes indices sont tous des résultats de calculs pas franchement faciles a contrôler d'un coup d'oeil, alors quand en plus l'indice dépend de d'autres variables évolutives comme la ligne 504 par exemple:

                                      	int valeurSabot[NCARTESABOT+1]; // l319
                                      	for(m=memoire;m<pc;m++)
                                      	{
                                      		//printf("\n\nrc6=%f\nTAG6:%d\nrc6=%f\n\n",rc6,tag6(valeurSabot[m]),rc6+tag6(valeurSabot[m]));
                                      		c6=rc6+tag6(valeurSabot[m]);
                                      		rc7=rc7+tag7(valeurSabot[m]);
                                      		rc8=rc8+tag8(valeurSabot[m]);
                                      		rc9=rc9+tag9(valeurSabot[m]);
                                      		// rc3g8=rc3g8+test8(valeurSabot[m]);
                                       		printf("%d\t",valeurSabot[m]);
                                      	}
                                      

                                      ou l'on voit que les variables de la boucle de controle sont pas en rapport direct avec la taille du tableau! (je dis pas que l'erreur potentielle vien de cette ligne, juste que c'est dur a controler en regardant ce bout de code!)

                                      Ajoute a cela la mauvaise indentation ou l'on ne voit pas quelle ligne de code  depend de quelle boucle...

                                      ps: sous windows, Visual studio fait une (belle) indentation automatique (au fur et a mesure que l'on écrit le code)

                                      -
                                      Edité par breizhbugs 18 janvier 2017 à 18:47:54

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                                        18 janvier 2017 à 22:42:32

                                        Merci beaucoup encore pour vos réponses. ( vous êtes très réactifs).

                                        Désolé picodev, je pensais que tu sous entendais qu'une partie de mon main était récupéré ailleurs.

                                        L'IDE que j'utilise c'est code blocks.

                                        Je ne pense pas que le problème vient des tableaux et d'écriture en dehors du cadre alloué. Je vais vérifier bien sur et y passer du temps.

                                        Merci encore pour vos réponses.

                                        Du coup j'hésite à passer tout de suite en python, si j'ai moins de soucis avec la gestion de la mémoire...Même si à côté de ça il faudra faire des progrès, j'en ai bien conscience.

                                        Je suis déçu, je pensais qu'avec votre debuggueur et votre IDE, vous auriez pu trouver la source de l'erreur, ou une piste ! ( c'est pas une critique, juste un constat)

                                        Parce que on a parlé longtemps de mes problèmes pour bien coder, et c'est très important ! Mais sur le code en question, à part une piste de picodev ( et je ne pense pas que le problème vient de là), vous n'avez pas réussi à trouver l'embrouille, je suis surpris que le deboggueur ou votre IDE ne vous signale pas l'erreur ( mais c'est comme ça). Parce que c'est pas le fait d'avoir déclaré un tableau à +1, ou de ne pas avoir indenter, c'est pas ça qui a fait bugger le programme. D'ailleurs le programme semble marcher pour une personne qui a copier coller le code.

                                        -
                                        Edité par Roibabax 18 janvier 2017 à 22:44:09

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 janvier 2017 à 0:22:23

                                          Roibabax a écrit:

                                          Je suis déçu, je pensais qu'avec votre debuggueur et votre IDE, vous auriez pu trouver la source de l'erreur, ou une piste ! ( c'est pas une critique, juste un constat)

                                          Parce que on a parlé longtemps de mes problèmes pour bien coder, et c'est très important ! Mais sur le code en question, à part une piste de picodev ( et je ne pense pas que le problème vient de là), vous n'avez pas réussi à trouver l'embrouille, je suis surpris que le deboggueur ou votre IDE ne vous signale pas l'erreur ( mais c'est comme ça). Parce que c'est pas le fait d'avoir déclaré un tableau à +1, ou de ne pas avoir indenter, c'est pas ça qui a fait bugger le programme. D'ailleurs le programme semble marcher pour une personne qui a copier coller le code.

                                          -
                                          Edité par Roibabax il y a environ 1 heure

                                          Des pistes ils t'en ont donné, qu'est que tu en as fait?  Tu dis que ca fait longtemps que l'on cause mais toi, depuis ton premier message , tu n'as toujours pas pris la peine d'éditer ton code pour l'indenter correctement! C'est PAS A NOUS de faire plus d'efforts que toi...

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                                            19 janvier 2017 à 12:42:29

                                            Roibabax :  je pense qu'il y a un malentendu, que tu as des espoirs exagérés et que tu surestimes les personnes qui te répondent. Tu sembles espérer que quelqu'un recopie ton programme, le mette dans son IDE, le compile, le débogue, etc. Je crois que personne ne fera ça. Et c'est normal : pour déboguer un programme, dès lors que les erreurs ne sont pas triviales, il faut savoir comment il est fait, par exemple bien connaître les algorithmes, le nom des variables et ce qu'elles stockent, etc. Il n'y a que toi qui sait tout ça (ou alors il faut nous poster une description détaillée...). L'aide que le forum peut apporter, c'est sur des questions précises.

                                            Par ailleurs je pense que tu commets une erreur en supposant a priori quel est le type de problème (« mon problème principal a l'air d'être une histoire de cadre alloué aux tableaux, de domaine de définition. »). Pour l'instant on ne sait rien. L'ordre logique, c'est :

                                            ─ 1° situer l'endroit où se produit une erreur. C'est ton boulot car ça suppose de connaître la structure du programme, la signification des variables, etc. Ça ne demande aucune compétence spéciale, juste un peu de logique (je dirais même de bon sens). Il faut suivre pas à pas ce que fait le programme, soit avec un débogueur, soit comme moi en mettant des printf partout (je devrais avoir honte d'employer une telle méthode ─ je ne sais même pas utiliser un débogueur ! ─ mais je la signale car elle marche, même quand on ne sait pas utiliser un débogueur). 

                                            ─ 2° une fois l'erreur située, il faut la comprendre. Là le forum pourra t'aider car tu pourras poser des questions précises.

                                            ─ 3° une fois l'erreur comprise, il faut la corriger, là aussi le forum pourra aider. Ça peut être plus ou moins difficile : parfois on a juste un point-virgule à rajouter, parfois il faut tout reprendre à zéro car l'erreur était due à la conception de base, mais en général c'est entre les deux...

                                            J'ai l'impression que tu espères être déjà à l'étape 3. En tout cas je t'encourage vivement à t'occuper du point 1. Sans ça tu resteras bloqué, tu risques de laisser tomber et de ne plus revenir sur ce forum qui n'a pas su t'aider...

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 janvier 2017 à 12:56:19

                                              robun a écrit:

                                              Roibabax :  je pense qu'il y a un malentendu, que tu as des espoirs exagérés et que tu surestimes les personnes qui te répondent. Tu sembles espérer que quelqu'un recopie ton programme, le mette dans son IDE, le compile, le débogue, etc. Je crois que personne ne fera ça. Et c'est normal : pour déboguer un programme, dès lors que les erreurs ne sont pas triviales, il faut savoir comment il est fait, par exemple bien connaître les algorithmes, le nom des variables et ce qu'elles stockent, etc. Il n'y a que toi qui sait tout ça (ou alors il faut nous poster une description détaillée...). L'aide que le forum peut apporter, c'est sur des questions précises.

                                              Oui voila qui est dit plus diplomatiquement que moi :)
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
                                                19 janvier 2017 à 13:51:56

                                                En même temps, ton programme, il est sensé faire quoi ?

                                                Parce que quand je vois cela :

                                                int modulo10(int a,int b)
                                                {
                                                    if (a+b<10)
                                                    {
                                                        return a+b;
                                                    }
                                                    else if (a+b<20)
                                                    {
                                                        return a+b-10;
                                                    }
                                                    else
                                                    {
                                                        return a+b-20;
                                                    }
                                                }
                                                Soit le nom de la fonction est mal choisi (car non, cela ne fait pas un modulo 10), soit la fonction est mal codé (car non, cette fonction ne fait pas un modulo 10).
                                                De plus, pour faire un modulo, on utilise '%', donc je me pose la question suivante : à quoi sert cette fonction ?

                                                Idem pour pas mal d'autre truc à gauche a droite : ca a été codé en mode "jusque là tout va bien", mais après, ca se retourne contre toi.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  19 janvier 2017 à 14:11:50

                                                  breizhbugs a écrit:

                                                  Roibabax a écrit:

                                                  Juste, pour éviter ces problèmes de dépassement de capacité de la pile, de récursivité et autres, ne devrais je pas utiliser un autre langage ?


                                                  Non, c'est commun a tous les langages. https://openclassrooms.com/courses/la-recursivite-1 -> exemple en php

                                                  On peut dérécursivé (ca se dit?)en faisant des boucles (while / for)


                                                  On peut toujours dérécursiver : pour cela il faut une pile, et si il y a trop de niveaux de récursivité, boum, elle explose. Le problème, c'est les algorithmes buggés qui se barrent en choucroute (comme l'dée de calculer récursivement les nombres de fibonacci), plus que l'utilisation de la récursivité en elle-même.

                                                  D'ailleurs, dérécursiver, c'est ce que fait un compilateur quand il rencontre un appel récursif. Il fout les trucs sur la pile.

                                                  -
                                                  Edité par michelbillaud 19 janvier 2017 à 14:14:15

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    19 janvier 2017 à 16:10:28

                                                    Merci Robun pour ton excellente clarification. Je vais travailler l'étape 1.

                                                    SoftEvans : Oui ma fonction modulo10 est inutile, bien vu, merci.

                                                    Merci encore, je vais travailler le projet.

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      19 janvier 2017 à 16:21:11

                                                      Bon, on vire un peu hors sujet mais 

                                                      michelbillaud a écrit:

                                                      breizhbugs a écrit:

                                                      Roibabax a écrit:

                                                      Juste, pour éviter ces problèmes de dépassement de capacité de la pile, de récursivité et autres, ne devrais je pas utiliser un autre langage ?


                                                      Non, c'est commun a tous les langages. https://openclassrooms.com/courses/la-recursivite-1 -> exemple en php

                                                      On peut dérécursivé (ca se dit?)en faisant des boucles (while / for)


                                                      On peut toujours dérécursiver : pour cela il faut une pile, et si il y a trop de niveaux de récursivité, boum, elle explose. Le problème, c'est les algorithmes buggés qui se barrent en choucroute (comme l'dée de calculer récursivement les nombres de fibonacci), plus que l'utilisation de la récursivité en elle-même.

                                                      Je ne parlerais pas d'algo bugués mais simplement d'algo de complexités différentes. Un algo qui offre peu de performance asymptotiquement en temps et/ou espace n'est pas bugué, il n'est juste pas bon. Dans ce cas fibonacci est un bon mauvais exemple quelque part. Il y a la version récursive naïve :

                                                      int fibo(int n)
                                                      {
                                                        if (n<2)
                                                          return n;
                                                        else
                                                          return fibo(n-1)+fibo(n-2);
                                                      }

                                                      Mauvaise implémentation très coûteuse, elle est en O(𝝋ⁿ) (si on ne la mémoise pas).

                                                      Il y a aussi la version efficace :

                                                      int fibo(int n)
                                                      {
                                                        return fibo_r(n,0,1);
                                                      }
                                                      
                                                      int fibo_r(int n, int a, int b)
                                                      {
                                                        if (n==0)
                                                          return a;
                                                        else
                                                          return fibo_r(n-1, b, a+b);
                                                      }

                                                      une version qui est en O(n), qui a de plus l'avantage d'être récursive terminale. 
                                                      On peut évidemment faire mieux en terme de complexité temporelle, je ne vérifie pas vraiment les paramètres, mais bon c'est pour l'exemple.

                                                      On peut aussi exploser la pile sans n'avoir aucun appel récursif. 

                                                      michelbillaud a écrit:

                                                      D'ailleurs, dérécursiver, c'est ce que fait un compilateur quand il rencontre un appel récursif. Il fout les trucs sur la pile.

                                                      Dérécursiver n'est pas mettre les trucs sur la pile, ça c'est ce qui se passe (en gros) à chaque appel même non récursif de fonction. Dérécursiver c'est éliminer l'appel récursif. Alors soit on utilise une pile, en gros on émule ce qui est fait récursivement, même si une pile sur le tas sera «plus lente» qu'une pile processeur elle aura l'avantage d'être plus volumineuse (a priori). Mais il existe d'autres techniques pour dérécursiver, sur tout les fonctions récursives terminales ( = celles qui ne font rien après l'appel récursif, si ce n'est éventuellement en retourner la valeur). Les fonctions récursives terminales se dérécursivent sans pile avec une simple boucle for. C'est ce que les compilateurs modernes font bien comme optimisation.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      First solve the problem. Then, write the code. ~ John Johnson
                                                        19 janvier 2017 à 19:50:24

                                                        Voici le code indenté :

                                                         (Voir message suivant)

                                                        -
                                                        Edité par Roibabax 19 janvier 2017 à 20:38:27

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          19 janvier 2017 à 20:04:57

                                                          Je me répète mais bon : c'est sensé faire quoi ton code ? C'est un simulateur de jeu de carte ?
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            19 janvier 2017 à 20:16:04

                                                            Je l'ai indiqué dans mon premier message. Oui c'est un simulateur de jeu de cartes.

                                                            #include <stdio.h>
                                                            #include <stdlib.h>
                                                            #include <math.h>
                                                            #include <time.h>
                                                            #define NCARTESABOT 416
                                                            #define PEN 400
                                                            #define FALSE 0
                                                            #define TRUE 1
                                                            
                                                            
                                                            
                                                            /* Globals */
                                                            double u[97],c,cd,cm;
                                                            int i97,j97;
                                                            int test = FALSE;
                                                            
                                                            /*
                                                               This is the initialization routine for the random number generator.
                                                               NOTE: The seed variables can have values between:    0 <= IJ <= 31328
                                                                                                                    0 <= KL <= 30081
                                                               The random number sequences created by these two seeds are of sufficient
                                                               length to complete an entire calculation with. For example, if sveral
                                                               different groups are working on different parts of the same calculation,
                                                               each group could be assigned its own IJ seed. This would leave each group
                                                               with 30000 choices for the second seed. That is to say, this random
                                                               number generator can create 900 million different subsequences -- with
                                                               each subsequence having a length of approximately 10^30.
                                                            */
                                                            void RandomInitialise(int ij,int kl)
                                                            {
                                                               double s,t;
                                                               int ii,i,j,k,l,jj,m;
                                                            
                                                               /*
                                                                  Handle the seed range errors
                                                                     First random number seed must be between 0 and 31328
                                                                     Second seed must have a value between 0 and 30081
                                                               */
                                                               if (ij < 0 || ij > 31328 || kl < 0 || kl > 30081) {
                                                            		ij = 1802;
                                                            		kl = 9373;
                                                               }
                                                            
                                                               i = (ij / 177) % 177 + 2;
                                                               j = (ij % 177)       + 2;
                                                               k = (kl / 169) % 178 + 1;
                                                               l = (kl % 169);
                                                            
                                                               for (ii=0; ii<97; ii++) {
                                                                  s = 0.0;
                                                                  t = 0.5;
                                                                  for (jj=0; jj<24; jj++) {
                                                                     m = (((i * j) % 179) * k) % 179;
                                                                     i = j;
                                                                     j = k;
                                                                     k = m;
                                                                     l = (53 * l + 1) % 169;
                                                                     if (((l * m % 64)) >= 32)
                                                                        s += t;
                                                                     t *= 0.5;
                                                                  }
                                                                  u[ii] = s;
                                                               }
                                                            
                                                               c    = 362436.0 / 16777216.0;
                                                               cd   = 7654321.0 / 16777216.0;
                                                               cm   = 16777213.0 / 16777216.0;
                                                               i97  = 97;
                                                               j97  = 33;
                                                               test = TRUE;
                                                            }
                                                            
                                                            /*
                                                               This is the random number generator proposed by George Marsaglia in
                                                               Florida State University Report: FSU-SCRI-87-50
                                                            */
                                                            double RandomUniform(void)
                                                            {
                                                               double uni;
                                                            
                                                               /* Make sure the initialisation routine has been called */
                                                               if (!test)
                                                               	RandomInitialise(1802,9373);
                                                            
                                                               uni = u[i97-1] - u[j97-1];
                                                               if (uni <= 0.0)
                                                                  uni++;
                                                               u[i97-1] = uni;
                                                               i97--;
                                                               if (i97 == 0)
                                                                  i97 = 97;
                                                               j97--;
                                                               if (j97 == 0)
                                                                  j97 = 97;
                                                               c -= cd;
                                                               if (c < 0.0)
                                                                  c += cm;
                                                               uni -= c;
                                                               if (uni < 0.0)
                                                                  uni++;
                                                            
                                                               return(uni);
                                                            }
                                                            
                                                            /*
                                                              ALGORITHM 712, COLLECTED ALGORITHMS FROM ACM.
                                                              THIS WORK PUBLISHED IN TRANSACTIONS ON MATHEMATICAL SOFTWARE,
                                                              VOL. 18, NO. 4, DECEMBER, 1992, PP. 434-435.
                                                              The function returns a normally distributed pseudo-random number
                                                              with a given mean and standard devaiation.  Calls are made to a
                                                              function subprogram which must return independent random
                                                              numbers uniform in the interval (0,1).
                                                              The algorithm uses the ratio of uniforms method of A.J. Kinderman
                                                              and J.F. Monahan augmented with quadratic bounding curves.
                                                            */
                                                            double RandomGaussian(double mean,double stddev)
                                                            {
                                                               double  q,u,v,x,y;
                                                            
                                                            	/*
                                                            		Generate P = (u,v) uniform in rect. enclosing acceptance region
                                                                  Make sure that any random numbers <= 0 are rejected, since
                                                                  gaussian() requires uniforms > 0, but RandomUniform() delivers >= 0.
                                                            	*/
                                                               do {
                                                                  u = RandomUniform();
                                                                  v = RandomUniform();
                                                               	if (u <= 0.0 || v <= 0.0) {
                                                                   	u = 1.0;
                                                                   	v = 1.0;
                                                               	}
                                                                  v = 1.7156 * (v - 0.5);
                                                            
                                                                  /*  Evaluate the quadratic form */
                                                                  x = u - 0.449871;
                                                               	y = fabs(v) + 0.386595;
                                                                  q = x * x + y * (0.19600 * y - 0.25472 * x);
                                                            
                                                                  /* Accept P if inside inner ellipse */
                                                                  if (q < 0.27597)
                                                            			break;
                                                            
                                                                  /*  Reject P if outside outer ellipse, or outside acceptance region */
                                                                } while ((q > 0.27846) || (v * v > -4.0 * log(u) * u * u));
                                                            
                                                                /*  Return ratio of P's coordinates as the normal deviate */
                                                                return (mean + stddev * v / u);
                                                            }
                                                            
                                                            /*
                                                               Return random integer within a range, lower -> upper INCLUSIVE
                                                            */
                                                            
                                                            int RandomInt(int lower,int upper)
                                                            {
                                                               return((int)(RandomUniform() * (upper - lower + 1)) + lower);
                                                            }
                                                            
                                                            /*
                                                               Return random float within a range, lower -> upper
                                                            */
                                                            double RandomDouble(double lower,double upper)
                                                            {
                                                               return((upper - lower) * RandomUniform() + lower);
                                                            }
                                                            
                                                            //FIN CODE GNR, DEBUT BACCARAT
                                                            
                                                            
                                                            int valeur(int nombre)
                                                            {
                                                                if ((nombre%13<=9)&&(nombre%13>=1))
                                                                {
                                                                    return nombre%13;
                                                                }
                                                            
                                                                return 0;
                                                            
                                                            }
                                                            
                                                            int modulo10(int a,int b)
                                                            {
                                                                if (a+b<10)
                                                                {
                                                                    return a+b;
                                                                }
                                                                else if (a+b<20)
                                                                {
                                                                    return a+b-10;
                                                                }
                                                                else
                                                                {
                                                                    return a+b-20;
                                                                }
                                                            }
                                                            int retourResultat(int banque,int joueur)
                                                            {
                                                                if (valeur(banque)==valeur(joueur))
                                                                {
                                                                    return valeur(banque);
                                                                }
                                                                else if (valeur(banque)<valeur(joueur))
                                                                {
                                                                    return 10;
                                                                }
                                                                else
                                                                {
                                                                    return 11;
                                                                }
                                                            }
                                                            
                                                            
                                                            
                                                            int tag6(int a)
                                                            {
                                                            
                                                                if ((a>=1)&&(a<=5))
                                                                    {
                                                                        return 0;
                                                                    }
                                                                else if(a==6)
                                                                    {
                                                                        return -6;
                                                                    }
                                                                else if(a==7)
                                                                    {
                                                                        return 0;
                                                                    }
                                                                else if((a==0)||(a==8)||(a==9))
                                                                    {
                                                                        return 1;
                                                                    }
                                                            
                                                            }
                                                            
                                                            
                                                            
                                                            int tag7(int a)
                                                            {
                                                                if ((a>=1)&&(a<=6))
                                                                    {
                                                                        return 0;
                                                                    }
                                                                else if(a==7)
                                                                    {
                                                                        return -6;
                                                                    }
                                                                else if((a==0)||(a==8)||(a==9))
                                                                    {
                                                                        return 1;
                                                                    }
                                                            
                                                            }
                                                            
                                                            int tag8(int a)
                                                            {
                                                            
                                                                if ((a>=1)&&(a<=3))
                                                                    {
                                                                        return 1;
                                                                    }
                                                                else if ((a>=4)&&(a<=7))
                                                                    {
                                                                        return 0;
                                                                    }
                                                                else if(a==8)
                                                                    {
                                                                        return -7;
                                                                    }
                                                                else if(a==9)
                                                                    {
                                                                        return 0;
                                                                    }
                                                                else if(a==0)
                                                                    {
                                                                        return 1;
                                                                    }
                                                            }
                                                            
                                                            
                                                            int tag9(int a)
                                                            {
                                                                if ((a>=1)&&(a<=3))
                                                                    {
                                                                        return 1;
                                                                    }
                                                                else if ((a>=4)&&(a<=8))
                                                                    {
                                                                        return 0;
                                                                    }
                                                                else if(a==9)
                                                                    {
                                                                        return -7;
                                                                    }
                                                                else if(a==0)
                                                                    {
                                                                        return 1;
                                                                    }
                                                            }
                                                            
                                                            
                                                            int test8(int a)
                                                            {
                                                                if (a==8)
                                                                    {
                                                                        return -1;
                                                                    }
                                                                else
                                                                    {
                                                                        return 0;
                                                                    }
                                                            }
                                                            
                                                            int main()
                                                            {
                                                            
                                                            
                                                                int i,j,k,l,m,n,a,compteur,inter,memoire=0,elu=0;
                                                                int Sabot[NCARTESABOT+1];
                                                                int valeurSabot[NCARTESABOT+1];
                                                                int tab[NCARTESABOT+1];
                                                                int mainBanque=0,mainJoueur=0,pc=1;
                                                                int nRound=0;
                                                                int resultat[60001];
                                                                int aide=0;
                                                                int nbanque=0,njoueur=0,ntie=0,ntie7=0,ntie6=0,ntie8=0,ntie9=0,ntie0=0,ntie1=0,ntie2=0,ntie3=0,ntie4=0,ntie5=0,n3g8=0;
                                                                double sommebanque=0;
                                                                double sommeround=0;
                                                                double sommejoueur=0,sommetie=0,sommetie6=0,sommetie7=0,sommetie8=0,sommetie9=0,sommetie0=0,sommetie1=0,sommetie2=0,sommetie3=0,sommetie4=0,sommetie5=0,somme3g8=0;
                                                                double ev6=0,ev7=0,ev8=0,ev9=0,evbanque=0,ev0=0,ev1=0,ev2=0,ev3=0,ev4=0,ev5=0,evjoueur=0,evtie=0,ev3g8200=0,ev3g8180=0;
                                                                double utile=0.95,quarantecinq=45,quatrevingt=80,centdix=110,centvingt=120,deuxcent=200,dcvc=225,dcq=215,cc=150,cqv=180,huit=8;
                                                            
                                                            
                                                                int nSabot=0;
                                                            
                                                            
                                                                double rc6=0,rc7=0,rc8=0,rc9=0,tc6=0,tc7=0,tc8=0,tc9=0,tc3g8=0,rc3g8=32;
                                                                double ncartesrestantes=416,cq2=52,decksrestants=0;
                                                                int drapeau6=0,drapeau7=0,drapeau8=0,drapeau9=0,drapeau3g8=0;
                                                                int ndrapeau6=0,ndrapeau7=0,ndrapeau8=0,ndrapeau9=0;
                                                                double sommedrapeau6=0,sommedrapeau7=0,sommedrapeau8=0,sommedrapeau9=0,sommedrapeau3g8=0;
                                                                double tabdrapeau6[60001],tabdrapeau7[60001],tabdrapeau8[60001],tabdrapeau9[60001],tabdrapeau3g8[60001],resultat3g8[60001];
                                                            
                                                                int score6=0,score7=0,score8=0,score9=0,score3g8=0,sommescore6=0,sommescore7=0,sommescore8=0,sommescore9=0,sommescore3g8=0;
                                                            
                                                                double ev6magu=0,ev7magu=0,ev8magu=0,ev9magu=0,evmagu=0;
                                                                double frequence6=0,frequence7=0,frequence8=0,frequence9=0,frequence3g8=0;
                                                            
                                                            
                                                            
                                                            
                                                                for(i=1;i<=60000;i++)
                                                                    {
                                                                        resultat[i]=-1;
                                                                    }
                                                            
                                                            
                                                                for (k=1;k<=1;k++)
                                                                    {
                                                            
                                                              /*  if (k%100==0)
                                                                {
                                                                    printf("k=%d\n\n",k);
                                                                }
                                                            */
                                                                        nbanque=0;
                                                                        nRound=0;
                                                                        ntie=0;
                                                                        njoueur=0;
                                                                        ntie0=0;
                                                                        ntie1=0;
                                                                        ntie2=0;
                                                                        ntie3=0;
                                                                        ntie4=0;
                                                                        ntie5=0;
                                                                        ntie6=0;
                                                                        ntie7=0;
                                                                        ntie8=0;
                                                                        ntie9=0;
                                                            
                                                                        n3g8=0;
                                                            
                                                            
                                                                        for(j=1;nRound<20000;j++)
                                                                            {
                                                                                pc=1;
                                                                                ncartesrestantes=416;
                                                                                rc6=0;
                                                                                rc7=0;
                                                                                rc8=0;
                                                                                rc9=0;
                                                            
                                                                                for(i=1;i<=NCARTESABOT;i++)
                                                                                    {
                                                                                        tab[i]=1;
                                                                                    }
                                                            
                                                            
                                                                                for(a=NCARTESABOT;a>=1;a--)
                                                                                    {
                                                                                        compteur=0;
                                                                                        elu=RandomInt(1,a);
                                                            
                                                                                        for(i=1;(compteur!=elu);i++)
                                                                                            {
                                                                                                if (tab[i]==1)
                                                                                                    {
                                                                                                        compteur++;
                                                                                                        inter=i;
                                                                                                    }
                                                                                            }
                                                            
                                                                                        Sabot[NCARTESABOT+1-a]=inter;
                                                                                        //  printf("%d\n%d\n%d\n",NCARTESABOT,inter,i);
                                                                                        tab[inter]=0;
                                                                                    }
                                                            
                                                            
                                                                            for(i=1;i<=NCARTESABOT;i++)
                                                                                {
                                                                                    valeurSabot[i]=valeur(Sabot[i]);
                                                                                    //   printf("%d\t%d\n",valeurSabot[i],i);
                                                                                }
                                                            
                                                            
                                                                            //  printf("\n\n\n\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\nNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOTNOUVEAUSABOT\n\n\n");
                                                            
                                                            
                                                                            while(pc<=PEN)
                                                                                {
                                                                                    //printf("PC=%d\n\n",pc);
                                                                                    memoire=pc;
                                                                                    mainBanque=modulo10(valeur(valeurSabot[pc]),valeur(valeurSabot[pc+2]));
                                                                                    mainJoueur=modulo10(valeur(valeurSabot[pc+1]),valeur(valeurSabot[pc+3]));
                                                                                    //  printf("%d\t%d\t%d\t%d\t%d\t%d\nMainJoueur=%d\tMainBanque=%d\t\n\n\n",valeurSabot[memoire+1],valeurSabot[memoire+3],valeurSabot[memoire],valeurSabot[memoire+2],valeurSabot[memoire+4],valeurSabot[memoire+5],mainJoueur,mainBanque);  //A SUPPRIMER
                                                            
                                                                                    if ((mainBanque==8)||(mainBanque==9)||(mainJoueur==8)||(mainJoueur==9)||((mainJoueur>=6)&&(mainBanque>=6)))
                                                                                        {
                                                                                            pc=pc+4;
                                                                                        }
                                                            
                                                                                    else if((mainJoueur>=6)&&(mainBanque<=5))
                                                                                        {
                                                                                            mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+4]));
                                                                                            pc=pc+5;
                                                                                        }
                                                            
                                                                                    else
                                                                                        {
                                                                                            mainJoueur=modulo10(mainJoueur,valeur(valeurSabot[pc+4]));
                                                                                            aide=valeurSabot[pc+4];
                                                            
                                                                                            if ((mainBanque==3)&&(valeur(valeurSabot[pc+4])==8))     //3G8 PARTIE
                                                                                                {
                                                                                                    n3g8++;
                                                                                                    resultat3g8[nRound+1]=1;
                                                                                                }
                                                            
                                                                                            else
                                                                                                {
                                                                                                    resultat3g8[nRound+1]=0;
                                                                                                }
                                                            
                                                                                            if (mainBanque<=2)
                                                                                                {
                                                                                                    mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                                                                                                    pc=pc+6;
                                                                                                }
                                                            
                                                                                            else if((mainBanque==3)&&((valeurSabot[pc+4])!=8))
                                                                                                {
                                                                                                    mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                                                                                                    pc=pc+6;
                                                                                                }
                                                            
                                                                                            else if((mainBanque==4)&&(aide>=2)&&(aide<=7))
                                                                                                {
                                                                                                    mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                                                                                                    pc=pc+6;
                                                                                                }
                                                            
                                                                                            else if((mainBanque==5)&&(aide>=4)&&(aide<=7))
                                                                                                {
                                                                                                    mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                                                                                                    pc=pc+6;
                                                                                                }
                                                            
                                                                                            else if((mainBanque==6)&&(aide>=6)&&(aide<=7))
                                                                                                {
                                                                                                    mainBanque=modulo10(mainBanque,valeur(valeurSabot[pc+5]));
                                                                                                    pc=pc+6;
                                                                                                }
                                                                                            else
                                                                                                {
                                                                                                    pc=pc+5;
                                                                                                    //  printf("5emecarte=%d\tMainJoueur=%d\n",valeur(valeurSabot[memoire+4]),mainJoueur);
                                                                                                }
                                                            
                                                                                        }
                                                            
                                                                                    nRound++;
                                                                                    resultat[nRound]=retourResultat(mainBanque,mainJoueur);
                                                                                    //printf("%d\t%d\t%d\t%d\t%d\t%d\nMainJoueur=%d\tMainBanque=%d\tResultat=%d\npc=%d\n\n",valeurSabot[memoire+1],valeurSabot[memoire+3],valeurSabot[memoire],valeurSabot[memoire+2],valeurSabot[memoire+4],valeurSabot[memoire+5],mainJoueur,mainBanque,resultat[nRound],pc);  //A SUPPRIMER
                                                            
                                                            
                                                                                    for(m=memoire;m<pc;m++)
                                                                                        {
                                                                                            //printf("\n\nrc6=%f\nTAG6:%d\nrc6=%f\n\n",rc6,tag6(valeurSabot[m]),rc6+tag6(valeurSabot[m]));
                                                                                            rc6=rc6+tag6(valeurSabot[m]);
                                                                                            rc7=rc7+tag7(valeurSabot[m]);
                                                                                            rc8=rc8+tag8(valeurSabot[m]);
                                                                                            rc9=rc9+tag9(valeurSabot[m]);
                                                                                            // rc3g8=rc3g8+test8(valeurSabot[m]);
                                                            
                                                            
                                                                                           // printf("%d\t",valeurSabot[m]);
                                                                                        }
                                                            
                                                            
                                                                                    ncartesrestantes=ncartesrestantes-(pc-memoire);
                                                            
                                                                                    tc6=rc6*cq2/ncartesrestantes;
                                                                                    tc7=rc7*cq2/ncartesrestantes;
                                                                                    tc8=rc8*cq2/ncartesrestantes;
                                                                                    tc9=rc9*cq2/ncartesrestantes;
                                                                                    //tc3g8=rc3g8*cq2/ncartesrestantes;
                                                            
                                                                                    drapeau6=(tc6>=8);
                                                                                    drapeau7=(tc7>=4);
                                                                                    drapeau8=(tc8>=7);
                                                                                    drapeau9=(tc9>=7);
                                                                                    //drapeau3g8=(tc3g8>=5);
                                                            
                                                                                    /*
                                                                                    printf("\n\nnRound=%d\n\nRC6:%f\tRC7:%f\tRC8:%f\tRC9:%f\t\n\n",nRound,rc6,rc7,rc8,rc9);
                                                                                    printf("NCRestantes:%f\tTC6:%f\tTC7:%f\tTC8:%f\tTC9:%f\t\n\n",ncartesrestantes,tc6,tc7,tc8,tc9);
                                                                                    printf("Drapeau6=%d\tDrapeau7=%d\tDrapeau8=%d\tDrapeau9=%d\t",drapeau6,drapeau7,drapeau8,drapeau9);
                                                                                    */
                                                            
                                                                                    tabdrapeau6[nRound]=(tc6>=8);
                                                                                    tabdrapeau7[nRound]=(tc7>=4);
                                                                                    tabdrapeau8[nRound]=(tc8>=7);
                                                                                    tabdrapeau9[nRound]=(tc9>=7);
                                                                                    //tabdrapeau3g8[nRound]=(tc3g8>=5);
                                                            
                                                            
                                                            
                                                            
                                                                                }   //FIN BOUCLE WHILE
                                                            
                                                                            nSabot++;
                                                                            //printf("\n\n\n\n*************\nFINSABOT\nFINSABOT\nFINSABOT\tSabotsJouees=%d\nFINSABOT\n*************\n**********\n\n\n\n",nSabot);
                                                            
                                                            
                                                                            }   //FIN BOUCLE J
                                                            
                                                            
                                                                        for(i=1;i<=nRound;i++)
                                                                            {
                                                                                if (resultat[i]==11)
                                                                                    {
                                                                                        nbanque++;
                                                                                    }
                                                                                else if (resultat[i]==10)
                                                                                    {
                                                                                        njoueur++;
                                                                                    }
                                                                                else
                                                                                    {
                                                                                        ntie++;
                                                                                        if (resultat[i]==7)
                                                                                            {
                                                                                                ntie7++;
                                                                                            }
                                                                                        else if (resultat[i]==6)
                                                                                            {
                                                                                                ntie6++;
                                                                                            }
                                                                                        else if (resultat[i]==8)
                                                                                            {
                                                                                                ntie8++;
                                                                                            }
                                                                                        else if (resultat[i]==9)
                                                                                            {
                                                                                                ntie9++;
                                                                                            }
                                                                                        else if (resultat[i]==0)
                                                                                            {
                                                                                                ntie0++;
                                                                                            }
                                                                                        else if (resultat[i]==1)
                                                                                            {
                                                                                                ntie1++;
                                                                                            }
                                                                                        else if (resultat[i]==2)
                                                                                            {
                                                                                                ntie2++;
                                                                                            }
                                                                                        else if (resultat[i]==3)
                                                                                            {
                                                                                                ntie3++;
                                                                                            }
                                                                                        else if (resultat[i]==4)
                                                                                            {
                                                                                                ntie4++;
                                                                                            }
                                                                                        else if (resultat[i]==5)
                                                                                            {
                                                                                                ntie5++;
                                                                                            }
                                                                                    }
                                                                            }
                                                            
                                                                        /*
                                                                        somme3g8=somme3g8+n3g8;
                                                                        sommebanque=sommebanque+nbanque;
                                                                        sommeround=sommeround+nRound;
                                                                        sommejoueur=sommejoueur+njoueur;
                                                                        sommetie=sommetie+ntie;
                                                            
                                                                        sommetie7=sommetie7+ntie7;
                                                                        sommetie8=sommetie8+ntie8;
                                                                        sommetie9=sommetie9+ntie9;
                                                                        sommetie6=sommetie6+ntie6;
                                                                        sommetie0=sommetie0+ntie0;
                                                                        sommetie1=sommetie1+ntie1;
                                                                        sommetie2=sommetie2+ntie2;
                                                                        sommetie3=sommetie3+ntie3;
                                                                        sommetie4=sommetie4+ntie4;
                                                                        sommetie5=sommetie5+ntie5;
                                                                        */
                                                            
                                                                        //printf("Score6:%f\tScore7:%f\tScore8:%f\tScore9:%f\t\n\n",score6,score7,score8,score9);
                                                            
                                                            
                                                                        for (m=2;m<=nRound;m++)
                                                                            {
                                                                                //printf("tabdrapeau6=%f\n\n",tabdrapeau6[m-1]);
                                                                                if (tabdrapeau6[m-1])
                                                            
                                                                                        //printf("66666666\n\nm=%d\nnround=%d\n",m,nRound);
                                                                                        sommedrapeau6++;
                                                            
                                                                                        if (resultat[m]==6)
                                                                                            {
                                                                                                score6+=45;
                                                                                            }
                                                                                        else
                                                                                            {
                                                                                                score6--;
                                                                                            }
                                                                                    }
                                                                            }
                                                            
                                                            
                                                            
                                                                        for (m=2;m<=nRound;m++)
                                                                            {
                                                                                //printf("66666666\n\nm=%d\n\n",m);
                                                                                if (tabdrapeau7[m-1])
                                                                                    {
                                                                                        sommedrapeau7++;
                                                            
                                                                                        if (resultat[m]==7)
                                                                                            {
                                                                                                score7+=45;
                                                                                            }
                                                                                        else
                                                                                            {
                                                                                                score7--;
                                                                                            }
                                                                                    }
                                                                            }
                                                            
                                                                        for (m=2;m<=nRound;m++)
                                                                            {
                                                                                //printf("66666666\n\nm=%d\n\n",m);
                                                                                if (tabdrapeau8[m-1])
                                                                                    {
                                                                                        sommedrapeau8++;
                                                            
                                                                                        if (resultat[m]==8)
                                                                                            {
                                                                                                score8+=80;
                                                                                            }
                                                                                        else
                                                                                            {
                                                                                                score8--;
                                                                                            }
                                                                                    }
                                                                            }
                                                            
                                                            
                                                            
                                                                        for (m=2;m<=nRound;m++)
                                                                            {
                                                                                //printf("66666666\n\nm=%d\n\n",m);
                                                                                if (tabdrapeau9[m-1])
                                                                                    {
                                                                                        sommedrapeau9++;
                                                            
                                                                                        if (resultat[m]==9)
                                                                                            {
                                                                                                score9+=80;
                                                                                            }
                                                                                        else
                                                                                            {
                                                                                                score9--;
                                                                                            }
                                                                                    }
                                                                            }
                                                            
                                                            
                                                            
                                                                        /*
                                                                        for (m=2;m<=nRound;m++)
                                                                            {
                                                                                if (tabdrapeau3g8[m-1])
                                                                                    {
                                                                                        sommedrapeau3g8++;
                                                            
                                                                                        if (resultat3g8[m]==1)
                                                                                            {
                                                                                                score3g8=score3g8+200;
                                                                                            }
                                                                                        else
                                                                                            {
                                                                                                score3g8=score3g8-1;
                                                                                            }
                                                                                    }
                                                                            }
                                                            
                                                                        */
                                                            
                                                            
                                                            
                                                            
                                                            
                                                                    }  //FIN BOUCLE K
                                                                /*
                                                                ev7=(sommetie7*quarantecinq-(sommeround-sommetie7))/sommeround*100;
                                                                ev6=(sommetie6*quarantecinq-(sommeround-sommetie6))/sommeround*100;
                                                                ev8=(sommetie8*quatrevingt-(sommeround-sommetie8))/sommeround*100;
                                                                ev9=(sommetie9*quatrevingt-(sommeround-sommetie9))/sommeround*100;
                                                            
                                                                ev0=(sommetie0*cc-(sommeround-sommetie0))/sommeround*100;
                                                                ev1=(sommetie1*dcq-(sommeround-sommetie1))/sommeround*100;
                                                                ev2=(sommetie2*dcvc-(sommeround-sommetie2))/sommeround*100;
                                                                ev3=(sommetie3*deuxcent-(sommeround-sommetie3))/sommeround*100;
                                                                ev4=(sommetie4*centvingt-(sommeround-sommetie4))/sommeround*100;
                                                                ev5=(sommetie5*centdix-(sommeround-sommetie5))/sommeround*100;
                                                            
                                                                evbanque=(sommebanque*utile-sommejoueur)/sommeround*100;
                                                                evjoueur=(sommejoueur-sommebanque)/sommeround*100;
                                                                evtie=(sommetie*8-(sommeround-sommetie))/sommeround*100;
                                                            
                                                            
                                                                ev3g8200=(somme3g8*deuxcent-(sommeround-somme3g8))/sommeround*100;
                                                                ev3g8180=(somme3g8*cqv-(sommeround-somme3g8))/sommeround*100;
                                                            
                                                            
                                                                //UTILE =0.95
                                                            
                                                                printf("DEBUT SIMS ENLEVEMENT DE LA CARTE : %d\n\n",l);
                                                                printf("Sommeround=%f\tSommeBanque=%f\tSommeJoueur=%f\tSommeTie=%f\n\nEvBanque=%f\tEvJoueur=%f\tEvtie=%f\n\n",sommeround,sommebanque,sommejoueur,sommetie,evbanque,evjoueur,evtie);
                                                                printf("Sommetie6=%f\tSommetie7=%f\tSommetie8=%f\tSommetie9=%f\n\n",sommetie6,sommetie7,sommetie,sommetie9);
                                                                printf("Sommetie0=%f\tSommetie1=%f\tSommetie2=%f\tSommetie3=%f\tSommetie4=%f\tSommetie5=%f\n\nSomme3g8=%f\n\n",sommetie0,sommetie1,sommetie2,sommetie3,sommetie4,sommetie5,somme3g8);
                                                            
                                                            
                                                            
                                                                printf("EV0=%f\tEV1=%f\tEV2=%f\tEV3=%f\tEV4=%f\tEV5=%f\t\n",ev0,ev1,ev2,ev3,ev4,ev5);
                                                                printf("EV6=%f\tEV7=%f\tEV8=%f\tEV9=%f\t\n\n",ev6,ev7,ev8,ev9);
                                                            
                                                                printf("Ev3g8200=%f\nEv3g8180=%f\n\n",ev3g8200,ev3g8180);
                                                                printf("CHANGEMENTCHANGEMENTCHANGEMENT\nCHANGEMENTCHANGEMENTCHANGEMENT\nCHANGEMENTCHANGEMENTCHANGEMENT\nCHANGEMENTCHANGEMENTCHANGEMENT\n\n\n");
                                                            
                                                                somme3g8=0;
                                                            
                                                                sommebanque=0;
                                                                sommeround=0;
                                                                sommejoueur=0;
                                                                sommetie=0;
                                                            
                                                                sommetie7=0;
                                                                sommetie8=0;
                                                                sommetie9=0;
                                                                sommetie6=0;
                                                                sommetie0=0;
                                                                sommetie1=0;
                                                                sommetie2=0;
                                                                sommetie3=0;
                                                                sommetie4=0;
                                                                sommetie5=0;
                                                                */
                                                            
                                                                sommeround=nRound;
                                                            
                                                                /*
                                                                ev6magu=score6/sommeround;
                                                                ev7magu=score7/sommeround;
                                                                ev8magu=score8/sommeround;
                                                                ev9magu=score9/sommeround;
                                                                evmagu=score3g8/sommeround;
                                                                */
                                                            
                                                                frequence6=sommedrapeau6/sommeround;
                                                                frequence7=sommedrapeau7/sommeround;
                                                                frequence8=sommedrapeau8/sommeround;
                                                                frequence9=sommedrapeau9/sommeround;
                                                            
                                                                printf("Nombre Opportunites nombre de mises ou TC est OK\nN6=%f\tN7=%f\tN8=%f\tN9=%f\tN3G8=\n\n",sommedrapeau6,sommedrapeau7,sommedrapeau8,sommedrapeau9);
                                                            
                                                                //printf("%f",sommedrapeau3g8);
                                                                //LIGNE A DEBUGER 783
                                                                printf("Nombre Opportunites frequence de mises ou TC est OK\nf6=%f\tf7=%f\tf8=%f\tf9=%f\tf3G8=%f\n\n",frequence6,frequence7,frequence8,frequence9,frequence3g8);
                                                            
                                                            
                                                                /*
                                                                printf("ev7mag=%f\n",ev7magu);
                                                                printf("ev8mag=%f\n",ev8magu);
                                                                printf("ev6mag=%f\n",ev6magu);
                                                                printf("ev9mag=%f\n",ev9magu);    //EVMAGU 7 et 8 BUG !!
                                                                */
                                                            
                                                               // printf("Sommedrapeau6=%f\tSommedrapeau7=%f\tSommedrapeau8=%f\tSommedrapeau9=%f\t\n\n",sommedrapeau6,sommedrapeau7,sommedrapeau8,sommedrapeau9);
                                                            
                                                                //printf("Score6:%f\tScore7:%f\tScore8:%f\tScore9:%f\t\n\n",score6,score7,score8,score9);
                                                            
                                                            
                                                            
                                                            
                                                                return 0;
                                                            
                                                            
                                                            }  //FIN MAIN
                                                            
                                                            
                                                            



                                                            -
                                                            Edité par Roibabax 19 janvier 2017 à 20:50:33

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              19 janvier 2017 à 20:47:42

                                                              Roibabax a écrit:

                                                              Je l'ai indiqué dans mon premier message. Oui c'est un simulateur de jeu de cartes.

                                                              Sinon c'est de pire en pire ! Je commence vraiment à me dire que le C c'est nul, ou alors codeblocks. J'ai un nouveau code d'erreur qui est apparu, comme par magie ! Un nouveau message d'erreur m'affiche que  "ligne 797: la variable nRound n'a pas été déclaré dans une fonction" alors que je l'ai déclaré ligne 324 !

                                                               Autres erreurs  :

                                                              Ligne 807, sommedrapeau6 undeclared, alors que je l'ai déclaré...

                                                              Du coup j'ai essaye de printfer somme drapeau 6, voilà que je ne sais plus faire les printf !

                                                              Message d'erreur : "

                                                              error: expected declaration specifiers or '…' before string constant"


                                                              Bah oui, il n'y a rien de pire que d'essayer de faire tomber un programme en marche par hasard, et c'est vrai qu'il est toujours plus simple de rejeter la faute sur les outils.

                                                              Néamoins comme tu as fait l'effort d'indenter ton programme j'ai essayé d'investiguer un tout petit plus …

                                                              Première constation, tu as au moins 6 tableaux de 60001 doubles et un tableau de 60001 int → 3047 Ko de pile utilisée, et je ne compte pas la centaine d'autres variables … donc oui, tu utilises trop de pile certainement.

                                                              Cela m'est confirmé par valgrind qui râle dès le départ avec un beau :

                                                              ==26366== Memcheck, a memory error detector
                                                              ==26366== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
                                                              ==26366== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
                                                              ==26366== Command: ./hor
                                                              ==26366== 
                                                              ==26366== Warning: client switching stacks?  SP change: 0xffefffe08 --> 0xffed79e70
                                                              ==26366==          to suppress, use: --max-stackframe=2645912 or greater
                                                              ==26366== Invalid write of size 4
                                                              ==26366==    at 0x109016: main (hor.c:317)
                                                              ==26366==  Address 0xffed79f00 is on thread 1's stack
                                                              ==26366==  in frame #0, created by main (hor.c:314)
                                                              ==26366== 

                                                              Avant même de faire quoi que ce soit, la pile est en danger … pas bon.

                                                              Le même log est totalement vide si je dis à valgrind explicitement que ma pile fait 8Mo. Tu utilises trop la pile.
                                                              En même temps grâce à toi je veins d'apprendre que valgrind ne prend pas forcément pour taille de pile la taille effective de la pile comme référence (faudra que je regarde ça de plus près). 

                                                              Au point où tu en est, il peut être plus simple pour toi d'essayer, à tes risques et périls, de passer les variables locales de main en globales pour qu'elles utilisent un autre espace mémoire. C'est une solution qu'on peut qualifier de «bordel innommable, plus sale que les écuries d'Augias» mais bon.

                                                              Ou alors modifie la taille de pile à un minimum de 4Mo voire 8Mo pour être tranquille (ou carrément 80Mo tant qu'on y est). C'est un peu plus propre.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              First solve the problem. Then, write the code. ~ John Johnson

                                                              Mon programme bug, pas d'erreur

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown