IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

un printf qui s'il manque fausse les résultats


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut un printf qui s'il manque fausse les résultats
    Bonjours,
    je viens à vous car je suis en train d'écrire un programme en C (simplification de fonctions logiques).
    affin de faciliter les tests, j'ai définit une constante HABLATIF qui permet de choisir la quantité de résultats intermédiaires à afficher (allant de 0 à 3, plus elle est élevé, plus on affiche de texte à la console). Mais je me suis rendu compte que pour HABLATIF=0, le résultat est erroné alors que pour HABLATIF=1, il est correct.
    Après recherche, je me suis rendu compte que la différence ce faisait sur ce petit bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (HABLATIF>0)
    {
          printf("debut passe");
    }
    En effet, si je ne laisse que la ligne avec le printf, le résultat est correct même pour HABLATIF=0 !!!
    Si je ne laisse que la ligne avec le printf et que je remplace "debut passe" par "de", ça marche encore, mais
    si je ne laisse que la ligne avec le printf et que je remplace "debut passe" par "d", ça marche plus.

    Je n'y comprend plus rien.

    En mode HABLATIF=0, la console affiche:
    Nom : console1.png
Affichages : 136
Taille : 10,4 Ko
    mais devrait afficher un 3 à la place du 2 sur la ligne #impliq_prem_=2

    si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (HABLATIF>0)
    {
          printf("debut passe");
    }
    par , j'obtiens le bon résultat (avec les "debut passe" en plus) :Nom : console1.png
Affichages : 151
Taille : 10,0 Ko

    je vous mets également le code complet : main.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    /*à faire
    -copie terme à terme de L2 dans L1 pour rétablir l'ordre croissant de poids
    -récupérer les antécédents premiers + décocher l'option non premier à la fin des étapes
    -suprimer proprement les listes plus utilisées
     
     
     
    -élimination des doublons dans la liste L2 : gain en performance?
    */
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
     
    //paramètres et entrées
    #define HABLATIF 0 //0 : que les durées ; 1 : + impliquants 1ers à la fin ; 2 :+ impliquants 1ers au fur et à mesure; 3: tout
    #define CALCULER_TAILLE_LISTES 0  //si =1 : calcule la taille de L2 et de la liste des impliquants permiers à la fin de chaque étape et les affiche
    #define NOMBRE_DE_VAR 4
    #define NOMBRE_DE_VAR_PLUS_UN 5            //la ligne précédente +1
    #define DEUX_PUISSANCE_NBR_VAR 2*2*2*2  //nombre_de_var 2
    #define DEUX_PUISSANCE_DEMI_NBR_VAR 2*2  //nombre_de_var/2 2 (arrondir à l'inférieur)
    int table_de_verite[DEUX_PUISSANCE_NBR_VAR];
    //fin paramètres et entrées
     
    typedef struct antecedent antecedent;
    struct antecedent
    {
        int pseudo_nombre[NOMBRE_DE_VAR];
        int poids;
        int impliquant_premier;
        int trinaire;
    };
     
    typedef struct antecedentL antecedentL;
    struct antecedentL
    {
        antecedent *antec;
        antecedentL *suivant;
    };
     
    typedef struct antecedentLL antecedentLL;
    struct antecedentLL
    {
        antecedentL *antecL;
        antecedentLL *suivant;
    };
     
    int remplit_case_table_de_verite(int nbr_var, int i);
    int remplit_case_table_de_verite(int nbr_var, int i)
    {
        //i(binaire)= (r.)b0. ... .bk.a0. ... . ak où k=n/2
        int n=nbr_var;
        int a=0;
        int b=0;
        int r=(n%2)*(i%2);
        n=n/2;
        int x=i;
        int j;
        for(j=0;j<n;j++)
        {
            a=2*a+(x%2);
            x=x/2;
        }
        for(j=0;j<n;j++)
        {
            b=2*b+(x%2);
            x=x/2;
        }
        x=r+a+b;  //x résultat en binaire
        int dpdnv=DEUX_PUISSANCE_DEMI_NBR_VAR;
        return (x/dpdnv);
    }
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre);
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau);
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau);
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau);
    void affiche_antecedent(char *nom, antecedent antec);
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier);
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier);
    int difference_antecedents(antecedent* antec1, antecedent* antec2);
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL);
    void supprime_antecedent_dans_antecedentL(antecedentL *antecL_m1);
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec);
    int cardinal_antecL(antecedentL *premier);
    int cardinal_antecLL(antecedentLL *premier);
    void elimine_doublons_d_une_anteccedentL_rapide(antecedentL **p_premier);
    void decoupe_en_deux_pour_tri_fusion(antecedentL *premier,antecedentL **p_premier1,antecedentL **p_premier2);
    void fusion_listes_pour_tri_fusion(antecedentL *premier1,antecedentL *premier2, antecedentL **p_premier_fus);
    int antecedent_to_trinaire(antecedent *antec);
     
    int nombre_de_un=0;
    antecedent *tableau_des_antecedents_de_un=NULL;
    antecedentLL *premier_L1;
    antecedentLL *premier_L2;
    antecedentL *premier_liste_impliquants_premiers;
     
    antecedent *tableau_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN];
    int tableau_des_tailles_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN]; //  contient la taille des tableaux formant les elements du tableau déclaré la ligne au-dessus
     
     
    int taille_table_verite;
    //variables muettes
    int i,j,k,l,m,n;
    int tps;
    int tabl_prov[NOMBRE_DE_VAR_PLUS_UN];
    antecedentLL *p_antecLL;  //pointeur muet sur un antecendentLL
    //fin variables muettes
     
     
    int main()
    {
        for(i=0;i<DEUX_PUISSANCE_NBR_VAR;i++)
        {
            table_de_verite[i]=remplit_case_table_de_verite(NOMBRE_DE_VAR,i);
        }
     
        //début calcul nombre d'antécédents de 1
        taille_table_verite=pow(2,NOMBRE_DE_VAR);
     
     
     
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                nombre_de_un++;
            }
        }
        //fin calcul nombre d'antécédents de 1
        //début tableau antécédents de 1
        if (HABLATIF>2)
        {
            affiche_tableau_int("table_de_verite",taille_table_verite,table_de_verite);
            printf("nbr_de_un=%d\n",nombre_de_un);
        }
       tableau_des_antecedents_de_un = malloc(sizeof(antecedent)*nombre_de_un);
        if (tableau_des_antecedents_de_un == NULL) // Si l'allocation a échoué
        {
            exit(0); // On arrête immédiatement le programme
        }
        k=0;  //poiteur sur la position du prochain antécédent de 1 à placer.
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                initialisation_structure_antecedent(&tableau_des_antecedents_de_un[k],i);
              //  affiche_antecedent("\n",tableau_des_antecedents_de_un[k]);
                k++;
            }
        }
        if (HABLATIF>2)
        {
            affiche_tableau_antecedent("tableau initial",nombre_de_un,tableau_des_antecedents_de_un);
        }
        //fin tableau antécédents de 1
     
        //début création tableau ordonnée par poids des antécédents de 1
        for(i=0;i<=NOMBRE_DE_VAR;i++)  //i représente le poids dans cette boucle
        {
            k=0;                          //k représente le nombre d'antécédents de 1 de poids i trouvés
            for(j=0;j<nombre_de_un;j++)
            {
                if (tableau_des_antecedents_de_un[j].poids==i)
                {
                    k++;
                }
            }
            tableau_des_tableaux_par_poids_initial[i]=NULL;
            tableau_des_tableaux_par_poids_initial[i]=malloc(k*sizeof(antecedent));
            if (tableau_des_tableaux_par_poids_initial[i]==NULL)  //s'il n'y a plus de place en mémoire
            {
                exit(0);
            }
            tableau_des_tailles_des_tableaux_par_poids_initial[i]=k;   //on mémorise le nombre d'antécédents de poids i
            //on a créé le tableau des antécédents de poids i
            tabl_prov[i]=0;//on en profite pour initialiser le tableau provisoire qui servira juste après
        }
        //on viens de créer les tableaux des antécédents de poids i pour tout les i
     
        for(i=0;i<nombre_de_un;i++)//remplissage des nouveaux tableaux
        {
            k=tableau_des_antecedents_de_un[i].poids;                       //k=poids de l'élément i
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].poids=k;
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].impliquant_premier=0;
            for(j=0;j<NOMBRE_DE_VAR;j++)
            {
                tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].pseudo_nombre[j]=tableau_des_antecedents_de_un[i].pseudo_nombre[j];
            }
            tabl_prov[k]++;
        }
        if (HABLATIF>2)
        {
            affiche_tableau_des_tableaux_des_antecedent_par_poids("tableau_des_tableaux_par_poids_initial",NOMBRE_DE_VAR_PLUS_UN,tableau_des_tailles_des_tableaux_par_poids_initial,tableau_des_tableaux_par_poids_initial);
        }
        //fin création tableau ordonnée par poids des antécédents de 1
     
     
     
        //début création liste des antecédents de 1 par poids initial
        p_antecLL=premier_L1;
        if (HABLATIF>2)
        {
            printf("\n\n\n\n");
        }
        for(i=0;i<NOMBRE_DE_VAR+1;i++)
        {
            antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
            if (nouveauLL == NULL)
            {
                exit(0);
            }
            nouveauLL->antecL = NULL;
            k=tableau_des_tailles_des_tableaux_par_poids_initial[i];  //k=nombre d'antecedents de poids i
            for(j=0;j<k;j++)//j : numéreau de l'antecedent de poids i dans le tableau des antecedents de poids i
            {
                antecedentL *nouveauL=malloc(sizeof(nouveauL));
                if (nouveauL == NULL)
                {
                    exit(0);
                }
                antecedent *nouveauAntec=malloc(sizeof(antecedent));
                for(l=0;l<NOMBRE_DE_VAR;l++)
                {
                    nouveauAntec->pseudo_nombre[l]=tableau_des_tableaux_par_poids_initial[i][j].pseudo_nombre[l];
                }
                nouveauAntec->poids=tableau_des_tableaux_par_poids_initial[i][j].poids;
                nouveauAntec->impliquant_premier=1;//on prépare pour les étapes : on n'a pas encore montré qu'il ne l'était pas
                nouveauAntec->trinaire=antecedent_to_trinaire(nouveauAntec);
     
                nouveauL->antec=nouveauAntec;
                nouveauL->suivant=nouveauLL->antecL;
                nouveauLL->antecL=nouveauL;
     
            }
     
            if (HABLATIF>2)
            {
                printf("i=%d; Liste du poids ->",i);
                affiche_liste_de_antecedentL("",nouveauLL->antecL);
            }
     
            /* Insertion de l'élément au début de la liste */
            nouveauLL->suivant = premier_L1;
            premier_L1=nouveauLL;
        }
     
        if (HABLATIF>2)
        {
            affiche_liste_de_antecedentLL("liste L1:",premier_L1);
        }
     
        //fin création liste des antecédents de 1 par poids initial
     
        if (CALCULER_TAILLE_LISTES==1)
        {
            printf("avant la premiere passe, #L1=%d",cardinal_antecLL(premier_L1));
        }
     
     
        int continuer=1;
     
        while (continuer)
        {
            if (HABLATIF>0)
            {
               printf("debut passe");
            }
            continuer=0;
            premier_L2=NULL;
                        antecedentLL *antecLL_poids_p=premier_L1;
                            while (antecLL_poids_p!=NULL&&antecLL_poids_p->suivant!=NULL)   //on boucle sur les poids (remplace le for i)
                            {
                                antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
                                if (nouveauLL == NULL)
                                {
                                    exit(0);
                                }
                                nouveauLL->antecL = NULL;
     
                                antecedentL *antecL_poids_p=antecLL_poids_p->antecL;
                                antecedentL *antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
     
                                while (antecL_poids_p!=NULL)//on boucle sur les antécédent de poids p
                                {
                                    antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
                                    while(antecL_poids_pp1!=NULL)//on boucle sur les antécédent de poids p+1
                                    {
                                        int dif=difference_antecedents(antecL_poids_p->antec,antecL_poids_pp1->antec);
                                        if (dif>=0)     //si on a une diférence unique
                                        {
                                            continuer=1;
                                            antecL_poids_p->antec->impliquant_premier=0;      //on a pu regrouper : l'antécédent n'est pas premier
                                            antecL_poids_pp1->antec->impliquant_premier=0;    //on a pu regrouper : l'antécédent n'est pas premier
     
                                            antecedentL *nouveauL=malloc(sizeof(nouveauL));
                                            if (nouveauL == NULL)
                                            {
                                                exit(0);
                                            }
                                            antecedent *nouveauAntec=malloc(sizeof(antecedent));
                                            for(l=0;l<NOMBRE_DE_VAR;l++)
                                            {
                                                nouveauAntec->pseudo_nombre[l]=antecL_poids_p->antec->pseudo_nombre[l];
                                            }
                                            nouveauAntec->pseudo_nombre[dif]=2;
                                            nouveauAntec->poids=antecL_poids_p->antec->poids;
                                            nouveauAntec->impliquant_premier=1;
     
     
                                            nouveauL->antec=nouveauAntec;
                                            nouveauL->suivant=nouveauLL->antecL;
                                            nouveauLL->antecL=nouveauL;
     
     
                                        }
     
                                        antecL_poids_pp1=antecL_poids_pp1->suivant;
                                    }
                                    if (antecL_poids_p->antec->impliquant_premier==1)
                                    {
                                        if (HABLATIF>1)
                                        {
                                            affiche_antecedent("\nl'antecedent suivant est premier : ",*(antecL_poids_p->antec));
                                        }
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        if (0==verif_antec_deja_present_dans_antecedentL(premier_liste_impliquants_premiers,antecL_poids_p->antec))
                                        {
                                            antecedentL *nouvL=malloc(sizeof(antecedentL));
                                            antecedent *nouvAntec=malloc(sizeof(antecedent));
                                            nouvAntec->poids=antecL_poids_p->antec->poids;
                                            nouvAntec->impliquant_premier=1;
                                            for(i=0;i<NOMBRE_DE_VAR;i++)
                                            {
                                                nouvAntec->pseudo_nombre[i]=antecL_poids_p->antec->pseudo_nombre[i];
                                            }
                                            nouvL->antec=nouvAntec;
                                            nouvL->suivant=premier_liste_impliquants_premiers;
                                            premier_liste_impliquants_premiers=nouvL;
     
                                        }
     
     
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                    }
     
     
                                    antecL_poids_p=antecL_poids_p->suivant;
                                }
     
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
     
     
     
                                //affiche_liste_de_antecedentL("",nouveauLL->antecL);
     
                                // Insertion de l'élément au début de la liste
                                nouveauLL->suivant = premier_L2;
                                premier_L2=nouveauLL;
     
                                elimine_doublons_d_une_anteccedentL_rapide(&(premier_L2->antecL)); //élimination des doublons pour le poids p
     
                                antecLL_poids_p=antecLL_poids_p->suivant;
     
                            }
                            if (HABLATIF>2)
                            {
                                affiche_liste_de_antecedentLL("liste L2:",premier_L2);
                            }
     
     
     
     
     
            //premier_L1=premier_L2;   //à remplacer par une copie terme à terme pour remettre dans le bon ordre?
            premier_L1=NULL;
            antecedentLL *provvv;
     
            while (premier_L2!=NULL)
            {
                provvv=premier_L1;
                premier_L1=malloc(sizeof(antecedentLL));
                premier_L1->antecL=premier_L2->antecL;
                premier_L1->suivant=provvv;
     
                premier_L2=premier_L2->suivant;
            }
     
            if (HABLATIF>2)
            {
                affiche_liste_de_antecedentLL("liste L1:",premier_L1);
            }
            if (CALCULER_TAILLE_LISTES==1)
            {
                printf("\na la fin de l'etape : #L2=%d ; #impliq_prem_l=%d\n",cardinal_antecLL(premier_L1),cardinal_antecL(premier_liste_impliquants_premiers));
                tps=clock();
                printf("Temps d'execution = %d ms\n", tps);
            }
     
     
        }
     
     
        if (HABLATIF>0)
        {
            affiche_liste_de_antecedentL("\nles impliquants premiers sont:",premier_liste_impliquants_premiers);
        }
     
        tps=clock();
        printf("Temps d'execution = %d ms", tps);
        printf("\n#impliq_prem_l=%d",cardinal_antecL(premier_liste_impliquants_premiers));
     
        free(tableau_des_antecedents_de_un);
        return 0;
    }
     
     
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre)  //corecte
    {
        int prov=nombre;
    //printf("\nprov=%d",prov);
        int compteur;
        (*p_antecedent_a_initialiser).impliquant_premier=0;
        (*p_antecedent_a_initialiser).poids=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
     
            (*p_antecedent_a_initialiser).pseudo_nombre[NOMBRE_DE_VAR-compteur-1]=prov%2;
            (*p_antecedent_a_initialiser).poids= (*p_antecedent_a_initialiser).poids + (prov%2);
            prov=prov/2;
        }
    //    affiche_tableau_int("pseudo_nombre",NOMBRE_DE_VAR,*p_antecedent_a_initialiser.pseudo_nombre);
    //    printf("\npoids=%d",*p_antecedent_a_initialiser.poids);
    //affiche_antecedent("\n",*p_antecedent_a_initialiser);
    }
     
    int difference_antecedents(antecedent *antec1, antecedent *antec2)
    {
        int dif=0;
        int indexdif=0;
        int compteur=0;
        while (compteur<NOMBRE_DE_VAR&&dif<2)
        {
            if (antec1->pseudo_nombre[compteur]!=antec2->pseudo_nombre[compteur])
            {
                dif++;
                indexdif=compteur;
            }
     
            compteur++;
        }
     
        if (dif==1)
        {
            return indexdif;
        }
        else
        {
            return -1;
        }
    }
     
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL)
    {
        antecedentL *antecLp=antecL;
        int taille=0;
        while (antecLp!=NULL)  //on compte le nombre d'éléments de la liste
        {
            taille++;
            antecLp=antecLp->suivant;
        }
        int *tableau=malloc(taille*sizeof(int));
     
     
     
        int compteur,compteur2,pseudo_nbr_trinaire;  //on remplit un tableau avec les pseudo nombres en base 3
        antecLp=antecL;
        for(compteur=0;compteur<taille; compteur++)
        {
            pseudo_nbr_trinaire=0;
            for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
            {
                pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antecLp->antec->pseudo_nombre[compteur2];
            }
            tableau[compteur]=pseudo_nbr_trinaire;
            antecLp=antecLp->suivant;
        }
     
        antecLp=antecL;
        int t;
        for(compteur=0;compteur<taille-1;compteur++)
        {
            compteur2=0;
            t=tableau[compteur+1];
            while (compteur2<=compteur&&t!=tableau[compteur2])
            {
                compteur2++;
            }
            if (t==tableau[compteur2-1])
            {
                supprime_antecedent_dans_antecedentL(antecLp);
            }
            antecLp=antecLp->suivant;
        }
     
    }
     
    void supprime_antecedent_dans_antecedentL(antecedentL* antecL_m1)
    {
        antecedentL *antecL_0=antecL_m1->suivant;
        antecL_m1->suivant=antecL_0->suivant;
     
        free(antecL_0->antec);
        free(&antecL_0);
    }
     
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec)
    {
        int compteur,pseudo_nbr_trinaire;
        pseudo_nbr_trinaire=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
            pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antec->pseudo_nombre[compteur];
        }
        antecedentL *prov=antecL;
        int pseudo_nbr_trinaire_prov;
        while (prov!=NULL)
        {
            pseudo_nbr_trinaire_prov=0;
            for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
            {
                pseudo_nbr_trinaire_prov=3*pseudo_nbr_trinaire_prov+prov->antec->pseudo_nombre[compteur];
            }
     
            if (pseudo_nbr_trinaire==pseudo_nbr_trinaire_prov)
            {
                return 1;
            }
     
            prov=prov->suivant;
        }
        return 0;
    }
     
    int cardinal_antecL(antecedentL *premier)
    {
        antecedentL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur++;
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int cardinal_antecLL(antecedentLL *premier)
    {
        antecedentLL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur=compteur+cardinal_antecL(prem->antecL);
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int antecedent_to_trinaire(antecedent *antec)
    {
        int a;
        int s=0;
        for(a=0;a<NOMBRE_DE_VAR;a++)
        {
            s=3*s+antec->pseudo_nombre[a];
        }
        return s;
    }
     
    void decoupe_en_deux_pour_tri_fusion(antecedentL *premier,antecedentL **p_premier1,antecedentL **p_premier2)
    {
       // antecedentL *premier1=NULL;
       // antecedentL *premier2=NULL;
        antecedentL *prov=premier;
        int p=1;
        while (premier!=NULL)
        {
            prov=prov->suivant;
            if (p==1)
            {
                premier->suivant=*p_premier1;
                *p_premier1=premier;
            }
            else
            {
                premier->suivant=*p_premier2;
                *p_premier2=premier;
            }
            p=1-p;
     
            premier=prov;
        }
    }
    void fusion_listes_pour_tri_fusion(antecedentL *premier1,antecedentL *premier2, antecedentL **p_premier_fus)
    {
        *p_premier_fus=NULL;
        //printf("debut fusion\n");
        antecedentL *prov;
        int prem1trin;
        if (premier1==NULL)
        {
            *p_premier_fus=premier2;
        }
        else if (premier2==NULL)
        {
            *p_premier_fus=premier1;
        }
        else
        {
            prem1trin=premier1->antec->trinaire;
            if (prem1trin == premier2->antec->trinaire)
            {
                prov=premier1;
                premier1=premier1->suivant;
                premier2=premier2->suivant;
                while(premier1!=NULL&&premier1->antec->trinaire==prem1trin)
                {
                    premier1=premier1->suivant;
                }
                while(premier2!=NULL&&premier2->antec->trinaire==prem1trin)
                {
                    premier2=premier2->suivant;
                }
                fusion_listes_pour_tri_fusion(premier1,premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else if (premier1->antec->trinaire < premier2->antec->trinaire)
            {
                prov=premier1;
                fusion_listes_pour_tri_fusion(premier1->suivant,premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else
            {
                prov=premier2;
                fusion_listes_pour_tri_fusion(premier1,premier2->suivant,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
        }
     //   printf("fin fusion\n");
    }
     
     
    void elimine_doublons_d_une_anteccedentL_rapide(antecedentL **p_premier)
    {
      //  printf("debut elimine doublons");
      //  printf("avec *p_premier=%d et (*p_premier)->suivant=%d",*p_premier,(*p_premier)->suivant);
      //  affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        if (*p_premier!=NULL&&(*p_premier)->suivant!=NULL) //dans le cas contraire, on ne modifie pas la liste
        {
            antecedentL *null1=NULL;
            antecedentL *null2=NULL;
            antecedentL **p_prem1=&null1,**p_prem2=&null2;
            decoupe_en_deux_pour_tri_fusion(*p_premier,p_prem1,p_prem2);
      //      printf("\ndecoupe effectuee");
      //      affiche_liste_de_antecedentL("partie1",*p_prem1);
        //    affiche_liste_de_antecedentL("partie2",*p_prem2);
          //  printf("\n");
            elimine_doublons_d_une_anteccedentL_rapide(p_prem1);
            elimine_doublons_d_une_anteccedentL_rapide(p_prem2);
      //      printf("\nrecurence effectuee");
       //     affiche_liste_de_antecedentL("*p_prem1=",*p_prem1);
        //    affiche_liste_de_antecedentL("*p_prem2=",*p_prem1);
         //   printf("\n");
            fusion_listes_pour_tri_fusion(*p_prem1,*p_prem2,p_premier);////premier n'est pas modifié
         //   printf("fusion effectuee");
         //   affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        }
       // printf("fin elimine doublons\n");
    }
     
     
     
    //fonctions d'affichage
     
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->%d\n",compteur,tableau[compteur]);
        }
        printf("\n\n");
    }
     
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->",compteur);
            affiche_antecedent(" ",tableau[compteur]);
        }
    }
     
    void affiche_antecedent(char *nom, antecedent antec)
    {
        int compteur2;
        printf("\n%s : ",nom);
        printf("poids=%d, impl prem=%d, pseudo_nbr=",antec.poids,antec.impliquant_premier);
        for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
        {
            printf("%d",antec.pseudo_nombre[compteur2]);
        }
        printf("\n");
    }
     
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_de_tableaux;compteur++)
        {
            printf("poids %d",compteur);
            affiche_tableau_antecedent(" ",tableau_du_nombre_d_elements_de_chaque_tableau[compteur],tableau[compteur]);
        }
    }
     
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier)
    {
        printf("\n%s\n",nom);
        antecedentL *pointeur=premier;
        int x=0;
        while (pointeur!=NULL)
        {
            printf("antecedent n %d ->",x);
            affiche_antecedent("",*(pointeur->antec));
            x++;
            pointeur=pointeur->suivant;
        }
    }
     
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier)
    {
        printf("\n%s\n",nom);
        antecedentLL *pointeur=premier;
        while (pointeur!=NULL)
        {
            affiche_liste_de_antecedentL("",(pointeur->antecL));
            pointeur=pointeur->suivant;
        }
    }
    le #define HABLATIF 0 se trouve ligne 19, le if dont je parle ligne 269 et l'affichage se fait lignes 428-429.

    Quelcun pourrait-il SVP m'expliquer d'où viens ce "bug" et comment le corriger (sauf en laissant le printf dans tous les cas)?
    Merci d'avance

    katorps

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par katorps Voir le message
    En effet, si je ne laisse que la ligne avec le printf, le résultat est correct même pour HABLATIF=0 !!!
    Si je ne laisse que la ligne avec le printf et que je remplace "debut passe" par "de", ça marche encore, mais
    si je ne laisse que la ligne avec le printf et que je remplace "debut passe" par "d", ça marche plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void supprime_antecedent_dans_antecedentL(antecedentL* antecL_m1)
    {
        antecedentL *antecL_0=antecL_m1->suivant;
        antecL_m1->suivant=antecL_0->suivant;
    
        free(antecL_0->antec);
        free(&antecL_0);
    }
    Je n'y comprend plus rien...
    Bonjour
    Tu es dans le cas typique du "comportement indéterminé". Quelque part tu fais quelque chose d'illégal mais ça ne fait pas planter le programme. Ca produit juste un comportement inprévisible qui, ici, fonctionne quand il y a un printf() précis.
    Laisser le printf() ne règlera pas le problème car ce comportement peut se retrouver si tu rajoutes une ligne, une fonction ou autre. La seule solution est de tout vérifier. Accessoirement je suis étonné que tu nous présentes ce code comme correct car chez-moi il me met un warning sur le second free (en rouge). T'es sûr qu'il faut l'adresse d'une adresse ici ???

    Donc corrige cette ligne. Ensuite vérifie ton code. Par exemple je n'ai vu nulle-part l'initialisation des suivants à NULL. Pourtant faut bien que tu le fasses surtout qu'à certains moments tu cherches ce NULL...

    Autres remarques: absolument rien ne justifie l'utilisation d'une seule de toutes ces globales. Leurs seul rôle ici est de pourrir encore plus ton code. Et on ne quitte pas une fonction par exit(). On remonte proprement l'erreur à l'appelant qui gèrera ou qui, de son coté, la remontera à l'appelant et etc jusqu'au main() qui pourra alors nettoyer les allocations résiduelles avant de quitter.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Rebonjour,
    merci beaucoup pour tes réponses.
    pour le free, il y avait bien ce warning que je n'avais ni mentionné, ni corrigé (maintenant c'est fait, ça n'a rien changé).
    Je me suis également occupé de l'initialisation des suivants à NULL (c'est vrai que ça peut servir ...).

    Pour les variables globales, je sais que ce n'est pas bien, mais les mauvaises habitudes sont dur à perdre (j'ai surtout fait de la programmation sur calculatrice dans ma vie, où toutes les variables sont globales). Sans compter que pour un débutant (comme moi), ça semble compliquer le programme plus qu'autre chose (il faut toujours les fournir en plus en arguments aux fonctions qui en ont besoin, voir créer des pointeurs dessus pour que ces fonctions puissent les modifier). Mais je vais essayer de les enlever si tu pense que ça simplifiera les choses.

    Pour les exit, la question semble ne pas trop se poser vu qu'ils se situent déjà dans le main. Mais j'essayerais à l'avenir de penser à les remplacer par l'affichage d'un message d'erreur et d'un return.

    Pour le nettoyage des allocations résiduelles, c'est la prochaine étape que j'avais prévu, une fois assuré du bon fonctionnement de la partie du programme déjà écrite (ce qui n'est malheureusement pas le cas). Après, si vous pensez que cela pourrait être une cause du bug, alors je m'en occupe de suite.


    Par contre, pour trouver l'origine du bug, je ne vois toujours pas comment le repérer, vue que toutes les techniques que j'utilise habituellement semblent inadaptées (repérer l'endroit du bug avec le débogueur, suivre l'état des variables en causes avec le débogueur ou ds printf pour trouver à partir de quand leur valeur est erronée).
    Je vais donc continuer à relire le code, même si je crains de ne pas avoir le niveau nécessaire pour que les étourderies me sautent aux yeux si je n'ai pas auparavant réussit à cerner précisément leur emplacement.

    Si quelqu’un a une idée de l'origine du code, ou du type d'erreur qu'il serrait utile de vérifier de manière plus ciblé, je lui en serait très reconnaissant.
    Merci d'avance
    katorps

    edit : j'oubliais : voici le code avec les quelques modifications effectuées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    /*à faire
    -copie terme à terme de L2 dans L1 pour rétablir l'ordre croissant de poids
    -récupérer les antécédents premiers + décocher l'option non premier à la fin des étapes
    -suprimer proprement les listes plus utilisées
     
     
     
    -élimination des doublons dans la liste L2 : gain en performance?
    */
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
     
    //paramètres et entrées
    #define HABLATIF 0 //0 : que les durées ; 1 : + impliquants 1ers à la fin ; 2 :+ impliquants 1ers au fur et à mesure; 3: tout
    #define CALCULER_TAILLE_LISTES 0  //si =1 : calcule la taille de L2 et de la liste des impliquants permiers à la fin de chaque étape et les affiche
    #define NOMBRE_DE_VAR 4
    #define NOMBRE_DE_VAR_PLUS_UN 5            //la ligne précédente +1
    #define DEUX_PUISSANCE_NBR_VAR 2*2*2*2  //nombre_de_var 2
    #define DEUX_PUISSANCE_DEMI_NBR_VAR 2*2  //nombre_de_var/2 2 (arrondir à l'inférieur)
    int table_de_verite[DEUX_PUISSANCE_NBR_VAR];
    //fin paramètres et entrées
     
    typedef struct antecedent antecedent;
    struct antecedent
    {
        int pseudo_nombre[NOMBRE_DE_VAR];
        int poids;
        int impliquant_premier;
        int trinaire;
    };
     
    typedef struct antecedentL antecedentL;
    struct antecedentL
    {
        antecedent *antec;
        antecedentL *suivant;
    };
     
    typedef struct antecedentLL antecedentLL;
    struct antecedentLL
    {
        antecedentL *antecL;
        antecedentLL *suivant;
    };
     
    int remplit_case_table_de_verite(int nbr_var, int i);
    int remplit_case_table_de_verite(int nbr_var, int i)
    {
        //i(binaire)= (r.)b0. ... .bk.a0. ... . ak où k=n/2
        int n=nbr_var;
        int a=0;
        int b=0;
        int r=(n%2)*(i%2);
        n=n/2;
        int x=i;
        int j;
        for(j=0;j<n;j++)
        {
            a=2*a+(x%2);
            x=x/2;
        }
        for(j=0;j<n;j++)
        {
            b=2*b+(x%2);
            x=x/2;
        }
        x=r+a+b;  //x résultat en binaire
        int dpdnv=DEUX_PUISSANCE_DEMI_NBR_VAR;
        return (x/dpdnv);
    }
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre);
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau);
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau);
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau);
    void affiche_antecedent(char *nom, antecedent antec);
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier);
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier);
    int difference_antecedents(antecedent* antec1, antecedent* antec2);
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL);
    void supprime_antecedent_dans_antecedentL(antecedentL *antecL_m1);
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec);
    int cardinal_antecL(antecedentL *premier);
    int cardinal_antecLL(antecedentLL *premier);
    void elimine_doublons_d_une_anteccedentL_rapide(antecedentL **p_premier);
    void decoupe_en_deux_pour_tri_fusion(antecedentL *premier,antecedentL **p_premier1,antecedentL **p_premier2);
    void fusion_listes_pour_tri_fusion(antecedentL *premier1,antecedentL *premier2, antecedentL **p_premier_fus);
    int antecedent_to_trinaire(antecedent *antec);
     
    int nombre_de_un=0;
    antecedent *tableau_des_antecedents_de_un=NULL;
    antecedentLL *premier_L1=NULL;
    antecedentLL *premier_L2=NULL;
    antecedentL *premier_liste_impliquants_premiers=NULL;
     
    antecedent *tableau_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN];
    int tableau_des_tailles_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN]; //  contient la taille des tableaux formant les elements du tableau déclaré la ligne au-dessus
     
     
    int taille_table_verite;
    //variables muettes
    int i,j,k,l,m,n;
    int tps;
    int tabl_prov[NOMBRE_DE_VAR_PLUS_UN];
    antecedentLL *p_antecLL=NULL;  //pointeur muet sur un antecendentLL
    //fin variables muettes
     
     
    int main()
    {
        for(i=0;i<DEUX_PUISSANCE_NBR_VAR;i++)
        {
            table_de_verite[i]=remplit_case_table_de_verite(NOMBRE_DE_VAR,i);
        }
     
        //début calcul nombre d'antécédents de 1
        taille_table_verite=pow(2,NOMBRE_DE_VAR);
     
     
     
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                nombre_de_un++;
            }
        }
        //fin calcul nombre d'antécédents de 1
        //début tableau antécédents de 1
        if (HABLATIF>2)
        {
            affiche_tableau_int("table_de_verite",taille_table_verite,table_de_verite);
            printf("nbr_de_un=%d\n",nombre_de_un);
        }
       tableau_des_antecedents_de_un = malloc(sizeof(antecedent)*nombre_de_un);
        if (tableau_des_antecedents_de_un == NULL) // Si l'allocation a échoué
        {
            exit(0); // On arrête immédiatement le programme
        }
        k=0;  //poiteur sur la position du prochain antécédent de 1 à placer.
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                initialisation_structure_antecedent(&tableau_des_antecedents_de_un[k],i);
              //  affiche_antecedent("\n",tableau_des_antecedents_de_un[k]);
                k++;
            }
        }
        if (HABLATIF>2)
        {
            affiche_tableau_antecedent("tableau initial",nombre_de_un,tableau_des_antecedents_de_un);
        }
        //fin tableau antécédents de 1
     
        //début création tableau ordonnée par poids des antécédents de 1
        for(i=0;i<=NOMBRE_DE_VAR;i++)  //i représente le poids dans cette boucle
        {
            k=0;                          //k représente le nombre d'antécédents de 1 de poids i trouvés
            for(j=0;j<nombre_de_un;j++)
            {
                if (tableau_des_antecedents_de_un[j].poids==i)
                {
                    k++;
                }
            }
            tableau_des_tableaux_par_poids_initial[i]=NULL;
            tableau_des_tableaux_par_poids_initial[i]=malloc(k*sizeof(antecedent));
            if (tableau_des_tableaux_par_poids_initial[i]==NULL)  //s'il n'y a plus de place en mémoire
            {
                exit(0);
            }
            tableau_des_tailles_des_tableaux_par_poids_initial[i]=k;   //on mémorise le nombre d'antécédents de poids i
            //on a créé le tableau des antécédents de poids i
            tabl_prov[i]=0;//on en profite pour initialiser le tableau provisoire qui servira juste après
        }
        //on viens de créer les tableaux des antécédents de poids i pour tout les i
     
        for(i=0;i<nombre_de_un;i++)//remplissage des nouveaux tableaux
        {
            k=tableau_des_antecedents_de_un[i].poids;                       //k=poids de l'élément i
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].poids=k;
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].impliquant_premier=0;
            for(j=0;j<NOMBRE_DE_VAR;j++)
            {
                tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].pseudo_nombre[j]=tableau_des_antecedents_de_un[i].pseudo_nombre[j];
            }
            tabl_prov[k]++;
        }
        if (HABLATIF>2)
        {
            affiche_tableau_des_tableaux_des_antecedent_par_poids("tableau_des_tableaux_par_poids_initial",NOMBRE_DE_VAR_PLUS_UN,tableau_des_tailles_des_tableaux_par_poids_initial,tableau_des_tableaux_par_poids_initial);
        }
        //fin création tableau ordonnée par poids des antécédents de 1
     
     
     
        //début création liste des antecédents de 1 par poids initial
        p_antecLL=premier_L1;
        if (HABLATIF>2)
        {
            printf("\n\n\n\n");
        }
        for(i=0;i<NOMBRE_DE_VAR+1;i++)
        {
            antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
            if (nouveauLL == NULL)
            {
                exit(0);
            }
            nouveauLL->antecL = NULL;
            nouveauLL->suivant = NULL;
            k=tableau_des_tailles_des_tableaux_par_poids_initial[i];  //k=nombre d'antecedents de poids i
            for(j=0;j<k;j++)//j : numéreau de l'antecedent de poids i dans le tableau des antecedents de poids i
            {
                antecedentL *nouveauL=malloc(sizeof(nouveauL));
                if (nouveauL == NULL)
                {
                    exit(0);
                }
                nouveauL->suivant=NULL;
                antecedent *nouveauAntec=malloc(sizeof(antecedent));
                for(l=0;l<NOMBRE_DE_VAR;l++)
                {
                    nouveauAntec->pseudo_nombre[l]=tableau_des_tableaux_par_poids_initial[i][j].pseudo_nombre[l];
                }
                nouveauAntec->poids=tableau_des_tableaux_par_poids_initial[i][j].poids;
                nouveauAntec->impliquant_premier=1;//on prépare pour les étapes : on n'a pas encore montré qu'il ne l'était pas
                nouveauAntec->trinaire=antecedent_to_trinaire(nouveauAntec);
     
                nouveauL->antec=nouveauAntec;
                nouveauL->suivant=nouveauLL->antecL;
                nouveauLL->antecL=nouveauL;
     
            }
     
            if (HABLATIF>2)
            {
                printf("i=%d; Liste du poids ->",i);
                affiche_liste_de_antecedentL("",nouveauLL->antecL);
            }
     
            /* Insertion de l'élément au début de la liste */
            nouveauLL->suivant = premier_L1;
            premier_L1=nouveauLL;
        }
     
        if (HABLATIF>2)
        {
            affiche_liste_de_antecedentLL("liste L1:",premier_L1);
        }
     
        //fin création liste des antecédents de 1 par poids initial
     
        if (CALCULER_TAILLE_LISTES==1)
        {
            printf("avant la premiere passe, #L1=%d",cardinal_antecLL(premier_L1));
        }
     
     
        int continuer=1;
     
        while (continuer)
        {
            if (HABLATIF>0)
            {
               printf("debut passe");
            }
            continuer=0;
            premier_L2=NULL;
                        antecedentLL *antecLL_poids_p=premier_L1;
                            while (antecLL_poids_p!=NULL&&antecLL_poids_p->suivant!=NULL)   //on boucle sur les poids (remplace le for i)
                            {
                                antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
                                nouveauLL->suivant=NULL;
                                if (nouveauLL == NULL)
                                {
                                    exit(0);
                                }
                                nouveauLL->antecL = NULL;
     
                                antecedentL *antecL_poids_p=antecLL_poids_p->antecL;
                                antecedentL *antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
     
                                while (antecL_poids_p!=NULL)//on boucle sur les antécédent de poids p
                                {
                                    antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
                                    while(antecL_poids_pp1!=NULL)//on boucle sur les antécédent de poids p+1
                                    {
                                        int dif=difference_antecedents(antecL_poids_p->antec,antecL_poids_pp1->antec);
                                        if (dif>=0)     //si on a une diférence unique
                                        {
                                            continuer=1;
                                            antecL_poids_p->antec->impliquant_premier=0;      //on a pu regrouper : l'antécédent n'est pas premier
                                            antecL_poids_pp1->antec->impliquant_premier=0;    //on a pu regrouper : l'antécédent n'est pas premier
     
                                            antecedentL *nouveauL=malloc(sizeof(nouveauL));
                                            if (nouveauL == NULL)
                                            {
                                                exit(0);
                                            }
                                            nouveauL->suivant=NULL;
                                            antecedent *nouveauAntec=malloc(sizeof(antecedent));
                                            for(l=0;l<NOMBRE_DE_VAR;l++)
                                            {
                                                nouveauAntec->pseudo_nombre[l]=antecL_poids_p->antec->pseudo_nombre[l];
                                            }
                                            nouveauAntec->pseudo_nombre[dif]=2;
                                            nouveauAntec->poids=antecL_poids_p->antec->poids;
                                            nouveauAntec->impliquant_premier=1;
     
     
                                            nouveauL->antec=nouveauAntec;
                                            nouveauL->suivant=nouveauLL->antecL;
                                            nouveauLL->antecL=nouveauL;
     
     
                                        }
     
                                        antecL_poids_pp1=antecL_poids_pp1->suivant;
                                    }
                                    if (antecL_poids_p->antec->impliquant_premier==1)
                                    {
                                        if (HABLATIF>1)
                                        {
                                            affiche_antecedent("\nl'antecedent suivant est premier : ",*(antecL_poids_p->antec));
                                        }
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        if (0==verif_antec_deja_present_dans_antecedentL(premier_liste_impliquants_premiers,antecL_poids_p->antec))
                                        {
                                            antecedentL *nouvL=malloc(sizeof(antecedentL));
                                            nouvL->suivant=NULL;
                                            antecedent *nouvAntec=malloc(sizeof(antecedent));
                                            nouvAntec->poids=antecL_poids_p->antec->poids;
                                            nouvAntec->impliquant_premier=1;
                                            for(i=0;i<NOMBRE_DE_VAR;i++)
                                            {
                                                nouvAntec->pseudo_nombre[i]=antecL_poids_p->antec->pseudo_nombre[i];
                                            }
                                            nouvL->antec=nouvAntec;
                                            nouvL->suivant=premier_liste_impliquants_premiers;
                                            premier_liste_impliquants_premiers=nouvL;
     
                                        }
     
     
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                    }
     
     
                                    antecL_poids_p=antecL_poids_p->suivant;
                                }
     
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
     
     
     
                                //affiche_liste_de_antecedentL("",nouveauLL->antecL);
     
                                // Insertion de l'élément au début de la liste
                                nouveauLL->suivant = premier_L2;
                                premier_L2=nouveauLL;
     
                                elimine_doublons_d_une_anteccedentL_rapide(&(premier_L2->antecL)); //élimination des doublons pour le poids p
     
                                antecLL_poids_p=antecLL_poids_p->suivant;
     
                            }
                            if (HABLATIF>2)
                            {
                                affiche_liste_de_antecedentLL("liste L2:",premier_L2);
                            }
     
     
     
     
     
            //premier_L1=premier_L2;   //à remplacer par une copie terme à terme pour remettre dans le bon ordre?
            premier_L1=NULL;
            antecedentLL *provvv=NULL;
     
            while (premier_L2!=NULL)
            {
                provvv=premier_L1;
                premier_L1=malloc(sizeof(antecedentLL));
                premier_L1->antecL=premier_L2->antecL;
                premier_L1->suivant=provvv;
     
                premier_L2=premier_L2->suivant;
            }
     
            if (HABLATIF>2)
            {
                affiche_liste_de_antecedentLL("liste L1:",premier_L1);
            }
            if (CALCULER_TAILLE_LISTES==1)
            {
                printf("\na la fin de l'etape : #L2=%d ; #impliq_prem_l=%d\n",cardinal_antecLL(premier_L1),cardinal_antecL(premier_liste_impliquants_premiers));
                tps=clock();
                printf("Temps d'execution = %d ms\n", tps);
            }
     
     
        }
     
     
        if (HABLATIF>0)
        {
            affiche_liste_de_antecedentL("\nles impliquants premiers sont:",premier_liste_impliquants_premiers);
        }
     
        tps=clock();
        printf("Temps d'execution = %d ms", tps);
        printf("\n#impliq_prem_l=%d",cardinal_antecL(premier_liste_impliquants_premiers));
     
        free(tableau_des_antecedents_de_un);
        return 0;
    }
     
     
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre)  //corecte
    {
        int prov=nombre;
    //printf("\nprov=%d",prov);
        int compteur;
        (*p_antecedent_a_initialiser).impliquant_premier=0;
        (*p_antecedent_a_initialiser).poids=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
     
            (*p_antecedent_a_initialiser).pseudo_nombre[NOMBRE_DE_VAR-compteur-1]=prov%2;
            (*p_antecedent_a_initialiser).poids= (*p_antecedent_a_initialiser).poids + (prov%2);
            prov=prov/2;
        }
    //    affiche_tableau_int("pseudo_nombre",NOMBRE_DE_VAR,*p_antecedent_a_initialiser.pseudo_nombre);
    //    printf("\npoids=%d",*p_antecedent_a_initialiser.poids);
    //affiche_antecedent("\n",*p_antecedent_a_initialiser);
    }
     
    int difference_antecedents(antecedent *antec1, antecedent *antec2)
    {
        int dif=0;
        int indexdif=0;
        int compteur=0;
        while (compteur<NOMBRE_DE_VAR&&dif<2)
        {
            if (antec1->pseudo_nombre[compteur]!=antec2->pseudo_nombre[compteur])
            {
                dif++;
                indexdif=compteur;
            }
     
            compteur++;
        }
     
        if (dif==1)
        {
            return indexdif;
        }
        else
        {
            return -1;
        }
    }
     
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL)
    {
        antecedentL *antecLp=antecL;
        int taille=0;
        while (antecLp!=NULL)  //on compte le nombre d'éléments de la liste
        {
            taille++;
            antecLp=antecLp->suivant;
        }
        int *tableau=malloc(taille*sizeof(int));
     
     
     
        int compteur,compteur2,pseudo_nbr_trinaire;  //on remplit un tableau avec les pseudo nombres en base 3
        antecLp=antecL;
        for(compteur=0;compteur<taille; compteur++)
        {
            pseudo_nbr_trinaire=0;
            for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
            {
                pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antecLp->antec->pseudo_nombre[compteur2];
            }
            tableau[compteur]=pseudo_nbr_trinaire;
            antecLp=antecLp->suivant;
        }
     
        antecLp=antecL;
        int t;
        for(compteur=0;compteur<taille-1;compteur++)
        {
            compteur2=0;
            t=tableau[compteur+1];
            while (compteur2<=compteur&&t!=tableau[compteur2])
            {
                compteur2++;
            }
            if (t==tableau[compteur2-1])
            {
                supprime_antecedent_dans_antecedentL(antecLp);
            }
            antecLp=antecLp->suivant;
        }
     
    }
     
    void supprime_antecedent_dans_antecedentL(antecedentL* antecL_m1)
    {
        antecedentL *antecL_0=antecL_m1->suivant;
        antecL_m1->suivant=antecL_0->suivant;
     
        free(antecL_0->antec);
        free(antecL_0);
    }
     
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec)
    {
        int compteur,pseudo_nbr_trinaire;
        pseudo_nbr_trinaire=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
            pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antec->pseudo_nombre[compteur];
        }
        antecedentL *prov=antecL;
        int pseudo_nbr_trinaire_prov;
        while (prov!=NULL)
        {
            pseudo_nbr_trinaire_prov=0;
            for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
            {
                pseudo_nbr_trinaire_prov=3*pseudo_nbr_trinaire_prov+prov->antec->pseudo_nombre[compteur];
            }
     
            if (pseudo_nbr_trinaire==pseudo_nbr_trinaire_prov)
            {
                return 1;
            }
     
            prov=prov->suivant;
        }
        return 0;
    }
     
    int cardinal_antecL(antecedentL *premier)
    {
        antecedentL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur++;
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int cardinal_antecLL(antecedentLL *premier)
    {
        antecedentLL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur=compteur+cardinal_antecL(prem->antecL);
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int antecedent_to_trinaire(antecedent *antec)
    {
        int a;
        int s=0;
        for(a=0;a<NOMBRE_DE_VAR;a++)
        {
            s=3*s+antec->pseudo_nombre[a];
        }
        return s;
    }
     
    void decoupe_en_deux_pour_tri_fusion(antecedentL *premier,antecedentL **p_premier1,antecedentL **p_premier2)
    {
       // antecedentL *premier1=NULL;
       // antecedentL *premier2=NULL;
        antecedentL *prov=premier;
        int p=1;
        while (premier!=NULL)
        {
            prov=prov->suivant;
            if (p==1)
            {
                premier->suivant=*p_premier1;
                *p_premier1=premier;
            }
            else
            {
                premier->suivant=*p_premier2;
                *p_premier2=premier;
            }
            p=1-p;
     
            premier=prov;
        }
    }
    void fusion_listes_pour_tri_fusion(antecedentL *premier1,antecedentL *premier2, antecedentL **p_premier_fus)
    {
        *p_premier_fus=NULL;
        //printf("debut fusion\n");
        antecedentL *prov=NULL;
        int prem1trin;
        if (premier1==NULL)
        {
            *p_premier_fus=premier2;
        }
        else if (premier2==NULL)
        {
            *p_premier_fus=premier1;
        }
        else
        {
            prem1trin=premier1->antec->trinaire;
            if (prem1trin == premier2->antec->trinaire)
            {
                prov=premier1;
                premier1=premier1->suivant;
                premier2=premier2->suivant;
                while(premier1!=NULL&&premier1->antec->trinaire==prem1trin)
                {
                    premier1=premier1->suivant;
                }
                while(premier2!=NULL&&premier2->antec->trinaire==prem1trin)
                {
                    premier2=premier2->suivant;
                }
                fusion_listes_pour_tri_fusion(premier1,premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else if (premier1->antec->trinaire < premier2->antec->trinaire)
            {
                prov=premier1;
                fusion_listes_pour_tri_fusion(premier1->suivant,premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else
            {
                prov=premier2;
                fusion_listes_pour_tri_fusion(premier1,premier2->suivant,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
        }
     //   printf("fin fusion\n");
    }
     
     
    void elimine_doublons_d_une_anteccedentL_rapide(antecedentL **p_premier)
    {
      //  printf("debut elimine doublons");
      //  printf("avec *p_premier=%d et (*p_premier)->suivant=%d",*p_premier,(*p_premier)->suivant);
      //  affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        if (*p_premier!=NULL&&(*p_premier)->suivant!=NULL) //dans le cas contraire, on ne modifie pas la liste
        {
            antecedentL *null1=NULL;
            antecedentL *null2=NULL;
            antecedentL **p_prem1=&null1,**p_prem2=&null2;
            decoupe_en_deux_pour_tri_fusion(*p_premier,p_prem1,p_prem2);
      //      printf("\ndecoupe effectuee");
      //      affiche_liste_de_antecedentL("partie1",*p_prem1);
        //    affiche_liste_de_antecedentL("partie2",*p_prem2);
          //  printf("\n");
            elimine_doublons_d_une_anteccedentL_rapide(p_prem1);
            elimine_doublons_d_une_anteccedentL_rapide(p_prem2);
      //      printf("\nrecurence effectuee");
       //     affiche_liste_de_antecedentL("*p_prem1=",*p_prem1);
        //    affiche_liste_de_antecedentL("*p_prem2=",*p_prem1);
         //   printf("\n");
            fusion_listes_pour_tri_fusion(*p_prem1,*p_prem2,p_premier);////premier n'est pas modifié
         //   printf("fusion effectuee");
         //   affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        }
       // printf("fin elimine doublons\n");
    }
     
     
     
    //fonctions d'affichage
     
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->%d\n",compteur,tableau[compteur]);
        }
        printf("\n\n");
    }
     
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->",compteur);
            affiche_antecedent(" ",tableau[compteur]);
        }
    }
     
    void affiche_antecedent(char *nom, antecedent antec)
    {
        int compteur2;
        printf("\n%s : ",nom);
        printf("poids=%d, impl prem=%d, pseudo_nbr=",antec.poids,antec.impliquant_premier);
        for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
        {
            printf("%d",antec.pseudo_nombre[compteur2]);
        }
        printf("\n");
    }
     
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_de_tableaux;compteur++)
        {
            printf("poids %d",compteur);
            affiche_tableau_antecedent(" ",tableau_du_nombre_d_elements_de_chaque_tableau[compteur],tableau[compteur]);
        }
    }
     
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier)
    {
        printf("\n%s\n",nom);
        antecedentL *pointeur=premier;
        int x=0;
        while (pointeur!=NULL)
        {
            printf("antecedent n %d ->",x);
            affiche_antecedent("",*(pointeur->antec));
            x++;
            pointeur=pointeur->suivant;
        }
    }
     
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier)
    {
        printf("\n%s\n",nom);
        antecedentLL *pointeur=premier;
        while (pointeur!=NULL)
        {
            affiche_liste_de_antecedentL("",(pointeur->antecL));
            pointeur=pointeur->suivant;
        }
    }

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par katorps Voir le message
    Je me suis également occupé de l'initialisation des suivants à NULL (c'est vrai que ça peut servir ...).
    Non, c'est pas que ça peut servir, c'est que sans ça ça ne peut pas marcher. Tu ne peux pas chercher le dernier élément de ta liste si cet élément n'a pas de pointeur next à NULL.
    En fait, il y a une règle très simple en prog: tu ne dois jamais lire une variable qui n'a pas été écrite au préalable.

    Citation Envoyé par katorps Voir le message
    Pour les exit, la question semble ne pas trop se poser vu qu'ils se situent déjà dans le main.
    Me semble en avoir vu dans les fonctions (après les malloc)...

    Citation Envoyé par katorps Voir le message
    Par contre, pour trouver l'origine du bug, je ne vois toujours pas comment le repérer, vue que toutes les techniques que j'utilise habituellement semblent inadaptées (repérer l'endroit du bug avec le débogueur, suivre l'état des variables en causes avec le débogueur ou ds printf pour trouver à partir de quand leur valeur est erronée).
    Le problème c'est que je ne vois pas à quoi peut servir ce code. Et donc ni pourquoi tu utilises une liste pour gérer différentes listes. Et donc je ne sais pas, quand je l'exécute, si ce qu'il affiche est correct ou pas.

    Un des moyens de trouver le bug est de cibler chaque fonction une à une voir si elle renvoie bien ce qui est prévu...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Rebonjour,
    merci pour ta réponse.
    pour les suivant non initialisés, c'était de l'ironie envers moi même (désolé si ce n'était pas clair).

    sinon, après des modifications (qui à priori ne me semblent pas avoir de raison de résoudre le problème), le programme marche pour l'instant de nouveau comme il faut. Après, je ne vois pas comment savoir si c'est que j'ai résolu le bug sans m'en rendre compte ou si je suis simplement tombé sur un coup de "chance" avec le programme ayant toujours un comportement indéterminé

    sinon, pour le code, il s'agit du début de l'algorithme de Quine McCluskey servant à trouver la forme canonique disjonctive la plus simple d'une fonction logique.
    le principe est le suivant:
    1)on trouve tous les antécédents de 1 par la fonction logique (d'où le nom antecedent de mes structures).
    2)On les écrit sous forme binaire (par exemple A.nonB.C devient 101)
    3)on les classe selon le nombre de 1 qu'ils contiennent (le poids) : c'est ce classement qui explique mes listes de listes : les antecedentLL contiennent les antecedentL des antecedents de même poids
    4)on regroupe de toutes les manières possibles les antécédents différant d'un seul chiffre (qu'on remplace par x (2 dans le programme)) : si A.nonB.C et A.B.C sont deux antécédents de 1, alors A.C est antécédent de 1, ce que l'on note "si 101 et 111 sont des antécédents de 1, alors 1x1 est antécédent de 1 (représenté par 121 dans le programme)
    5)si un antécédent de 1 n'a pu être regroupé avec aucun autre, alors on l'appelle impliquant premier (et on le rajoute dans l'antecedentL premier_liste_impliquants_premiers) : c'est ce que l'on veut récupérer
    6)on répète les étapes 4 et 5 jusqu'à ce qu'il n'y ait plus de regroupements possibles (donc plus d'ajout d’antécédents premiers)

    7)encore non programmé : on utilise les impliquants premiers pour re-écrire la fonction logique (ils suffisent à couvrir tous les antécédents, même s'il faut encore éliminer les superflus.

    Je remets le code dans l'état actuel (dans lequel je me suis débarrassé des variables globales, j'ai rapidement commenté (au niveau du prototype) l'effet de chaque fonction, ainsi que corrigé 2-3 petites erreurs qui ne semblaient pas avoir d'impact pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    /*à faire
    -copie terme à terme de L2 dans L1 pour rétablir l'ordre croissant de poids
    -récupérer les antécédents premiers + décocher l'option non premier à la fin des étapes
    -suprimer proprement les listes plus utilisées
     
     
     
    -calculer les pseudo-nombres trinaires au fur et à mesure de la création/modification des antecedents, au lieux de le faire dans les fonctions le nécssitant
    */
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
     
    //paramètres et entrées
    #define HABLATIF 0 //0 : que les durées ; 1 : + impliquants 1ers à la fin ; 2 :+ impliquants 1ers au fur et à mesure; 3: tout
    #define CALCULER_TAILLE_LISTES 0  //si =1 : calcule la taille de L2 et de la liste des impliquants permiers à la fin de chaque étape et les affiche
    #define NOMBRE_DE_VAR 4
    #define NOMBRE_DE_VAR_PLUS_UN 5            //la ligne précédente +1
    #define DEUX_PUISSANCE_NBR_VAR 2*2*2*2  //nombre_de_var 2
    #define DEUX_PUISSANCE_DEMI_NBR_VAR 2*2  //nombre_de_var/2 2 (arrondir à l'inférieur)
    //fin paramètres et entrées
     
    typedef struct antecedent antecedent;
    struct antecedent
    {
        int pseudo_nombre[NOMBRE_DE_VAR];
        int poids;
        int impliquant_premier;
        int trinaire;
    };
     
    typedef struct antecedentL antecedentL;
    struct antecedentL
    {
        antecedent *antec;
        antecedentL *suivant;
    };
     
    typedef struct antecedentLL antecedentLL;
    struct antecedentLL
    {
        antecedentL *antecL;
        antecedentLL *suivant;
    };
     
    int remplit_case_table_de_verite(int nbr_var, int i); //cette fonction est en quelques sorte "l'entrée" du programme : elle définit la fonction logique à simplifier (ici l'adition)
    int remplit_case_table_de_verite(int nbr_var, int i)
    {
        //i(binaire)= (r.)b0. ... .bk.a0. ... . ak où k=n/2
        int n=nbr_var;
        int a=0;
        int b=0;
        int r=(n%2)*(i%2);
        n=n/2;
        int x=i;
        int j;
        for(j=0;j<n;j++)
        {
            a=2*a+(x%2);
            x=x/2;
        }
        for(j=0;j<n;j++)
        {
            b=2*b+(x%2);
            x=x/2;
        }
        x=r+a+b;  //x résultat en binaire
        int dpdnv=DEUX_PUISSANCE_DEMI_NBR_VAR;
        return (x/dpdnv);
    }
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre); //initialise une structure antecedent (décomposition en binaire, poids (nombre de 1), impliquant premier =1 (on ne l'a pas utilisé pour l'instant), trinaire (le nombre binaire considéré comme trinaire)
    int difference_antecedents(antecedent* antec1, antecedent* antec2);//compare les 2 pseudo-nombres : si ils sont egaux ou diffèrent de 2 cases ou plus, alors renvoie -1; s'ils diffèrent au niveau d'un seul indice, renvoie cet indice
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL);//supprime les doublons (ie même pseudo-nombre ie même trinaire) : version simple peu optimisée : pour listes courtes
    void supprime_antecedent_dans_antecedentL(antecedentL *antecL_m1);//supprime un antecedent d'une antecedentL. ATTENTION : il faut envoyer un pointeur sur l'élement juste avant celui à suprimer dans la liste
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec);//renvoie 1 si antec est déjà dans antecL (0 sinon)
    int cardinal_antecL(antecedentL *premier);  //renvoie le nombre d'éléments d'une antecedentL (on donne en argument un pointeur sur le 1er élement)
    int cardinal_antecLL(antecedentLL *premier);  //renvoie le nombre d'éléments d'une antecedentLL (on donne en argument un pointeur sur le 1er élement)
    int antecedent_to_trinaire(antecedent *antec);  //renvoie le pseudo-nombre trinaire associé au pseudo-nombre d'un antecedent (dont la variable trinaire n'est pas (forcement) initialisée
     
    void elimine_doublons_d_une_anteccedentL_fusion(antecedentL **p_premier);  //élimine les doublons (basé sur un tri fusion "améiliré" affin d'éliminer directement les doublons
    void decoupe_en_deux_pour_tri_fusion(antecedentL *premier,antecedentL **p_premier1,antecedentL **p_premier2);//sous fonction (récursive) de elimine_doublons_d_une_anteccedentL_fusion (découpe une antecedentL en 2 de taille égale (à 1 près si longueur impaire)) : p_premier1 et p_premier2 pointent sur les résultats
    void fusion_listes_pour_tri_fusion(antecedentL *premier1,antecedentL *premier2, antecedentL **p_premier_fus);//sous fonction (récursive) de elimine_doublons_d_une_anteccedentL_fusion (fusionne les 2 listes sur le principe du tri fusion (en enlevant directement les doublons)) : p_premier_fus pointe sur le résultat
     
     
    //fonctions d'affichages (ne modifient pas de variables)
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau);
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau);
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau);
    void affiche_antecedent(char *nom, antecedent antec);
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier);
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier);
     
     
     
    int main()
    {
        int table_de_verite[DEUX_PUISSANCE_NBR_VAR];
        int nombre_de_un=0;
        antecedent *tableau_des_antecedents_de_un=NULL;
        antecedentLL *premier_L1=NULL;
        antecedentLL *premier_L2=NULL;
        antecedentL *premier_liste_impliquants_premiers=NULL;
        antecedent *tableau_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN]={NULL};
        int tableau_des_tailles_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN]; //  contient la taille des tableaux formant les elements du tableau déclaré la ligne au-dessus
        int taille_table_verite;
     
        int i,j,k,l;
        int tps;
        int tabl_prov[NOMBRE_DE_VAR_PLUS_UN];
        antecedentLL *p_antecLL=NULL;  //pointeur muet sur un antecendentLL
     
     
     
        for(i=0;i<DEUX_PUISSANCE_NBR_VAR;i++)
        {
            table_de_verite[i]=remplit_case_table_de_verite(NOMBRE_DE_VAR,i);
        }
     
        //début calcul nombre d'antécédents de 1
        taille_table_verite=pow(2,NOMBRE_DE_VAR);
     
     
     
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                nombre_de_un++;
            }
        }
        //fin calcul nombre d'antécédents de 1
        //début tableau antécédents de 1
        if (HABLATIF>2)
        {
            affiche_tableau_int("table_de_verite",taille_table_verite,table_de_verite);
            printf("nbr_de_un=%d\n",nombre_de_un);
        }
       tableau_des_antecedents_de_un = malloc(sizeof(antecedent)*nombre_de_un);
        if (tableau_des_antecedents_de_un == NULL) // Si l'allocation a échoué
        {
            exit(0); // On arrête immédiatement le programme
        }
        k=0;  //poiteur sur la position du prochain antécédent de 1 à placer.
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                initialisation_structure_antecedent(&tableau_des_antecedents_de_un[k],i);
              //  affiche_antecedent("\n",tableau_des_antecedents_de_un[k]);
                k++;
            }
        }
        if (HABLATIF>2)
        {
            affiche_tableau_antecedent("tableau initial",nombre_de_un,tableau_des_antecedents_de_un);
        }
        //fin tableau antécédents de 1
     
        //début création tableau ordonnée par poids des antécédents de 1
        for(i=0;i<=NOMBRE_DE_VAR;i++)  //i représente le poids dans cette boucle
        {
            k=0;                          //k représente le nombre d'antécédents de 1 de poids i trouvés
            for(j=0;j<nombre_de_un;j++)
            {
                if (tableau_des_antecedents_de_un[j].poids==i)
                {
                    k++;
                }
            }
            tableau_des_tableaux_par_poids_initial[i]=NULL;
            tableau_des_tableaux_par_poids_initial[i]=malloc(k*sizeof(antecedent));
            if (tableau_des_tableaux_par_poids_initial[i]==NULL)  //s'il n'y a plus de place en mémoire
            {
                exit(0);
            }
            tableau_des_tailles_des_tableaux_par_poids_initial[i]=k;   //on mémorise le nombre d'antécédents de poids i
            //on a créé le tableau des antécédents de poids i
            tabl_prov[i]=0;//on en profite pour initialiser le tableau provisoire qui servira juste après
        }
        //on viens de créer les tableaux des antécédents de poids i pour tout les i
     
        for(i=0;i<nombre_de_un;i++)//remplissage des nouveaux tableaux
        {
            k=tableau_des_antecedents_de_un[i].poids;                       //k=poids de l'élément i
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].poids=k;
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].impliquant_premier=0;
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].trinaire=tableau_des_antecedents_de_un[i].trinaire;
            for(j=0;j<NOMBRE_DE_VAR;j++)
            {
                tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].pseudo_nombre[j]=tableau_des_antecedents_de_un[i].pseudo_nombre[j];
            }
            tabl_prov[k]++;
        }
        if (HABLATIF>2)
        {
            affiche_tableau_des_tableaux_des_antecedent_par_poids("tableau_des_tableaux_par_poids_initial",NOMBRE_DE_VAR_PLUS_UN,tableau_des_tailles_des_tableaux_par_poids_initial,tableau_des_tableaux_par_poids_initial);
        }
        //fin création tableau ordonnée par poids des antécédents de 1
     
     
     
        //début création liste des antecédents de 1 par poids initial
        p_antecLL=premier_L1;
        if (HABLATIF>2)
        {
            printf("\n\n\n\n");
        }
        for(i=0;i<NOMBRE_DE_VAR+1;i++)
        {
            antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
            if (nouveauLL == NULL)
            {
                exit(0);
            }
            nouveauLL->antecL = NULL;
            nouveauLL->suivant = NULL;
            k=tableau_des_tailles_des_tableaux_par_poids_initial[i];  //k=nombre d'antecedents de poids i
            for(j=0;j<k;j++)//j : numéreau de l'antecedent de poids i dans le tableau des antecedents de poids i
            {
                antecedentL *nouveauL=malloc(sizeof(nouveauL));
                if (nouveauL == NULL)
                {
                    exit(0);
                }
                nouveauL->suivant=NULL;
                antecedent *nouveauAntec=malloc(sizeof(antecedent));
                for(l=0;l<NOMBRE_DE_VAR;l++)
                {
                    nouveauAntec->pseudo_nombre[l]=tableau_des_tableaux_par_poids_initial[i][j].pseudo_nombre[l];
                }
                nouveauAntec->poids=tableau_des_tableaux_par_poids_initial[i][j].poids;
                nouveauAntec->impliquant_premier=1;//on prépare pour les étapes : on n'a pas encore montré qu'il ne l'était pas
                nouveauAntec->trinaire=tableau_des_tableaux_par_poids_initial[i][j].trinaire;
     
                nouveauL->antec=nouveauAntec;
                nouveauL->suivant=nouveauLL->antecL;
                nouveauLL->antecL=nouveauL;
     
            }
     
            if (HABLATIF>2)
            {
                printf("i=%d; Liste du poids ->",i);
                affiche_liste_de_antecedentL("",nouveauLL->antecL);
            }
     
            /* Insertion de l'élément au début de la liste */
            nouveauLL->suivant = premier_L1;
            premier_L1=nouveauLL;
        }
     
        if (HABLATIF>2)
        {
            affiche_liste_de_antecedentLL("liste L1:",premier_L1);
        }
     
        //fin création liste des antecédents de 1 par poids initial
     
        if (CALCULER_TAILLE_LISTES==1)
        {
            printf("avant la premiere passe, #L1=%d",cardinal_antecLL(premier_L1));
        }
     
     
        int continuer=1;
     
        while (continuer)
        {
            if (HABLATIF>0)
            {
               printf("debut passe");
            }
            continuer=0;
            premier_L2=NULL;
                        antecedentLL *antecLL_poids_p=premier_L1;
                            while (antecLL_poids_p!=NULL&&antecLL_poids_p->suivant!=NULL)   //on boucle sur les poids (remplace le for i)
                            {
                                antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
                                nouveauLL->suivant=NULL;
                                if (nouveauLL == NULL)
                                {
                                    exit(0);
                                }
                                nouveauLL->antecL = NULL;
     
                                antecedentL *antecL_poids_p=antecLL_poids_p->antecL;
                                antecedentL *antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
     
                                while (antecL_poids_p!=NULL)//on boucle sur les antécédent de poids p
                                {
                                    antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
                                    while(antecL_poids_pp1!=NULL)//on boucle sur les antécédent de poids p+1
                                    {
                                        int dif=difference_antecedents(antecL_poids_p->antec,antecL_poids_pp1->antec);
                                        if (dif>=0)     //si on a une diférence unique
                                        {
                                            continuer=1;
                                            antecL_poids_p->antec->impliquant_premier=0;      //on a pu regrouper : l'antécédent n'est pas premier
                                            antecL_poids_pp1->antec->impliquant_premier=0;    //on a pu regrouper : l'antécédent n'est pas premier
     
                                            antecedentL *nouveauL=malloc(sizeof(nouveauL));
                                            if (nouveauL == NULL)
                                            {
                                                exit(0);
                                            }
                                            nouveauL->suivant=NULL;
                                            antecedent *nouveauAntec=malloc(sizeof(antecedent));
                                            for(l=0;l<NOMBRE_DE_VAR;l++)
                                            {
                                                nouveauAntec->pseudo_nombre[l]=antecL_poids_p->antec->pseudo_nombre[l];
                                            }
                                            nouveauAntec->pseudo_nombre[dif]=2;
                                            nouveauAntec->poids=antecL_poids_p->antec->poids;
                                            nouveauAntec->impliquant_premier=1;
                                            nouveauAntec->trinaire=antecedent_to_trinaire(nouveauAntec);
     
     
                                            nouveauL->antec=nouveauAntec;
                                            nouveauL->suivant=nouveauLL->antecL;
                                            nouveauLL->antecL=nouveauL;
     
     
                                        }
     
                                        antecL_poids_pp1=antecL_poids_pp1->suivant;
                                    }
                                    if (antecL_poids_p->antec->impliquant_premier==1)
                                    {
                                        if (HABLATIF>1)
                                        {
                                            affiche_antecedent("\nl'antecedent suivant est premier : ",*(antecL_poids_p->antec));
                                        }
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        if (0==verif_antec_deja_present_dans_antecedentL(premier_liste_impliquants_premiers,antecL_poids_p->antec))
                                        {
                                            antecedentL *nouvL=malloc(sizeof(antecedentL));
                                            nouvL->suivant=NULL;
                                            antecedent *nouvAntec=malloc(sizeof(antecedent));
                                            nouvAntec->poids=antecL_poids_p->antec->poids;
                                            nouvAntec->trinaire=antecL_poids_p->antec->trinaire;
                                            nouvAntec->impliquant_premier=1;
                                            for(i=0;i<NOMBRE_DE_VAR;i++)
                                            {
                                                nouvAntec->pseudo_nombre[i]=antecL_poids_p->antec->pseudo_nombre[i];
                                            }
                                            nouvL->antec=nouvAntec;
                                            nouvL->suivant=premier_liste_impliquants_premiers;
                                            premier_liste_impliquants_premiers=nouvL;
     
                                        }
     
     
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                    }
     
     
                                    antecL_poids_p=antecL_poids_p->suivant;
                                }
     
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
     
     
     
                                //affiche_liste_de_antecedentL("",nouveauLL->antecL);
     
                                // Insertion de l'élément au début de la liste
                                nouveauLL->suivant = premier_L2;
                                premier_L2=nouveauLL;
     
                                elimine_doublons_d_une_anteccedentL_fusion(&(premier_L2->antecL)); //élimination des doublons pour le poids p
     
                                antecLL_poids_p=antecLL_poids_p->suivant;
     
                            }
                            if (HABLATIF>2)
                            {
                                affiche_liste_de_antecedentLL("liste L2:",premier_L2);
                            }
     
     
     
     
     
            //premier_L1=premier_L2;   //à remplacer par une copie terme à terme pour remettre dans le bon ordre?
            premier_L1=NULL;
            antecedentLL *provvv=NULL;
     
            while (premier_L2!=NULL)
            {
                provvv=premier_L1;
                premier_L1=malloc(sizeof(antecedentLL));
                premier_L1->antecL=premier_L2->antecL;
                premier_L1->suivant=provvv;
     
                premier_L2=premier_L2->suivant;
            }
     
            if (HABLATIF>2)
            {
                affiche_liste_de_antecedentLL("liste L1:",premier_L1);
            }
            if (CALCULER_TAILLE_LISTES==1)
            {
                printf("\na la fin de l'etape : #L2=%d ; #impliq_prem_l=%d\n",cardinal_antecLL(premier_L1),cardinal_antecL(premier_liste_impliquants_premiers));
                tps=clock();
                printf("Temps d'execution = %d ms\n", tps);
            }
     
     
        }
     
     
        if (HABLATIF>0)
        {
            affiche_liste_de_antecedentL("\nles impliquants premiers sont:",premier_liste_impliquants_premiers);
        }
     
        tps=clock();
        printf("Temps d'execution = %d ms", tps);
        printf("\n#impliq_prem_l=%d",cardinal_antecL(premier_liste_impliquants_premiers));
     
        free(tableau_des_antecedents_de_un);
        return 0;
    }
     
     
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre)  //corecte
    {
        int prov=nombre;
    //printf("\nprov=%d",prov);
        int compteur;
        p_antecedent_a_initialiser->impliquant_premier=1;
        p_antecedent_a_initialiser->poids=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
     
            p_antecedent_a_initialiser->pseudo_nombre[NOMBRE_DE_VAR-compteur-1]=prov%2;
            p_antecedent_a_initialiser->poids= p_antecedent_a_initialiser->poids + (prov%2);
            prov=prov/2;
        }
        p_antecedent_a_initialiser->trinaire=antecedent_to_trinaire(p_antecedent_a_initialiser);
    //    affiche_tableau_int("pseudo_nombre",NOMBRE_DE_VAR,*p_antecedent_a_initialiser.pseudo_nombre);
    //    printf("\npoids=%d",*p_antecedent_a_initialiser.poids);
    //affiche_antecedent("\n",*p_antecedent_a_initialiser);
    }
     
    int difference_antecedents(antecedent *antec1, antecedent *antec2)
    {
        int dif=0;
        int indexdif=0;
        int compteur=0;
        while (compteur<NOMBRE_DE_VAR&&dif<2)
        {
            if (antec1->pseudo_nombre[compteur]!=antec2->pseudo_nombre[compteur])
            {
                dif++;
                indexdif=compteur;
            }
     
            compteur++;
        }
     
        if (dif==1)
        {
            return indexdif;
        }
        else
        {
            return -1;
        }
    }
     
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL)
    {
        antecedentL *antecLp=antecL;
        int taille=0;
        while (antecLp!=NULL)  //on compte le nombre d'éléments de la liste
        {
            taille++;
            antecLp=antecLp->suivant;
        }
        int *tableau=malloc(taille*sizeof(int));
     
     
     
        int compteur,compteur2;  //on remplit un tableau avec les pseudo nombres en base 3
        antecLp=antecL;
      /*  int pseudo_nbr_trinaire;
        for(compteur=0;compteur<taille; compteur++)
        {
            pseudo_nbr_trinaire=0;
            for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
            {
                pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antecLp->antec->pseudo_nombre[compteur2];
            }
            tableau[compteur]=pseudo_nbr_trinaire;
            antecLp=antecLp->suivant;
        }*/
        //remplacé par
        for(compteur=0;compteur<taille; compteur++)
        {
            tableau[compteur]=antecLp->antec->trinaire;
            antecLp=antecLp->suivant;
        }
        //
     
        antecLp=antecL;
        int t;
        for(compteur=0;compteur<taille-1;compteur++)
        {
            compteur2=0;
            t=tableau[compteur+1];
            while (compteur2<=compteur&&t!=tableau[compteur2])
            {
                compteur2++;
            }
            if (t==tableau[compteur2-1])
            {
                supprime_antecedent_dans_antecedentL(antecLp);
            }
            antecLp=antecLp->suivant;
        }
     
    }
     
    void supprime_antecedent_dans_antecedentL(antecedentL* antecL_m1)
    {
        antecedentL *antecL_0=antecL_m1->suivant;
        antecL_m1->suivant=antecL_0->suivant;
     
        free(antecL_0->antec);
        free(antecL_0);
    }
     
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec)
    {
        int pseudo_nbr_trinaire=antec->trinaire;
        /*int compteur,pseudo_nbr_trinaire=antec->trinaire;
        pseudo_nbr_trinaire=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
            pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antec->pseudo_nombre[compteur];
        }*/
        antecedentL *prov=antecL;
        int pseudo_nbr_trinaire_prov;
        while (prov!=NULL)
        {
            /*pseudo_nbr_trinaire_prov=0;
            for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
            {
                pseudo_nbr_trinaire_prov=3*pseudo_nbr_trinaire_prov+prov->antec->pseudo_nombre[compteur];
            }*/
            pseudo_nbr_trinaire_prov=prov->antec->trinaire;
     
            //if (pseudo_nbr_trinaire==pseudo_nbr_trinaire_prov)
            if (pseudo_nbr_trinaire==prov->antec->trinaire)
            {
                return 1;
            }
     
            prov=prov->suivant;
        }
        return 0;
    }
     
    int cardinal_antecL(antecedentL *premier)
    {
        antecedentL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur++;
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int cardinal_antecLL(antecedentLL *premier)
    {
        antecedentLL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur=compteur+cardinal_antecL(prem->antecL);
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int antecedent_to_trinaire(antecedent *antec)
    {
        int a;
        int s=0;
        for(a=0;a<NOMBRE_DE_VAR;a++)
        {
            s=3*s+antec->pseudo_nombre[a];
        }
        return s;
    }
     
    void decoupe_en_deux_pour_tri_fusion(antecedentL *premier,antecedentL **p_premier1,antecedentL **p_premier2)
    {
       // antecedentL *premier1=NULL;
       // antecedentL *premier2=NULL;
        antecedentL *prov=premier;
        int p=1;
        while (premier!=NULL)
        {
            prov=prov->suivant;
            if (p==1)
            {
                premier->suivant=*p_premier1;
                *p_premier1=premier;
            }
            else
            {
                premier->suivant=*p_premier2;
                *p_premier2=premier;
            }
            p=1-p;
     
            premier=prov;
        }
    }
    void fusion_listes_pour_tri_fusion(antecedentL *premier1,antecedentL *premier2, antecedentL **p_premier_fus)
    {
        *p_premier_fus=NULL;
        //printf("debut fusion\n");
        antecedentL *prov=NULL;
        int prem1trin;
        if (premier1==NULL)
        {
            *p_premier_fus=premier2;
        }
        else if (premier2==NULL)
        {
            *p_premier_fus=premier1;
        }
        else
        {
            prem1trin=premier1->antec->trinaire;
            if (prem1trin == premier2->antec->trinaire)
            {
                prov=premier1;
                premier1=premier1->suivant;
                premier2=premier2->suivant;
                while(premier1!=NULL&&premier1->antec->trinaire==prem1trin)
                {
                    premier1=premier1->suivant;
                }
                while(premier2!=NULL&&premier2->antec->trinaire==prem1trin)
                {
                    premier2=premier2->suivant;
                }
                fusion_listes_pour_tri_fusion(premier1,premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else if (premier1->antec->trinaire < premier2->antec->trinaire)
            {
                prov=premier1;
                fusion_listes_pour_tri_fusion(premier1->suivant,premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else
            {
                prov=premier2;
                fusion_listes_pour_tri_fusion(premier1,premier2->suivant,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
        }
     //   printf("fin fusion\n");
    }
     
     
    void elimine_doublons_d_une_anteccedentL_fusion(antecedentL **p_premier)
    {
      //  printf("debut elimine doublons");
      //  printf("avec *p_premier=%d et (*p_premier)->suivant=%d",*p_premier,(*p_premier)->suivant);
      //  affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        if (*p_premier!=NULL&&(*p_premier)->suivant!=NULL) //dans le cas contraire, on ne modifie pas la liste
        {
            antecedentL *null1=NULL;
            antecedentL *null2=NULL;
            antecedentL **p_prem1=&null1,**p_prem2=&null2;
            decoupe_en_deux_pour_tri_fusion(*p_premier,p_prem1,p_prem2);
      //      printf("\ndecoupe effectuee");
      //      affiche_liste_de_antecedentL("partie1",*p_prem1);
        //    affiche_liste_de_antecedentL("partie2",*p_prem2);
          //  printf("\n");
            elimine_doublons_d_une_anteccedentL_fusion(p_prem1);
            elimine_doublons_d_une_anteccedentL_fusion(p_prem2);
      //      printf("\nrecurence effectuee");
       //     affiche_liste_de_antecedentL("*p_prem1=",*p_prem1);
        //    affiche_liste_de_antecedentL("*p_prem2=",*p_prem1);
         //   printf("\n");
            fusion_listes_pour_tri_fusion(*p_prem1,*p_prem2,p_premier);////premier n'est pas modifié
         //   printf("fusion effectuee");
         //   affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        }
       // printf("fin elimine doublons\n");
    }
     
     
     
    //fonctions d'affichage
     
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->%d\n",compteur,tableau[compteur]);
        }
        printf("\n\n");
    }
     
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->",compteur);
            affiche_antecedent(" ",tableau[compteur]);
        }
    }
     
    void affiche_antecedent(char *nom, antecedent antec)
    {
        int compteur2;
        printf("\n%s : ",nom);
        printf("poids=%d, impl prem=%d, pseudo_nbr=",antec.poids,antec.impliquant_premier);
        for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
        {
            printf("%d",antec.pseudo_nombre[compteur2]);
        }
        printf("\n");
    }
     
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_de_tableaux;compteur++)
        {
            printf("poids %d",compteur);
            affiche_tableau_antecedent(" ",tableau_du_nombre_d_elements_de_chaque_tableau[compteur],tableau[compteur]);
        }
    }
     
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier)
    {
        printf("\n%s\n",nom);
        antecedentL *pointeur=premier;
        int x=0;
        while (pointeur!=NULL)
        {
            printf("antecedent n %d ->",x);
            affiche_antecedent("",*(pointeur->antec));
            x++;
            pointeur=pointeur->suivant;
        }
    }
     
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier)
    {
        printf("\n%s\n",nom);
        antecedentLL *pointeur=premier;
        while (pointeur!=NULL)
        {
            affiche_liste_de_antecedentL("",(pointeur->antecL));
            pointeur=pointeur->suivant;
        }
    }
    Encore merci beaucoup pour l'aide
    katorps

    ps : si certaines explications ne sont pas assez claires, n'hésitez pas à demander (il est dur d'évalué la clarté d'explications quand on étudie un algorithme depuis des semaines)

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut,

    Je pense que ce sujet pourrait t'intéresser : http://www.developpez.net/forums/d12...ows-and-linux/

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Merci énormément, le programme de ton lien m'a permis de supprimer un paquet de fuites mémoires (7 ou 8 endroits différents : 0.5 Mo rien que pour de "petites" entrées : ça explique pourquoi ça me saturait la rame lors de grosses entrées).

    Il n'en reste qu'une seule que je n'ai pas réussit à cerner pour l'instant : Dr.Memory renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    r. Memory version 1.6.1 build 2 built on Dec 14 2013 12:27:10
    Dr. Memory results for pid 7864: "quineMcCluskey.exe"
    Application cmdline: "C:\C\quineMcCluskey\bin\Debug\quineMcCluskey.exe"
    Recorded 99 suppression(s) from default C:\Program Files (x86)\Dr. Memory\bin\suppress-default.txt
     
    Error #1: LEAK 8 direct bytes 0x01071948-0x01071950 + 44 indirect bytes
    # 0 replace_malloc               [d:\drmemory_package\common\alloc_replace.c:2292]
    # 1 main                         [C:/C/quineMcCluskey/main.c:318]
     
    ===========================================================================
    FINAL SUMMARY:
     
    DUPLICATE ERROR COUNTS:
    	Error #   1:    564
     
    SUPPRESSIONS USED:
     
    ERRORS FOUND:
          0 unique,     0 total unaddressable access(es)
          0 unique,     0 total uninitialized access(es)
          0 unique,     0 total invalid heap argument(s)
          0 unique,     0 total GDI usage error(s)
          0 unique,     0 total warning(s)
          1 unique,   564 total,  64844 byte(s) of leak(s)
          0 unique,     0 total,      0 byte(s) of possible leak(s)
    ERRORS IGNORED:
          1 potential leak(s) (suspected false positives)
             (details: C:\Users\******\AppData\Roaming\Dr. Memory\DrMemory-quineMcCluskey.exe.7864.000\potential_errors.txt)
          0 unique,     0 total,      0 byte(s) of still-reachable allocation(s)
             (re-run with "-show_reachable" for details)
    Details: C:\Users\*******\AppData\Roaming\Dr. Memory\DrMemory-quineMcCluskey.exe.7864.000\results.txt
    et le code actuel est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    817
    818
    819
    820
    821
    822
    823
    824
    825
    826
    827
    828
    829
    830
    831
    832
    833
    834
    835
    836
    837
    838
    839
    840
    841
    842
    843
    844
    845
    846
    847
    848
    849
    850
    851
    852
    853
    854
    855
    856
    857
    858
    859
    860
    861
    862
    863
    864
    /*à faire
    -copie terme à terme de L2 dans L1 pour rétablir l'ordre croissant de poids
    -récupérer les antécédents premiers + décocher l'option non premier à la fin des étapes
    -suprimer proprement les listes plus utilisées
     
     
     
    -calculer les pseudo-nombres trinaires au fur et à mesure de la création/modification des antecedents, au lieux de le faire dans les fonctions le nécssitant
    */
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <time.h>
    //#include <crtdbg.h>  //cert uniquement à la traque des fuites de mémoire
     
     
    //paramètres et entrées
    #define HABLATIF 1 //0 : que les durées ; 1 : + impliquants 1ers à la fin ; 2 :+ impliquants 1ers au fur et à mesure; 3: tout
    #define CALCULER_TAILLE_LISTES 0  //si =1 : calcule la taille de L2 et de la liste des impliquants permiers à la fin de chaque étape et les affiche
    #define NOMBRE_DE_VAR 8
    #define NOMBRE_DE_VAR_PLUS_UN 9            //la ligne précédente +1
    #define DEUX_PUISSANCE_NBR_VAR 2*2*2*2*2*2*2*2  //nombre_de_var 2
    #define DEUX_PUISSANCE_DEMI_NBR_VAR 2*2*2*2  //nombre_de_var/2 2 (arrondir à l'inférieur)
    //fin paramètres et entrées
     
    typedef struct antecedent antecedent;
    struct antecedent
    {
        int pseudo_nombre[NOMBRE_DE_VAR];
        int poids;
        int impliquant_premier;
        int trinaire;
    };
     
    typedef struct antecedentL antecedentL;
    struct antecedentL
    {
        antecedent *antec;
        antecedentL *suivant;
    };
     
    typedef struct antecedentLL antecedentLL;
    struct antecedentLL
    {
        antecedentL *antecL;
        antecedentLL *suivant;
    };
     
    int remplit_case_table_de_verite(int nbr_var, int i); //cette fonction est en quelques sorte "l'entrée" du programme : elle définit la fonction logique à simplifier (ici l'adition)
    int remplit_case_table_de_verite(int nbr_var, int i)
    {
        //i(binaire)= (r.)b0. ... .bk.a0. ... . ak où k=n/2
        int n=nbr_var;
        int a=0;
        int b=0;
        int r=(n%2)*(i%2);
        n=n/2;
        int x=i;
        int j;
        for(j=0;j<n;j++)
        {
            a=2*a+(x%2);
            x=x/2;
        }
        for(j=0;j<n;j++)
        {
            b=2*b+(x%2);
            x=x/2;
        }
        x=r+a+b;  //x résultat en binaire
        int dpdnv=DEUX_PUISSANCE_DEMI_NBR_VAR;
        return (x/dpdnv);
    }
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre); //initialise une structure antecedent (décomposition en binaire, poids (nombre de 1), impliquant premier =1 (on ne l'a pas utilisé pour l'instant), trinaire (le nombre binaire considéré comme trinaire)
    int difference_antecedents(antecedent* antec1, antecedent* antec2);//compare les 2 pseudo-nombres : si ils sont egaux ou diffèrent de 2 cases ou plus, alors renvoie -1; s'ils diffèrent au niveau d'un seul indice, renvoie cet indice
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL);//supprime les doublons (ie même pseudo-nombre ie même trinaire) : version simple peu optimisée : pour listes courtes
    void supprime_antecedent_dans_antecedentL(antecedentL *antecL_m1);//supprime un antecedent d'une antecedentL. ATTENTION : il faut envoyer un pointeur sur l'élement juste avant celui à suprimer dans la liste
    void supprime_antecedentL(antecedentL *premier);//supprime une antecedentL.
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec);//renvoie 1 si antec est déjà dans antecL (0 sinon)
    int cardinal_antecL(antecedentL *premier);  //renvoie le nombre d'éléments d'une antecedentL (on donne en argument un pointeur sur le 1er élement)
    int cardinal_antecLL(antecedentLL *premier);  //renvoie le nombre d'éléments d'une antecedentLL (on donne en argument un pointeur sur le 1er élement)
    int antecedent_to_trinaire(antecedent *antec);  //renvoie le pseudo-nombre trinaire associé au pseudo-nombre d'un antecedent (dont la variable trinaire n'est pas (forcement) initialisée
     
    void elimine_doublons_d_une_anteccedentL_fusion(antecedentL **p_premier);  //élimine les doublons (basé sur un tri fusion "améiliré" affin d'éliminer directement les doublons
    void decoupe_en_deux_pour_tri_fusion(antecedentL **p_premier,antecedentL **p_premier1,antecedentL **p_premier2);//sous fonction (récursive) de elimine_doublons_d_une_anteccedentL_fusion (découpe une antecedentL en 2 de taille égale (à 1 près si longueur impaire)) : p_premier1 et p_premier2 pointent sur les résultats
    void fusion_listes_pour_tri_fusion(antecedentL **p_premier1,antecedentL **p_premier2, antecedentL **p_premier_fus);//sous fonction (récursive) de elimine_doublons_d_une_anteccedentL_fusion (fusionne les 2 listes sur le principe du tri fusion (en enlevant directement les doublons)) : p_premier_fus pointe sur le résultat
     
     
    //fonctions d'affichages (ne modifient pas de variables)
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau);
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau);
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau);
    void affiche_antecedent(char *nom, antecedent antec);
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier);
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier);
     
     
     
    int main()
    {
    /*    // BLOC 1 de la recherche de fuites
        int BreakAlloc=-1   ;
        _CrtSetBreakAlloc(BreakAlloc);
        // FIN BLOC 1 de la recherche de fuites (le bloc 2 est tout à la fin)
    */
        int table_de_verite[DEUX_PUISSANCE_NBR_VAR];
        int nombre_de_un=0;
        antecedent *tableau_des_antecedents_de_un=NULL;
        antecedentLL *premier_L1=NULL;
        antecedentLL *premier_L2=NULL;
        antecedentL *premier_liste_impliquants_premiers=NULL;
        antecedent *tableau_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN]={NULL};
        int tableau_des_tailles_des_tableaux_par_poids_initial[NOMBRE_DE_VAR_PLUS_UN]; //  contient la taille des tableaux formant les elements du tableau déclaré la ligne au-dessus
        int taille_table_verite;
     
        int i,j,k,l;
        int tps;
        int tabl_prov[NOMBRE_DE_VAR_PLUS_UN];
        antecedentLL *p_antecLL=NULL;  //pointeur muet sur un antecendentLL
        antecedentL *provantecL=NULL;
     
     
        for(i=0;i<DEUX_PUISSANCE_NBR_VAR;i++)
        {
            table_de_verite[i]=remplit_case_table_de_verite(NOMBRE_DE_VAR,i);
        }
     
        //début calcul nombre d'antécédents de 1
        taille_table_verite=pow(2,NOMBRE_DE_VAR);
     
     
     
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                nombre_de_un++;
            }
        }
        //fin calcul nombre d'antécédents de 1
        //début tableau antécédents de 1
        if (HABLATIF>2)
        {
            affiche_tableau_int("table_de_verite",taille_table_verite,table_de_verite);
            printf("nbr_de_un=%d\n",nombre_de_un);
        }
       tableau_des_antecedents_de_un = malloc(sizeof(antecedent)*nombre_de_un);
        if (tableau_des_antecedents_de_un == NULL) // Si l'allocation a échoué
        {
            exit(0); // On arrête immédiatement le programme
        }
        k=0;  //poiteur sur la position du prochain antécédent de 1 à placer.
        for(i=0;i<taille_table_verite;i++)
        {
            if (table_de_verite[i]==1)
            {
                initialisation_structure_antecedent(&tableau_des_antecedents_de_un[k],i);
              //  affiche_antecedent("\n",tableau_des_antecedents_de_un[k]);
                k++;
            }
        }
        if (HABLATIF>2)
        {
            affiche_tableau_antecedent("tableau initial",nombre_de_un,tableau_des_antecedents_de_un);
        }
        //fin tableau antécédents de 1
     
        //début création tableau ordonnée par poids des antécédents de 1
        for(i=0;i<=NOMBRE_DE_VAR;i++)  //i représente le poids dans cette boucle
        {
            k=0;                          //k représente le nombre d'antécédents de 1 de poids i trouvés
            for(j=0;j<nombre_de_un;j++)
            {
                if (tableau_des_antecedents_de_un[j].poids==i)
                {
                    k++;
                }
            }
            tableau_des_tableaux_par_poids_initial[i]=NULL;
            tableau_des_tableaux_par_poids_initial[i]=malloc(k*sizeof(antecedent));
            if (tableau_des_tableaux_par_poids_initial[i]==NULL)  //s'il n'y a plus de place en mémoire
            {
                exit(0);
            }
            tableau_des_tailles_des_tableaux_par_poids_initial[i]=k;   //on mémorise le nombre d'antécédents de poids i
            //on a créé le tableau des antécédents de poids i
            tabl_prov[i]=0;//on en profite pour initialiser le tableau provisoire qui servira juste après
        }
        //on viens de créer les tableaux des antécédents de poids i pour tout les i
     
        for(i=0;i<nombre_de_un;i++)//remplissage des nouveaux tableaux
        {
            k=tableau_des_antecedents_de_un[i].poids;                       //k=poids de l'élément i
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].poids=k;
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].impliquant_premier=0;
            tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].trinaire=tableau_des_antecedents_de_un[i].trinaire;
            for(j=0;j<NOMBRE_DE_VAR;j++)
            {
                tableau_des_tableaux_par_poids_initial[k][tabl_prov[k]].pseudo_nombre[j]=tableau_des_antecedents_de_un[i].pseudo_nombre[j];
            }
            tabl_prov[k]++;
        }
        if (HABLATIF>2)
        {
            affiche_tableau_des_tableaux_des_antecedent_par_poids("tableau_des_tableaux_par_poids_initial",NOMBRE_DE_VAR_PLUS_UN,tableau_des_tailles_des_tableaux_par_poids_initial,tableau_des_tableaux_par_poids_initial);
        }
        //fin création tableau ordonnée par poids des antécédents de 1
     
     
     
        //début création liste des antecédents de 1 par poids initial
        p_antecLL=premier_L1;
        if (HABLATIF>2)
        {
            printf("\n\n\n\n");
        }
        for(i=0;i<NOMBRE_DE_VAR+1;i++)
        {
            antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
            if (nouveauLL == NULL)
            {
                exit(0);
            }
            nouveauLL->antecL = NULL;
            nouveauLL->suivant = NULL;
            k=tableau_des_tailles_des_tableaux_par_poids_initial[i];  //k=nombre d'antecedents de poids i
            for(j=0;j<k;j++)//j : numéreau de l'antecedent de poids i dans le tableau des antecedents de poids i
            {
                antecedentL *nouveauL=malloc(sizeof(antecedentL));
                if (nouveauL == NULL)
                {
                    exit(0);
                }
                nouveauL->suivant=NULL;
                antecedent *nouveauAntec=malloc(sizeof(antecedent));
                for(l=0;l<NOMBRE_DE_VAR;l++)
                {
                    nouveauAntec->pseudo_nombre[l]=tableau_des_tableaux_par_poids_initial[i][j].pseudo_nombre[l];
                }
                nouveauAntec->poids=tableau_des_tableaux_par_poids_initial[i][j].poids;
                nouveauAntec->impliquant_premier=1;//on prépare pour les étapes : on n'a pas encore montré qu'il ne l'était pas
                nouveauAntec->trinaire=tableau_des_tableaux_par_poids_initial[i][j].trinaire;
     
                nouveauL->antec=nouveauAntec;
                nouveauL->suivant=nouveauLL->antecL;
                nouveauLL->antecL=nouveauL;
     
            }
     
            if (HABLATIF>2)
            {
                printf("i=%d; Liste du poids ->",i);
                affiche_liste_de_antecedentL("",nouveauLL->antecL);
            }
     
            /* Insertion de l'élément au début de la liste */
            nouveauLL->suivant = premier_L1;
            premier_L1=nouveauLL;
        }
     
        if (HABLATIF>2)
        {
            affiche_liste_de_antecedentLL("liste L1:",premier_L1);
        }
        for(i=0;i<=NOMBRE_DE_VAR;i++)
        {
                free(tableau_des_tableaux_par_poids_initial[i]);//suprime proprement le tableau
        }
        //fin création liste des antecédents de 1 par poids initial
     
        if (CALCULER_TAILLE_LISTES==1)
        {
            printf("avant la premiere passe, #L1=%d",cardinal_antecLL(premier_L1));
        }
     
     
        int continuer=1;
     
        while (continuer)
        {
            if (HABLATIF>0)
            {
               printf("debut passe");
            }
            continuer=0;
            premier_L2=NULL;
                        antecedentLL *antecLL_poids_p=premier_L1;
                            while (antecLL_poids_p!=NULL&&antecLL_poids_p->suivant!=NULL)   //on boucle sur les poids (remplace le for i)
                            {
                                antecedentLL *nouveauLL = malloc(sizeof(*nouveauLL));
                                nouveauLL->suivant=NULL;
                                if (nouveauLL == NULL)
                                {
                                    exit(0);
                                }
                                nouveauLL->antecL = NULL;
     
                                antecedentL *antecL_poids_p=antecLL_poids_p->antecL;
                                antecedentL *antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
     
                                while (antecL_poids_p!=NULL)//on boucle sur les antécédent de poids p
                                {
                                    antecL_poids_pp1=antecLL_poids_p->suivant->antecL;
                                    while(antecL_poids_pp1!=NULL)//on boucle sur les antécédent de poids p+1
                                    {
                                        int dif=difference_antecedents(antecL_poids_p->antec,antecL_poids_pp1->antec);
                                        if (dif>=0)     //si on a une diférence unique
                                        {
                                            continuer=1;
                                            antecL_poids_p->antec->impliquant_premier=0;      //on a pu regrouper : l'antécédent n'est pas premier
                                            antecL_poids_pp1->antec->impliquant_premier=0;    //on a pu regrouper : l'antécédent n'est pas premier
     
                                            antecedentL *nouveauL=malloc(sizeof(antecedentL));
                                            if (nouveauL == NULL)
                                            {
                                                exit(0);
                                            }
                                            nouveauL->suivant=NULL;
                                            antecedent *nouveauAntec=malloc(sizeof(antecedent));
                                            for(l=0;l<NOMBRE_DE_VAR;l++)
                                            {
                                                nouveauAntec->pseudo_nombre[l]=antecL_poids_p->antec->pseudo_nombre[l];
                                            }
                                            nouveauAntec->pseudo_nombre[dif]=2;
                                            nouveauAntec->poids=antecL_poids_p->antec->poids;
                                            nouveauAntec->impliquant_premier=1;
                                            nouveauAntec->trinaire=antecedent_to_trinaire(nouveauAntec);
     
     
                                            nouveauL->antec=nouveauAntec;
                                            nouveauL->suivant=nouveauLL->antecL;
                                            nouveauLL->antecL=nouveauL;
     
     
                                        }
     
                                        antecL_poids_pp1=antecL_poids_pp1->suivant;
                                    }
                                    if (antecL_poids_p->antec->impliquant_premier==1)
                                    {
                                        if (HABLATIF>1)
                                        {
                                            affiche_antecedent("\nl'antecedent suivant est premier : ",*(antecL_poids_p->antec));
                                        }
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        if (0==verif_antec_deja_present_dans_antecedentL(premier_liste_impliquants_premiers,antecL_poids_p->antec))
                                        {
                                            antecedentL *nouvL=malloc(sizeof(antecedentL));
                                            nouvL->suivant=NULL;
                                            antecedent *nouvAntec=malloc(sizeof(antecedent));
                                            nouvAntec->poids=antecL_poids_p->antec->poids;
                                            nouvAntec->trinaire=antecL_poids_p->antec->trinaire;
                                            nouvAntec->impliquant_premier=1;
                                            for(i=0;i<NOMBRE_DE_VAR;i++)
                                            {
                                                nouvAntec->pseudo_nombre[i]=antecL_poids_p->antec->pseudo_nombre[i];
                                            }
                                            nouvL->antec=nouvAntec;
                                            nouvL->suivant=premier_liste_impliquants_premiers;
                                            premier_liste_impliquants_premiers=nouvL;
     
                                        }
     
     
     
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                        //récupération des impliquants premiers
                                    }
     
     
                                    antecL_poids_p=antecL_poids_p->suivant;
                                }
     
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
                                //récupération des impliquants premiers de max?
     
     
     
                                //affiche_liste_de_antecedentL("",nouveauLL->antecL);
     
                                // Insertion de l'élément au début de la liste
                                nouveauLL->suivant = premier_L2;
                                premier_L2=nouveauLL;
     
                                elimine_doublons_d_une_anteccedentL_fusion(&(premier_L2->antecL)); //élimination des doublons pour le poids p
     
                                antecLL_poids_p=antecLL_poids_p->suivant;
     
                            }
                            if (HABLATIF>2)
                            {
                                affiche_liste_de_antecedentLL("liste L2:",premier_L2);
                            }
     
     
     
     
     
            //premier_L1=premier_L2;   //à remplacer par une copie terme à terme pour remettre dans le bon ordre?
     
            while (premier_L1!=NULL) //supression propre de L1
            {
                p_antecLL=premier_L1;
                while (premier_L1->antecL!=NULL)
                {
                    free(premier_L1->antecL->antec);
                    provantecL=premier_L1->antecL;
                    premier_L1->antecL=premier_L1->antecL->suivant;
                    free(provantecL);
                }
                premier_L1=premier_L1->suivant;
                free(p_antecLL);
            }
            premier_L1=NULL;
           // antecedentLL *p_antecLL=NULL;  //pointeur muet sur un antecendentLL
       // antecedentL *provantecL=NULL;
     
            antecedentLL *provvv=NULL;
            antecedentLL *provLL2suprr=NULL;
     
            while (premier_L2!=NULL)
            {
                provvv=premier_L1;
                premier_L1=malloc(sizeof(antecedentLL));
                premier_L1->antecL=premier_L2->antecL;
                premier_L1->suivant=provvv;
                provLL2suprr=premier_L2;
                premier_L2=premier_L2->suivant;
                free(provLL2suprr);
     
            }
     
            if (HABLATIF>2)
            {
                affiche_liste_de_antecedentLL("liste L1:",premier_L1);
            }
            if (CALCULER_TAILLE_LISTES==1)
            {
                printf("\na la fin de l'etape : #L2=%d ; #impliq_prem_l=%d\n",cardinal_antecLL(premier_L1),cardinal_antecL(premier_liste_impliquants_premiers));
                tps=clock();
                printf("Temps d'execution = %d ms\n", tps);
            }
     
     
        }
     
     
        if (HABLATIF>0)
        {
            affiche_liste_de_antecedentL("\nles impliquants premiers sont:",premier_liste_impliquants_premiers);
        }
     
        tps=clock();
        printf("Temps d'execution = %d ms", tps);
        printf("\n#impliq_prem_l=%d",cardinal_antecL(premier_liste_impliquants_premiers));
     
        free(tableau_des_antecedents_de_un);
    /*
        // BLOC 2 de la recherche de fuites de mémoires
        _CrtDumpMemoryLeaks();
        // FIN BLOC 2
    */
     
     
        //supression de la liste des impliquants premiers
        while (premier_liste_impliquants_premiers!=NULL)
        {
            provantecL=premier_liste_impliquants_premiers->suivant;
            free(premier_liste_impliquants_premiers->antec);
            free(premier_liste_impliquants_premiers);
            premier_liste_impliquants_premiers=provantecL;
        }
    //supression de L1
        while (premier_L1!=NULL) //supression propre de L1
        {
            p_antecLL=premier_L1;
            while (premier_L1->antecL!=NULL)
            {
                free(premier_L1->antecL->antec);
                provantecL=premier_L1->antecL;
                premier_L1->antecL=premier_L1->antecL->suivant;
                free(provantecL);
            }
            premier_L1=premier_L1->suivant;
            free(p_antecLL);
        }
        return 0;
    }
     
     
     
     
    void initialisation_structure_antecedent(antecedent *p_antecedent_a_initialiser,int nombre)  //corecte
    {
        int prov=nombre;
    //printf("\nprov=%d",prov);
        int compteur;
        p_antecedent_a_initialiser->impliquant_premier=1;
        p_antecedent_a_initialiser->poids=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
     
            p_antecedent_a_initialiser->pseudo_nombre[NOMBRE_DE_VAR-compteur-1]=prov%2;
            p_antecedent_a_initialiser->poids= p_antecedent_a_initialiser->poids + (prov%2);
            prov=prov/2;
        }
        p_antecedent_a_initialiser->trinaire=antecedent_to_trinaire(p_antecedent_a_initialiser);
    //    affiche_tableau_int("pseudo_nombre",NOMBRE_DE_VAR,*p_antecedent_a_initialiser.pseudo_nombre);
    //    printf("\npoids=%d",*p_antecedent_a_initialiser.poids);
    //affiche_antecedent("\n",*p_antecedent_a_initialiser);
    }
     
    int difference_antecedents(antecedent *antec1, antecedent *antec2)
    {
        int dif=0;
        int indexdif=0;
        int compteur=0;
        while (compteur<NOMBRE_DE_VAR&&dif<2)
        {
            if (antec1->pseudo_nombre[compteur]!=antec2->pseudo_nombre[compteur])
            {
                dif++;
                indexdif=compteur;
            }
     
            compteur++;
        }
     
        if (dif==1)
        {
            return indexdif;
        }
        else
        {
            return -1;
        }
    }
     
    void elimine_doublons_d_une_anteccedentL(antecedentL *antecL)
    {
        antecedentL *antecLp=antecL;
        int taille=0;
        while (antecLp!=NULL)  //on compte le nombre d'éléments de la liste
        {
            taille++;
            antecLp=antecLp->suivant;
        }
        int *tableau=malloc(taille*sizeof(int));
     
     
     
        int compteur,compteur2;  //on remplit un tableau avec les pseudo nombres en base 3
        antecLp=antecL;
      /*  int pseudo_nbr_trinaire;
        for(compteur=0;compteur<taille; compteur++)
        {
            pseudo_nbr_trinaire=0;
            for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
            {
                pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antecLp->antec->pseudo_nombre[compteur2];
            }
            tableau[compteur]=pseudo_nbr_trinaire;
            antecLp=antecLp->suivant;
        }*/
        //remplacé par
        for(compteur=0;compteur<taille; compteur++)
        {
            tableau[compteur]=antecLp->antec->trinaire;
            antecLp=antecLp->suivant;
        }
        //
     
        antecLp=antecL;
        int t;
        for(compteur=0;compteur<taille-1;compteur++)
        {
            compteur2=0;
            t=tableau[compteur+1];
            while (compteur2<=compteur&&t!=tableau[compteur2])
            {
                compteur2++;
            }
            if (t==tableau[compteur2-1])
            {
                supprime_antecedent_dans_antecedentL(antecLp);
            }
            antecLp=antecLp->suivant;
        }
     
    }
     
    void supprime_antecedent_dans_antecedentL(antecedentL* antecL_m1)
    {
        antecedentL *antecL_0=antecL_m1->suivant;
        antecL_m1->suivant=antecL_0->suivant;
     
        free(antecL_0->antec);
        free(antecL_0);
    }
     
    int verif_antec_deja_present_dans_antecedentL(antecedentL *antecL,antecedent *antec)
    {
        int pseudo_nbr_trinaire=antec->trinaire;
        /*int compteur,pseudo_nbr_trinaire=antec->trinaire;
        pseudo_nbr_trinaire=0;
        for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
        {
            pseudo_nbr_trinaire=3*pseudo_nbr_trinaire+antec->pseudo_nombre[compteur];
        }*/
        antecedentL *prov=antecL;
        int pseudo_nbr_trinaire_prov;
        while (prov!=NULL)
        {
            /*pseudo_nbr_trinaire_prov=0;
            for(compteur=0;compteur<NOMBRE_DE_VAR;compteur++)
            {
                pseudo_nbr_trinaire_prov=3*pseudo_nbr_trinaire_prov+prov->antec->pseudo_nombre[compteur];
            }*/
            pseudo_nbr_trinaire_prov=prov->antec->trinaire;
     
            //if (pseudo_nbr_trinaire==pseudo_nbr_trinaire_prov)
            if (pseudo_nbr_trinaire==prov->antec->trinaire)
            {
                return 1;
            }
     
            prov=prov->suivant;
        }
        return 0;
    }
     
    int cardinal_antecL(antecedentL *premier)
    {
        antecedentL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur++;
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int cardinal_antecLL(antecedentLL *premier)
    {
        antecedentLL *prem=premier;
        int compteur=0;
        while (prem!=NULL)
        {
            compteur=compteur+cardinal_antecL(prem->antecL);
            prem=prem->suivant;
        }
        return compteur;
    }
     
    int antecedent_to_trinaire(antecedent *antec)
    {
        int a;
        int s=0;
        for(a=0;a<NOMBRE_DE_VAR;a++)
        {
            s=3*s+antec->pseudo_nombre[a];
        }
        return s;
    }
     
    void decoupe_en_deux_pour_tri_fusion(antecedentL **p_premier,antecedentL **p_premier1,antecedentL **p_premier2)
    {
       // antecedentL *premier1=NULL;
       // antecedentL *premier2=NULL;
        antecedentL *prov=*p_premier;
        int p=1;
        while (*p_premier!=NULL)
        {
            prov=(*p_premier)->suivant;
            if (p==1)
            {
                (*p_premier)->suivant=*p_premier1;
                *p_premier1=*p_premier;
            }
            else
            {
                (*p_premier)->suivant=*p_premier2;
                *p_premier2=*p_premier;
            }
            p=1-p;
            *p_premier=prov;
        }
    }
    void fusion_listes_pour_tri_fusion(antecedentL **p_premier1,antecedentL **p_premier2, antecedentL **p_premier_fus)
    {
        *p_premier_fus=NULL;
        //printf("debut fusion\n");
        antecedentL *prov=NULL;
        antecedentL *provLpoursupression=NULL;
        int prem1trin;
        if (*p_premier1==NULL)
        {
            *p_premier_fus=*p_premier2;
        }
        else if (*p_premier2==NULL)
        {
            *p_premier_fus=*p_premier1;
        }
        else
        {
            prem1trin=(*p_premier1)->antec->trinaire;
            if (prem1trin == (*p_premier2)->antec->trinaire)
            {
                prov=*p_premier1;
                *p_premier1=(*p_premier1)->suivant;
                *p_premier2=(*p_premier2)->suivant;
                while(*p_premier1!=NULL&&(*p_premier1)->antec->trinaire==prem1trin)
                {
                    provLpoursupression=*p_premier1;//pour suprimer les antecedents des doublons
                    *p_premier1=(*p_premier1)->suivant;
                    free(provLpoursupression->antec);//pour suprimer les antecedents des doublons
                    free(provLpoursupression);//pour suprimer les antecedents des doublons
                }
                while(*p_premier2!=NULL&&(*p_premier2)->antec->trinaire==prem1trin)
                {
                    provLpoursupression=*p_premier2;//pour suprimer les antecedents des doublons
                    *p_premier2=(*p_premier2)->suivant;
                    free(provLpoursupression->antec);//pour suprimer les antecedents des doublons
                    free(provLpoursupression);//pour suprimer les antecedents des doublons
                }
                fusion_listes_pour_tri_fusion(p_premier1,p_premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else if ((*p_premier1)->antec->trinaire < (*p_premier2)->antec->trinaire)
            {
                prov=*p_premier1;
                fusion_listes_pour_tri_fusion(&((*p_premier1)->suivant),p_premier2,p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
            else
            {
                prov=*p_premier2;
                fusion_listes_pour_tri_fusion(p_premier1,&((*p_premier2)->suivant),p_premier_fus);
                prov->suivant=*p_premier_fus;
                *p_premier_fus=prov;
            }
        }
     //   printf("fin fusion\n");
    }
     
     
    void elimine_doublons_d_une_anteccedentL_fusion(antecedentL **p_premier)
    {
      //  printf("debut elimine doublons");
      //  printf("avec *p_premier=%d et (*p_premier)->suivant=%d",*p_premier,(*p_premier)->suivant);
      //  affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        if (*p_premier!=NULL&&(*p_premier)->suivant!=NULL) //dans le cas contraire, on ne modifie pas la liste
        {
            antecedentL *null1=NULL;
            antecedentL *null2=NULL;
            antecedentL **p_prem1=&null1,**p_prem2=&null2;
            decoupe_en_deux_pour_tri_fusion(p_premier,p_prem1,p_prem2);
      //      printf("\ndecoupe effectuee");
      //      affiche_liste_de_antecedentL("partie1",*p_prem1);
        //    affiche_liste_de_antecedentL("partie2",*p_prem2);
          //  printf("\n");
            elimine_doublons_d_une_anteccedentL_fusion(p_prem1);
            elimine_doublons_d_une_anteccedentL_fusion(p_prem2);
      //      printf("\nrecurence effectuee");
       //     affiche_liste_de_antecedentL("*p_prem1=",*p_prem1);
        //    affiche_liste_de_antecedentL("*p_prem2=",*p_prem1);
         //   printf("\n");
            fusion_listes_pour_tri_fusion(p_prem1,p_prem2,p_premier);////premier n'est pas modifié
         //   printf("fusion effectuee");
         //   affiche_liste_de_antecedentL("avec *p_premier=",*p_premier);
        }
       // printf("fin elimine doublons\n");
    }
     
    //fonctions d'affichage
     
    void affiche_tableau_int(char *nom,int nombre_d_elements, int *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->%d\n",compteur,tableau[compteur]);
        }
        printf("\n\n");
    }
     
    void affiche_tableau_antecedent(char *nom,int nombre_d_elements, antecedent *tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_d_elements;compteur++)
        {
            printf("%d->",compteur);
            affiche_antecedent(" ",tableau[compteur]);
        }
    }
     
    void affiche_antecedent(char *nom, antecedent antec)
    {
        int compteur2;
        printf("\n%s : ",nom);
        printf("poids=%d, impl prem=%d, pseudo_nbr=",antec.poids,antec.impliquant_premier);
        for(compteur2=0;compteur2<NOMBRE_DE_VAR;compteur2++)
        {
            printf("%d",antec.pseudo_nombre[compteur2]);
        }
        printf("\n");
    }
     
    void affiche_tableau_des_tableaux_des_antecedent_par_poids(char *nom,int nombre_de_tableaux,int *tableau_du_nombre_d_elements_de_chaque_tableau, antecedent **tableau)
    {
        int compteur;
        printf("\n%s\n",nom);
        for(compteur=0;compteur<nombre_de_tableaux;compteur++)
        {
            printf("poids %d",compteur);
            affiche_tableau_antecedent(" ",tableau_du_nombre_d_elements_de_chaque_tableau[compteur],tableau[compteur]);
        }
    }
     
    void affiche_liste_de_antecedentL(char *nom, antecedentL* premier)
    {
        printf("\n%s\n",nom);
        antecedentL *pointeur=premier;
        int x=0;
        while (pointeur!=NULL)
        {
            printf("antecedent n %d ->",x);
            affiche_antecedent("",*(pointeur->antec));
            x++;
            pointeur=pointeur->suivant;
        }
    }
     
    void affiche_liste_de_antecedentLL(char *nom, antecedentLL* premier)
    {
        printf("\n%s\n",nom);
        antecedentLL *pointeur=premier;
        while (pointeur!=NULL)
        {
            affiche_liste_de_antecedentL("",(pointeur->antecL));
            pointeur=pointeur->suivant;
        }
    }
    Avez vous une idée d'où est-ce que j'oublie de libérer des pointeurs?

    Merci d'avance
    katorps

  8. #8
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Un des moyens de trouver le bug est de cibler chaque fonction une à une voir si elle renvoie bien ce qui est prévu...
    Tu parles de la macro assert? Je pense que c'est une étape indispensable pour sécuriser un minimum.

    a+

    Pfeuh

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    De rien

    A la ligne 318, tu fais un malloc() de nouvL et tu ne libères pas à la fin du main. Ce n'est pas bien grave car la mémoire est normalement libérée en sortie du main() avec les OS modernes Pour être totalement propre, tu peux rajouter free(). D'ailleurs, il doit y avoir le même genre d'erreur dans le main mais comme tu n'as pas du passer dans tous les if(), seule cette erreur a été repérée. Il faut bien être conscient que l'outil exécute ton programme et signale les erreurs rencontrées. Il y a potentiellement des erreurs dans les parties du code qui n'ont pas été exécutées.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu ne programmes pas assez défensivement. Tu devrais déclarer tes paramètres pointeurs const quand la fonction ne modifie pas les données pointées.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

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

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    Merci du conseil, ça pourrait servir.

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

Discussions similaires

  1. Une requête qui donne des doublons dans les résultats
    Par HDR_16 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/04/2014, 18h51
  2. [sql2005]trigger qui s'éxecte sur toutes les lignes
    Par malikoo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/07/2006, 12h33
  3. tableau qui a deux couleur pour les lignes <td>
    Par abdess6600 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 23/05/2006, 16h50
  4. Numéro Auto qui se réinitialise à 1 tous les jours!
    Par R0cKW|LDeR dans le forum Access
    Réponses: 11
    Dernier message: 02/02/2006, 22h05
  5. replace() qui s'applique sur toutes les occurences
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/03/2005, 11h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo