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 :

Allocation dynamiques dans une structure


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Allocation dynamiques dans une structure
    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):

    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 */
    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:

    (Ceci est le récumé de la partie qui nous intéresse, la fonction est en réalité bcp plus longue)
    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;
    }
    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.

    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.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu ne refais l'allocation que pour un seul élément
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!(tmp = (TLocationLoc*) realloc((*lo), (*nb+1)*sizeof(TLocationLoc))))
    Remarques :

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci de votre réponse si rapide.

    Pour le realloc je dois admettre que c'est un oubli stupide. Merci de l'avoir relevé.

    Mais en ce qui concerne la partie tmp[n].ListePart malloc et tout le reste,
    le cast ou non ne change rien et le sizeof(char*) non plus. Le problème est toujours là. C'est déprimant.

    *EDIT* pour le free(tmp), c'est parce que toute la fonction n'est pas reprise et lors de la fin de note fonction complète, tout tmp est écit dans unn fichier puis nous lisons le fichier pour récupérer un tableau propre "*lo". Donc oui le free(tmp) est normal ^^.

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Si tu as
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(!(tmp = (TLocationLoc*) realloc((*lo), (*nb+1)*sizeof(TLocationLoc))))
    ....
    n = (*nb) + 1;....
    tu dois avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp[n-1].ListePart = ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2013
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Mille mercis!

    C'était tout simplement ça. Encore une erreur simpliste mais fatale.
    Encore merci pour votre aide précieuse!

    Cordialement,
    Markhor456

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/02/2010, 11h42
  2. allocation dynamique dans une structure !
    Par grodashe dans le forum C
    Réponses: 2
    Dernier message: 31/12/2009, 11h17
  3. allocation dynamique d'une structure static
    Par Asmod_D dans le forum C++
    Réponses: 4
    Dernier message: 01/04/2009, 11h22
  4. Allocation dynamique dans une fonction
    Par n0mad dans le forum Débuter
    Réponses: 5
    Dernier message: 05/02/2009, 22h42
  5. [D7] - Allocation dynamique dans une DLL
    Par david_chardonnet dans le forum Delphi
    Réponses: 6
    Dernier message: 05/07/2006, 15h28

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