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 :

Problème de mémoire - Ajout sur un tableau de structure alloué dynamiquement


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut Problème de mémoire - Ajout sur un tableau de structure alloué dynamiquement
    Bonjour à tous,

    J'ai un petit souci avec mon programme.
    Je dois réaliser une base de données de cinéma. J'utilise pour cela trois tableaux de structures (films, acteurs, realisateurs) et
    pour chaque tableau, j'alloue au moment de l'ajout d'un nouvelle case mémoire pour stocker ma nouvelle structure. Cependant, parfois mon programme me renvoie mon message d'erreur qui spécifie qu'il n'y a plus assez de mémoire. Tantôt, il fonctionne très bien (surtout dans le cas du debbug) et quelques fois, il se plante avec une fenêtre (explicite comme tout) projetXXX à cesser de fonctionner.

    Une petite idée de déblocage serait la bienvenue

    Voilà un bout de code ( la déclaration et l'allocation ):

    Nom : test.png
Affichages : 264
Taille : 14,5 Ko

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par etoosene Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    idFilm++
    films=(struct film*)malloc(idFilm * sizeof(struct film))
    Bonjour

    Ca te fatiguait trop de copier/coller ton code ??? Tu crois qu'on travaille efficacement avec une image ??? Et donc parce que t'as la flemme d'écrire c'est à nous de le faire à ta place !!!

    Ton erreur est ici. Tu alloues à chaque fois n éléments (n montant de +1 à chaque itération). Donc non seulement à l'itération "n" tu alloues "n" éléments (alors que les "n-1" ont déjà été alloués à l'itération "n-1") mais en plus la mémoire des "n-1" est alors perdue puisque le nouveau malloc() va être stocké à chaque fois dans la même variable "films".
    Total: consommation mémoire phénoménale (au bout de "n" itérations tu auras alloué au total n*(n-1)/2 éléments, c'est compréhensible que ton système sature) et fuite mémoire puisque au bout de "n" itération tu auras perdu (n-1)*(n-2)/2 élément

    Citation Envoyé par etoosene Voir le message
    j'alloue au moment de l'ajout d'un nouvelle case mémoire pour stocker ma nouvelle structure
    C'est con, quand j'ai lu ça j'ai cru que tu avais programmé une liste chainée ce qui est la meilleure des solutions. Bon en lisant ton code j'ai vite déchanté.
    Donc soit tu travailles à base de realloc (et non de malloc) soit à base de liste chainée. Le gros inconvénient de realloc c'est qu'il demande à chaque fois une quantité de mémoire contigüe donc s'il ne peut pas agrandir la zone allouée, il est obligé de la déplacer ce qui peut être consommateur...
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Ca te fatiguait trop de copier/coller ton code ??? Tu crois qu'on travaille efficacement avec une image ??? Et donc parce que t'as la flemme d'écrire c'est à nous de le faire à ta place !!!
    Désolé pour l'image (coooool ^^, loin de moi, l'idée de te faire chier )

    Citation Envoyé par Sve@r Voir le message
    Ton erreur est ici. Tu alloues à chaque fois n éléments (n montant de +1 à chaque itération). Donc non seulement à l'itération "n" tu alloues "n" éléments (alors que les "n-1" ont déjà été alloués à l'itération "n-1") mais en plus la mémoire des "n-1" est alors perdue puisque le nouveau malloc() va être stocké à chaque fois dans la même variable "films".
    Total: consommation mémoire phénoménale (au bout de "n" itérations tu auras alloué au total n*(n-1)/2 éléments, c'est compréhensible que ton système sature) et fuite mémoire puisque au bout de "n" itération tu auras perdu (n-1)*(n-2)/2 élément

    Je crois que tu viens de me faire comprendre quelque chose que j'avais raté en cours x). En effet, maintenant je me sens tout con d'avoir pas vu le fait que je réinitialisais mon tableau. Merci ^^
    Je vais essayer de le faire en liste chaînée et d'apprendre en même temps la notion.

    Merci pour ton aide encore

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par etoosene Voir le message
    Je vais essayer de le faire en liste chaînée et d'apprendre en même temps la notion.
    ici un exemple simple de liste chainée...
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    ici un exemple simple de liste chainée...
    Je reviens vers toi, après quelques efforts qui ont payé mais pas suffisamment

    Alors voilà,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "cinematheque.h"
    #define NULL ((void *)0)
     
    int main()
    {
        list_personnage *list_person;
        list_film *listfilm;
        element_film *elt_film;
        element_personnage *elt_person;
        struct film *movie;
     
        if(list_person = (list_personnage *) malloc(sizeof(list_personnage)) == NULL)
        {
            return -1;
        }
        if(listfilm = (list_film *) malloc(sizeof(list_film)) == NULL)
        {
            return -1;
        }
     
        /** Initialisation **/
        list_film_init(&listfilm);
        list_person_init(&list_person);
     
        if(movie = (struct film *) malloc(sizeof(struct film)) == NULL)
        {
            return -1;
        }
        if(movie != NULL)
        {
            movie->annee_sortie = 2014;
            movie->duree = 75;
            movie->idRea = 1;
            movie->id_film = 1;
            movie->titre = "Seven";
            movie->type = "Action";
        }
     
        //int retour = ins_film_end_of_list(&listfilm, &listfilm->first_elt , &movie);
     
     
        return 0;
    }
    Voilà !!
    Mon problème est que la fonction malloc renvoie tout le temps NULL

    Merci pour ton aide AGAIN x)

    Mon fichier cinematheque.h
    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
     
    #ifndef CINEMATHEQUE_H_INCLUDED
    #define CINEMATHEQUE_H_INCLUDED
     
    /********** Les structures listes chainees *************/
     
    /* Représentation des personnages */
    struct person
    {
        int idPerson; /** N° d'identification de l'acteur ou du realisateur **/
        int estRea;
        int estAct;
        char *name;
        char *first_name;
        char *date_of_birth;
        char *nationality;
    };
     
    typedef struct element_personnage{
     
        struct person *person;
        struct element_personnage *next_personnage;
    }element_personnage;
     
    typedef struct list_personnage
    {
        struct element_personnage *first_person;
        struct element_personnage *last_person;
        int size_list_personnage;
     
    }list_personnage;
     
    /* Représentation des films */
    struct film
    {
        int id_film; /** N° d'identification du film **/
        char *titre;
        int annee_sortie;
        int idRea;
        list_personnage *listpersonnage;
        int duree; /** en minutes **/
        char **type;
    };
     
    typedef struct element_film
    {
     
        struct film *film;
        struct element_film *next_film;
     
    }element_film;
     
    typedef struct list_film
    {
        struct element_film *first_elt;
        struct element_film *last_elt;
        int size_list_film;
     
    }list_film;
     
                    /********** LES FONCTIONS ET PROCEDURES **********/
     
        /** Les fonctions d'initialisation des listes **/
    void list_person_init(list_personnage *list_person);
    void list_film_init(list_film *list_film);
     
        /** Les fonctions d'insertion dans les listes chainees et de créations de structures de personnage et de films **/
    /* Création d'une structure film */
    int create_film(int id_film, list_personnage *list_personnage, element_film *element_film, element_personnage *element_personnage);
    /* Création d'une structure personnage */
    int create_personnage(int id_personnage, element_personnage *element_personnage);
    /* Insertion d'un film à la fin de la liste */
    int ins_film_end_of_list(list_film *list_film, element_film *film_courant, struct film *film);
    /* Insertion d'un personnage à la fin de la liste */
    int ins_person_end_of_list(list_personnage *list_person, element_personnage *person_courant, struct person *person);
    /* Ajout d'un acteur pour un film */
    int add_actor_film(element_film *element_film, int id_person);
     
        /** Les fonctions de suppression **/
    int deleteFilm(list_film *list_film, int pos);
    int deletePersonnage(list_personnage *list_personnage, int pos);
    int delete_begenning_list_film(list_film *list_film);
    int delete_begenning_list_personnage(list_film *list_film);
     
        /** Les fonctions d'affichages **/
    /* Affiche un film a partir de son id */
    void show_film(int id,list_film *list_film);
    /* Affiche un personnage a partir de son id */
    void show_personnage(int id,list_personnage *list_personnage);
    /* Affiche les films d'un acteur ou d'un réalisateur donné */
    void show_films_personnage(int id, list_personnage *list_film);
    /* Affiche les films d'un acteur donné */
    void show_all_personnage(list_personnage *list_personnage);
    /* Affiche tous les films présents */
    void show_all_films(list_film *list_film);
    /* Affiche tous les acteurs */
    void show_all_actors(list_personnage *list_personnage);
    /* Affiche tous les réalisateurs */
    void show_all_realisators(list_personnage *list_personnage);
     
     
    	/** Les fonctions de recherche **/
    /* Recherche un film par son nom (On ne tient pas rigueur de la casse) */
    int search_by_personnage(list_personnage *list_personnage);
    /* Recherche un film par son nom (On ne tient pas rigueur de la casse) */
    int search_by_film(list_film *list_film);
    /* Récupère un personnage à travers son id */
    struct person* get_personnage_by_id(int id, list_personnage *list_personnage);
     
     
        /** Les fonctions de test **/
    /* Teste si la valeur passé en paramètre est un entier ou une chaine */
    int test_entier(const char *s);
    /* Teste si le personnage est un acteur */
    int isActor(element_personnage *elt_personnage);
    /* Vérifie si la liste contient un acteur */
    int check_actor(list_personnage *list_personnage);
    /* Vérifie si la liste contient un réalisateur */
    int check_realisator(list_personnage *list_personnage);
     
        /** Les fonctions de destruction des listes **/
    void destroy_list_film(list_film *list_film);
    void destroy_list_personnage(list_personnage *list_personnage);
     
    #endif // CINEMATHEQUE_H_INCLUDED
    Le fichier associé cinematheque.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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include "cinematheque.h"
    #define NULL ((void *)0)
     
     
    void list_person_init(list_personnage *list_person)
    {
        list_person->first_person = NULL;
        list_person->last_person = NULL;
        list_person->size_list_personnage = 0;
    }
     
    void list_film_init(list_film *listfilm)
    {
        listfilm->first_elt = NULL;
        listfilm->last_elt = NULL;
        listfilm->size_list_film = 0;
    }
     
    void show_all_actors(list_personnage *list_personnage)
    {
        element_personnage *elt_personnage = list_personnage->first_person;
        while(elt_personnage != NULL)
        {
            if(elt_personnage->person->estAct == 1)
                show_personnage(elt_personnage->person->idPerson, list_personnage);
            elt_personnage = elt_personnage->next_personnage;
        }
    }
     
    void show_all_realisators(list_personnage *list_personnage)
    {
        element_personnage *elt_personnage = list_personnage->first_person;
        while(elt_personnage != NULL)
        {
            if(elt_personnage->person->estRea == 1)
                show_personnage(elt_personnage->person->idPerson, list_personnage);
            elt_personnage = elt_personnage->next_personnage;
        }
    }
     
    int create_personnage(int id_personnage, element_personnage *element_personnage)
    {
        char reponse;
        do
        {
            printf("Veuillez saisir le nom du personnage : ");
            fflush(stdin);
            scanf("%s",element_personnage->person->name);
        }
        while(test_entier(element_personnage->person->name) == 1);
        do
        {
            printf("Veuillez saisir le prenom du personnage : ");
            fflush(stdin);
            scanf("%s",element_personnage->person->first_name);
        }
        while(test_entier(element_personnage->person->first_name) == 1);
        do
        {
          printf("Veuillez saisir la date de naissance du personnage : ");
            fflush(stdin);
            fgets (element_personnage->person->date_of_birth, 25, stdin);
        }
        while(test_entier(element_personnage->person->date_of_birth) == 1);
        char *retour_chariot;
        retour_chariot=strchr(&element_personnage->person->date_of_birth,'\n');
        *retour_chariot = '\0';
        do
        {
            printf("Veuillez saisir la nationalite du personnage : ");
            fflush(stdin);
            fgets (element_personnage->person->nationality, 25, stdin);
        }
        while(test_entier(element_personnage->person->nationality) == 1);
        do
        {
            printf("Ce personnage est-il un acteur ? (repondre par 'o' pour Oui ou 'n' pour Non\n");
            fflush(stdin);
            scanf("%c",&reponse);
        }
        while(toupper(reponse) != 'O' && toupper(reponse) != 'N');
     
        if(reponse == 'O')
        {
            element_personnage->person->estRea = 1;
        }
        else
        {
            element_personnage->person->estRea = 0;
        }
     
        do
        {
            printf("Ce personnage est-il un realisateur ? (repondre par 'o' pour Oui ou 'n' pour Non\n");
            fflush(stdin);
            scanf("%c",&reponse);
        }
        while(toupper(reponse) != 'O' && toupper(reponse) != 'N');
     
        if(reponse == 'O')
        {
            element_personnage->person->estRea = 1;
        }
        else
        {
            element_personnage->person->estRea = 0;
        }
        element_personnage->person->idPerson = id_personnage;
     
        return 0;
    }
     
    int create_film(int id_film,list_personnage *list_personnage, element_film *element_film, element_personnage *element_personnage)
    {
        int annee_sortie = 0,duree = 0, nb_real = 0, nb_genre,nb_acteur,i = 0, j = 0;
        char reponse;
        do
        {
            printf("Veuillez saisir le titre du film : ");
            fflush(stdin);
            fgets (element_film->film->titre, 25, stdin);
        }
        while(test_entier(element_film->film->titre) == 1);
        do
        {
            printf("Veuillez saisir l'annee de sortie : ");
            fflush(stdin);
        }
        while(!scanf("%d",&annee_sortie));
        element_film->film->annee_sortie = annee_sortie;
        do
        {
            printf("Veuillez saisir la duree du film (en minutes): ");
            fflush(stdin);
        }
        while(!scanf("%d",&duree));
        element_film->film->duree = duree;
     
        /** Le type du film **/
        printf("Ajoutez un genre pour le film ('o' pour Oui et 'n' pour Non)\n");
        do
        {
            printf("Choisir parmi : 1.Action 2.Horreur 3.Comedie 4.Documentaire 5.Policier 6.Drame 7.Animation 8.Science-fiction (indiquez le numero)\n");
            fflush(stdin);
            scanf("%d",&nb_genre);
            fflush(stdin);
     
            /** Enregistrement du genre **/
            switch (nb_genre)
            {
                case 1 :
                    element_film->film->type[i][7] = *("Action");
                break;
                case 2 :
                    element_film->film->type[i][8] = *("Horreur");
                break;
                case 3 :
                    element_film->film->type[i][8] = *("Comedie");
                break;
                case 4 :
                    element_film->film->type[i][13] = *("Documentaire");
                break;
                case 5 :
                    element_film->film->type[i][8] = *("Policier");
                break;
                case 6 :
                    element_film->film->type[i][6] = *("Drame");
                break;
                case 7 :
                    element_film->film->type[i][10] = *("Animation");
                break;
                case 8 :
                    element_film->film->type[i][16] = *("Science-fiction");
                break;
                default :
                break;
            }
     
            printf("Voulez-ajouter encore un genre ? ('o' pour Oui et 'n' pour Non)\n");
            scanf("%c",&reponse);
            i++;
        }
        while(toupper(reponse) == 'O');
     
     
        /** Ajout des acteurs pour ce film **/
            j = 0;
            i = 0;
            do
            {
                printf("Choisir parmi les acteurs existants ? (Repondre par Oui 'o' ou Non 'n')\n");
                fflush(stdin);
                scanf("%c", &reponse);
     
                if(toupper(reponse) == 'O')
                {
                    /* Affichage des acteurs existants */
                    if(list_personnage->size_list_personnage > 1 && check_actor(list_personnage) == 1)
                    {
                        printf("Liste des acteurs existants : \n\n");
                        show_all_actors(list_personnage);
                        printf("\nVeuillez indiquer le numero de l'acteur parmi les numeros au dessus\n");
                        fflush(stdin);
                        scanf("%d",&nb_acteur);
                        fflush(stdin);
                        if(j == 0)
                        {
                            struct element_personnage *new_elt;
                            if((new_elt = (struct element_personnage *)malloc(sizeof(struct element_personnage))) == NULL)
                            {
                                free(element_film->film);
                                return -1;
                            }
                            new_elt->person == get_personnage_by_id(nb_acteur, list_personnage);
                            if(new_elt->person != NULL)
                            {
                                element_film->film->listpersonnage->first_person = new_elt;
                                element_film->film->listpersonnage->last_person = NULL;
                            }
                            else
                            {
                                free(element_film->film);
                                return -1;
                            }
                        }
                        else
                        {
                            struct element_personnage *new_elt;
                            if((new_elt = (struct element_personnage *) malloc(sizeof(struct element_personnage))) == NULL)
                            {
                                return -1;
                            }
                            new_elt->person = get_personnage_by_id(nb_acteur, list_personnage);
                            if(new_elt->person != NULL)
                            {
                                element_film->film->listpersonnage->last_person->next_personnage = new_elt;
                                element_film->film->listpersonnage->last_person->next_personnage->next_personnage = NULL;
                            }
                            else
                            {
                                free(element_film->film);
                                return -1;
                            }
                        }
                        j++;
                    }
                    else
                        printf("Aucun acteur n'est enregistre dans la base de donnees\n");
                }
                else
                {
                    /* Ajout acteur */
                    create_personnage(element_film->film->listpersonnage->last_person->person->idPerson+1,element_film->film->listpersonnage->last_person);
     
                    if(j == 0)
                    {
                        struct element_personnage *new_elt;
                        if((new_elt = (struct element_personnage *)malloc(sizeof(struct element_personnage))) == NULL)
                        {
                            return -1;
                        }
                        new_elt->person = get_personnage_by_id(element_film->film->listpersonnage->last_person->person->idPerson+1, list_personnage);
                        if(new_elt->person != NULL)
                        {
                            element_film->film->listpersonnage->first_person = new_elt;
                            element_film->film->listpersonnage->last_person = NULL;
                        }
                        else
                        {
                            free(element_film->film);
                            return -1;
                        }
                    }
                    else
                    {
                        struct element_personnage *new_elt;
                        if((new_elt = (struct element_personnage *) malloc(sizeof(struct element_personnage))) == NULL)
                        {
                            return -1;
                        }
                        new_elt->person = get_personnage_by_id(element_film->film->listpersonnage->last_person->person->idPerson+1, list_personnage);
                        if(new_elt->person != NULL)
                        {
                            element_film->film->listpersonnage->last_person->next_personnage = new_elt;
                            element_film->film->listpersonnage->last_person->next_personnage->next_personnage = NULL;
                        }
                        else
                        {
                            free(element_film->film);
                            return -1;
                        }
                    }
                    j++;
                }
                printf("Ajouter un acteur pour ce film ? (Repondre par Oui 'o' ou Non 'n')\n");
                fflush(stdin);
                scanf("%c", &reponse);
            }
            while(toupper(reponse) == 'O');
     
        /** Ajout du réalisateur pour ce film **/
        do
        {
            printf("Choisir parmi les realisateurs existants ? (Repondre par Oui 'o' ou Non 'n')\n");
            fflush(stdin);
            scanf("%c", &reponse);
     
            if(toupper(reponse) == 'O')
            {
                /* Afficher les realisateurs existants */
                j= 0;
                if(list_personnage->size_list_personnage > 1 && check_realisator(list_personnage) == 1)
                {
                    printf("Liste des realisateurs existants : \n\n");
                    show_all_realisators(list_personnage);
                    printf("\nVeuillez indiquer le numero du realisateur parmi les numeros au dessus\n");
                    fflush(stdin);
                    scanf("%d",&nb_real);
                    fflush(stdin);
                    if(j == 0)
                    {
                        struct element_personnage *new_elt;
                        if((new_elt = (struct element_personnage *)malloc(sizeof(struct element_personnage))) == NULL)
                        {
                            return -1;
                        }
                        new_elt->person = get_personnage_by_id(nb_acteur, list_personnage);
                        element_film->film->listpersonnage->first_person = new_elt;
                        element_film->film->listpersonnage->last_person = NULL;
                        new_elt->next_personnage = NULL;
                    }
                    else
                    {
                        struct element_personnage *new_elt;
                        if((new_elt = (struct element_personnage *) malloc(sizeof(struct element_personnage))) == NULL)
                        {
                            return -1;
                        }
                        new_elt->person = get_personnage_by_id(nb_acteur, list_personnage);
                        element_film->film->listpersonnage->last_person->next_personnage = new_elt;
                        element_film->film->listpersonnage->last_person->next_personnage = NULL;
                    }
                    j++;
                }
                else
                    printf("Aucun realisateur n'est enregistre dans la base de donnees\n");
            }
            else
            {
                    /* Ajout realisateur */
                    create_personnage(element_film->film->listpersonnage->last_person->person->idPerson+1,element_film->film->listpersonnage->last_person);
     
                    if(j == 0)
                    {
                        struct element_personnage *new_elt;
                        if((new_elt = (struct element_personnage *)malloc(sizeof(struct element_personnage))) == NULL)
                        {
                            return -1;
                        }
                        new_elt->person = get_personnage_by_id(element_film->film->listpersonnage->last_person->person->idPerson+1, list_personnage);
                        element_film->film->listpersonnage->first_person = new_elt;
                        element_film->film->listpersonnage->last_person = NULL;
                        new_elt->next_personnage = NULL;
                    }
                    else
                    {
                        struct element_personnage *new_elt;
                        if((new_elt = (struct element_personnage *) malloc(sizeof(struct element_personnage))) == NULL)
                        {
                            return -1;
                        }
                        new_elt->person = get_personnage_by_id(element_film->film->listpersonnage->last_person->person->idPerson+1, list_personnage);
                        element_film->film->listpersonnage->last_person->next_personnage = new_elt;
                        element_film->film->listpersonnage->last_person->next_personnage = NULL;
                    }
            }
        }
        while(toupper(reponse) != 'O' && toupper(reponse) != 'N');
     
        element_film->film->id_film = id_film;
     
        return 0;
    }
     
    int ins_person_end_of_list(list_personnage *list_personnage,element_personnage *element_personnage,struct person *person)
    {
        struct element_personnage *new_elt;
        if((new_elt = (struct element_personnage *)malloc(sizeof(struct element_personnage))) == NULL)
        {
            return -1;
        }
        new_elt->person = person;
        element_personnage->next_personnage = new_elt;
        new_elt->next_personnage = NULL;
     
        list_personnage->last_person = new_elt;
        list_personnage->size_list_personnage++;
     
        return 0;
    }
     
    int ins_film_end_of_list(list_film *list_film, element_film *elt_film,struct film *film)
    {
        return -1;
        element_film *new_elt;
        if((new_elt = (element_film *)malloc(sizeof(element_film))) == NULL)
        {
            return -1;
        }
        new_elt->film = film;
     
        elt_film->next_film = new_elt;
        new_elt->next_film = NULL;
     
        list_film->last_elt = new_elt;
        list_film->size_list_film++;
     
        return 0;
    }
     
    int deletePersonnage(list_personnage *list_personnage, int pos)
    {
        if(list_personnage->size_list_personnage <= 1 || pos < list_personnage->size_list_personnage)
        {
            return -1;
        }
        int i;
        element_personnage *current_elt;
        element_personnage *elt_to_delete;
        current_elt = list_personnage->first_person;
     
        for(i = 0; i < pos; i++)
        {
            current_elt = current_elt->next_personnage;
        }
     
        elt_to_delete = current_elt->next_personnage;
        current_elt->next_personnage = current_elt->next_personnage->next_personnage;
        if(current_elt->next_personnage == NULL)
        {
            list_personnage->last_person = current_elt;
        }
        free(elt_to_delete->person);
        free(elt_to_delete);
        list_personnage->size_list_personnage--;
     
        return 0;
    }
     
    int deleteFilm(list_film *list_film, int pos)
    {
        if(list_film->size_list_film <= 1 || pos < list_film->size_list_film)
        {
            return -1;
        }
        int i;
        element_film *current_elt;
        element_film *elt_to_delete;
        current_elt = list_film->first_elt;
     
        for(i = 0; i < pos; i++)
        {
            current_elt = current_elt->next_film;
        }
     
        elt_to_delete = current_elt->next_film;
        current_elt->next_film = current_elt->next_film->next_film;
        if(current_elt->next_film == NULL)
        {
            list_film->last_elt = current_elt;
        }
        free(elt_to_delete->film);
        free(elt_to_delete);
        list_film->size_list_film--;
     
        return 0;
    }
     
    void show_film(int id, list_film *list_film)
    {
     
    }
     
    void show_personnage(int id,list_personnage *list_personnage)
    {
     
    }
     
    void show_all_films(list_film *list_film)
    {
        element_film *elt_film;
        elt_film = list_film->first_elt;
        while(elt_film != NULL)
        {
            show_film(elt_film->film->id_film, list_film);
        }
    }
     
    int delete_begenning_list_film(list_film *list_film)
    {
        if(list_film->size_list_film == 0)
        {
            return -1;
        }
        element_film *elt_to_delete;
        elt_to_delete = list_film->first_elt;
        list_film->first_elt = list_film->first_elt->next_film;
        if(list_film->size_list_film == 1)
        {
            list_film->last_elt = NULL;
        }
        free(elt_to_delete->next_film);
        free(elt_to_delete);
     
        return 0;
    }
     
    void destroy_list_film(list_film *list_film)
    {
        while(list_film->size_list_film > 0)
        {
            delete_begenning_list_film(list_film);
        }
    }
     
     
    int isActor(element_personnage *elt_personnage)
    {
        if(elt_personnage->person->estAct == 1)
        {
            return 1;
        }
        else return 0;
    }
     
    int isRealisator(element_personnage *elt_personnage)
    {
        if(elt_personnage->person->estRea == 1)
        {
            return 1;
        }
        else return 0;
    }
     
    int check_actor(list_personnage *list_personnage)
    {
        element_personnage *elt_personnage = list_personnage->first_person;
        int nb = 0;
        while(elt_personnage != NULL)
        {
            if(elt_personnage->person->estAct == 1)
            {
                nb++;
            }
            else
            {
                elt_personnage = elt_personnage->next_personnage;
            }
        }
        if(nb != 0)
            return 1;
        else
            return 0;
    }
     
    int check_realisator(list_personnage *list_personnage)
    {
        element_personnage *elt_personnage = list_personnage->first_person;
        int nb = 0;
        while(elt_personnage != NULL)
        {
            if(elt_personnage->person->estRea == 1)
            {
                nb++;
            }
            else
            {
                elt_personnage = elt_personnage->next_personnage;
            }
        }
        if(nb != 0)
            return 1;
        else
            return 0;
    }
     
     
    int add_actor_film(element_film *element_film, int id_person)
    {
     
    }
     
    struct person* get_personnage_by_id(int id_person, list_personnage *list_personnage)
    {
       element_personnage *elt_personnage = list_personnage->first_person;
       struct person *person_result = NULL;
       while(elt_personnage != NULL)
       {
           if(elt_personnage->person->idPerson != id_person)
           {
               elt_personnage = elt_personnage->next_personnage;
           }
           else
           {
                person_result = elt_personnage->person;
           }
       }
       if(person_result != NULL)
       {
           return person_result;
       }
       else
       {
           return NULL;
       }
    }
     
    /**
     * Tester si la valeur passé en paramètre est un entier ou une chaine
     */
    int test_entier(const char *s)
    {
        int x;
        char *espace;
        espace=strchr(s,' ');
        if((sscanf(s,"%d",&x) == 1) && espace == NULL)
            return 1;
        else
            return 0;
    }

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par etoosene Voir le message
    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
     
    int main()
    {
        list_personnage *list_person;
        list_film *listfilm;
        element_film *elt_film;
        element_personnage *elt_person;
        struct film *movie;
     
        if(list_person = (list_personnage *) malloc(sizeof(list_personnage)) == NULL)
        {
            return -1;
        }
        if(listfilm = (list_film *) malloc(sizeof(list_film)) == NULL)
        {
            return -1;
        }
     
    }
    Voilà !!
    Mon problème est que la fonction malloc renvoie tout le temps NULL
    Et tu as étudié les priorité des opérateurs ? Surtout celle de l'opérateur "=" (affectation) face à celle de l'opérateur "==" (comparaison)...???

    Accessoirement t'es pas obligé de caster le malloc (mais comme ce n'est pas interdit c'est comme tu le sens). Ceci dit, si le malloc de "listfilm" échoue alors que le malloc de "list_person" réussi ben c'est dommage pour la fuite mémoire...

    Au fait, t'as une variable "list_personnage" de type "list_person", une variable "listfilm" de type "list_film". Tu t'en sortiras pour te relire ou te faudra un dico ? T'es pas allé voir mon exemple de liste chainée et la façon dont je créais et nommais mes types???...

    Citation Envoyé par etoosene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void list_person_init(list_personnage *list_person);
    void list_film_init(list_film *list_film);
    ...
     
    int main(
    {
        list_personnage *list_person;
        list_film *listfilm;
     
         /** Initialisation **/
        list_film_init(&listfilm);
        list_person_init(&list_person);
    ... apparemment pas. T'as pas remarqué que moi c'étaient des types complets dont je passais l'adresse. Toi, ce sont des pointeurs dont tu passes l'adresse. Si "listfilm" est une variable de type "list_film*", alors "&listfilm" sera une variable de type "list_film**" et ça ne correspondra pas à ton prototype (qui attend un "list_film*"). Suis même pas sûr que ça compile ça...
    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]

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    C'est bon, problème réglé, c'est magnifique, je commence à prendre mon pied avec C

    Si ça peut en aider d'autres, je poste le programme principale

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "cinematheque.h"
    #define NULL ((void *)0)
     
    int main()
    {
        list_personnage *list_person;
        list_film *listfilm;
        element_film *elt_film;
        element_personnage *elt_person;
        struct film *movie;
     
        list_person = (list_personnage *) malloc(sizeof(list_personnage));
        if(list_person == NULL)
        {
            return -1;
        }
        else
        {
           list_person_init(list_person);
           list_person->first_person = (element_personnage *) malloc(sizeof(element_personnage));
           if(list_person->first_person == NULL)
           {
               return -1;
           }
           list_person->last_person = (element_personnage *) malloc(sizeof(element_personnage));
           if(list_person->last_person == NULL)
           {
               return -1;
           }
           list_person->size_list_personnage = 0;
        }
     
        listfilm = (list_film *) malloc(sizeof(list_film));
        if(listfilm == NULL)
        {
            return -1;
        }
        else
        {
           list_film_init(listfilm);
           listfilm->first_elt = (element_film *) malloc(sizeof(element_film));
           if(listfilm->first_elt == NULL)
           {
               return -1;
           }
           listfilm->last_elt = (element_film *) malloc(sizeof(element_film));
           if(listfilm->last_elt == NULL)
           {
               return -1;
           }
           listfilm->size_list_film = 0;
        }
     
        /** Initialisation **/
        movie = (struct film *) malloc(sizeof(struct film));
        if(movie == NULL)
        {
            return -1;
        }
        else
        {
            movie->annee_sortie = 2014;
            movie->duree = 75;
            movie->idRea = 1;
            movie->id_film = 1;
            movie->titre = "Seven";
            movie->type = "Action";
        }
     
        int retour = ins_film_end_of_list(listfilm, listfilm->first_elt , movie);
     
        show_film(1,listfilm);
     
        return 0;
    }
    Voilà les modifications apportées sur le fichier cinematique.c aussi
    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
    int ins_film_end_of_list(list_film *list_film, element_film *elt_film,struct film *film)
    {
        element_film *new_elt;
        new_elt = (element_film *)malloc(sizeof(element_film));
        if(new_elt == NULL)
        {
            return -1;
        }
        new_elt->film = (struct film *)malloc(sizeof(struct film));
        if(new_elt->film  == NULL)
        {
            return -1;
        }
        new_elt->film = film;
     
        elt_film->next_film = new_elt;
        new_elt->next_film = NULL;
     
        list_film->last_elt = new_elt;
        list_film->size_list_film++;
     
        return 0;
    }

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et tu as étudié les priorité des opérateurs ? Surtout celle de l'opérateur "=" (affectation) face à celle de l'opérateur "==" (comparaison)...???
    Merci, je l'ai vu au moment ou t'as envoyé ce message. J'avoue que c'était une vraie erreur de débutant. Trop de précipitations x)

    Citation Envoyé par Sve@r Voir le message
    Accessoirement t'es pas obligé de caster le malloc (mais comme ce n'est pas interdit c'est comme tu le sens). Ceci dit, si le malloc de "listfilm" échoue alors que le malloc de "list_person" réussi ben c'est dommage pour la fuite mémoire...
    Ah...j'avais pas vu ça mais c'est un coup à me faire passer une veillée ces genres d'erreurs x)[/QUOTE]

    Citation Envoyé par Sve@r Voir le message
    Au fait, t'as une variable "list_personnage" de type "list_person", une variable "listfilm" de type "list_film". Tu t'en sortiras pour te relire ou te faudra un dico ? T'es pas allé voir mon exemple de liste chainée et la façon dont je créais et nommais mes types???...
    J'arrive à me retrouver, mes profs m'ont toujours fait la remarque mais j'ai jamais été créatif dans ce domaine . J'ai vu ton exemple et d'ailleurs crois mois je m'en suis inspiré en plus d'un autre support

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

Discussions similaires

  1. Tableau de structure alloué dynamiquement
    Par vince85 dans le forum Débuter
    Réponses: 9
    Dernier message: 06/12/2010, 09h40
  2. Réponses: 8
    Dernier message: 17/09/2008, 12h11
  3. Problème de taille 100% sur un tableau
    Par Oberown dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 16/07/2007, 07h49
  4. Réponses: 15
    Dernier message: 04/06/2007, 01h53

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