Bonjour,
je suis en ce moment sur un projet de fin d'année en C et il se trouve que dans le cahier des charges, il nous est demandé de réaliser une location de salle pour un établissement scolaire (jusque là rien de bien chinois). Le problème survient lorsque notre ADT concernant les locations de salles se voit greffer une liste des participants lors de la location (simple liste des ID des profs ou étudiants) tout en vérifiant bien que la capacité de la salle n'est pas dépassée.
Voici l'adt (à savoir que tous les autres éléments du projet ne sont pas mentionné car fonctionnels):
La Liste des participants étant une liste d'ID, il s'agit donc de la gérer dynamiquement jusqu'à la limite de capacité de la salle. Le problème c'est que la structure TLocationLoc est un tableau dynamique lui aussi mais le problème c'est que lorsque l'on tente de faire ceci le programme nous renvoie une violation d'acces:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 typedef struct { char MatrL[9]; /**< ID du locataire */ char TypeL; /**< Type de locataire (prof , élève) */ char LocL[5]; /**< ID Local Loué */ TDate dDLoca; /**< Date à laquelle commence la location */ TDate dFLoca; /**< Date Fin de location */ THeure HeureD; /**< Heure de début location */ THeure Duree; /**< Durée de location d'un local */ char Motif[STRLEN]; /**< Motif de la réservation */ int CountPers; /**< Compteur de personnes */ char** ListePart; /**< Liste participant */ } TLocationLoc; /**< Location dépendante d'un local */
(Ceci est le récumé de la partie qui nous intéresse, la fonction est en réalité bcp plus longue)
Ce qui est fourni comme explication par le debugger est simplement une confirmation du sigsegv c'est-à-dire: Cannot acces to memory at "adresse_hexa". pour la ligne qui fournit une erreur.
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 int ajouteLocaLoc(TLocationLoc** lo, int* nb, TPersonnel* p, int nbP, TEtu* e, int nbE, TLocal* l, int nbL) { TLocationLoc* tmp = NULL; int n = 0; int x = 0; int nbPl = 0; int j = 0; if(!(tmp = (TLocationLoc*) realloc((*lo), sizeof(TLocationLoc)))) return -98; n = (*nb) + 1; nbPl = l[x].nbPlaces; tmp[n].ListePart = (char**) malloc(nbPl*sizeof(char)); <--- Instruction qui plante (SIGSEGV) for(j = 0; j < nbPl; j++) { tmp[n].ListePart[j] = (char*) malloc(9*sizeof(char)); } free(tmp); return 0; }
Nous avons déjà tenté de réaliser un type TListe contenant un seul élément char Matr[9];
Mais même problème.
Il semble que ce soit l'accès via le tmp[n].ListePart qui ne soit pas bon mais là où on a du mal à suivre c'est que tout les autre élément du type TLocationLoc sont accessibles via tmp[n].ELEMENT.
Si quelqu'un a une quelconque idée de cette erreur de code qui est surment dûe à une erreur de notre part dans l'écriture de cette partie, nous lui en serions reconnaissant.
Merci d'avance,
Markhor456.
Partager