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 :

allocations, structures, tableaux


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 1
    Par défaut allocations, structures, tableaux
    Bonjour,

    Je me heurte à un problème d'allocation mémoire avec des structures contenant des tableaux. Voici le code de mes déclarations, sachant que N est une constante :

    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
    /* Structure d'une case */
     
    typedef struct {
     
    	int clef; /* Clef de l'enregistement */
     
    	int rang; /* Rang de l'enregistrement dans le fichier */
     
    } Tcase;
     
    /* Structure d'une page */
     
    typedef struct Tpage {
     
    	Tcase page[2*N-1]; /* Une page est composée de 2*N cases */
     
    	struct Tpage *fils[2*N]; /* Une page possède 2*N+1 fils qui sont des pages */
     
    } Tpage;
    J'ai une fonction d'allocation qui réserve l'espace mémoire et initialise les variables :

    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
    Tpage *Allocation(Tpage *arbre) {
     
    	int i;
     
    	arbre=malloc(sizeof(Tpage));
     
    	for (i=0;i<2*N;i++){
     
    		arbre->page[i].clef=-1;
     
    		arbre->page[i].rang=-1;
     
    		arbre->fils[i]=NULL;
     
    	}
     
    	arbre->fils[2*N]=NULL;
     
    	return arbre;
     
    }
    A l'exécution et au débogage, je me rends compte que la taille de la mémoire réservée pour le premier tableau de Tpage (et sûrement le second aussi) est insuffisante : il manque un "emplacement". J'ai l'impression que le sizeof prends comme taille pour les tableaux le nombre déclaré et non celui de la taille réelle du tableau (avec l'indice 0 ...).

    Ajouter 1 à la taille des tableaux résous le problème mais en créé un nouveau : dans le cas de la déclaration d'une variable de type Tpage je me retrouve avec des tableaux trop grands, ça n'est pas excessivement gênant mais j'aimerai quand même éviter.

    Est-ce que j'ai bien identifié le problème ? Existe-t-il une bonne alternative à la solution primaire que j'y ai apporté ? J'ai consulté un maximum de cours, tutos, ... avant de venir en parler mais je n'ai rien trouvé de probant. Si vous avez mieux, merci de répondre ^^

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 082
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 082
    Par défaut
    Les tableau marche comme ceci :


    int Tableau[4];



    Ceci creer un tableau de 4 case. Les indice des case vont de 0 à 3.



    #define N 50

    int Tableau[N];


    Ceci creer un tableau de N cases. les indice des case vont de 0 a N-1.


    Je pense qu'il y a confusion sur l'emplacement du N-1 comme l'indique cet extrait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	Tcase page[2*N-1]; /* Une page est composée de 2*N cases */
     
    	struct Tpage *fils[2*N]; /* Une page possède 2*N+1 fils qui sont des pages */
    Il faut, pour que la declaration et le commentaire concorde, faire ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	Tcase page[2*N]; /* Une page est composée de 2*N cases */
     
    	struct Tpage *fils[2*N+1]; /* Une page possède 2*N+1 fils qui sont des pages */

  3. #3
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Si je suis tes 2 commentaires ta déclaration de structure est fausse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Tpage {
     
    	Tcase page[2*N-1]; /* Une page est composée de 2*N cases */
     
    	struct Tpage *fils[2*N]; /* Une page possède 2*N+1 fils qui sont des pages */
     
    } Tpage;
    Si tu crées un tableau de N cases il aura N cases (non pas N+1).
    Du coup ta déclaration doit être comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Tpage {
     
    	Tcase page[2*N]; /* Une page est composée de 2*N cases */
     
    	struct Tpage *fils[2*N+1]; /* Une page possède 2*N+1 fils qui sont des pages */
     
    } Tpage;

Discussions similaires

  1. Allocation dynamique tableaux 4 dimensions
    Par mecaplus dans le forum Débuter
    Réponses: 42
    Dernier message: 13/10/2011, 08h45
  2. Allocation de tableaux de longueur nulle
    Par Aleph69 dans le forum Langage
    Réponses: 7
    Dernier message: 21/07/2010, 13h14
  3. allocation de tableaux !
    Par Nulysses dans le forum Fortran
    Réponses: 2
    Dernier message: 16/11/2009, 10h58
  4. Problème allocation structure
    Par djraphi23 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/06/2008, 13h39
  5. Réponses: 12
    Dernier message: 03/01/2006, 17h23

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