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 dynamique Continue


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut Allocation dynamique Continue
    Bonjour,

    Actuellement je developpe un programme ayant besoin d'allocation mémoire contenue et j'ai besoin de réallouer cet espace mémoire, c'est un tableau de flotant à trois dimensions. Cependant, des erreurs de segmentation dans mon code. pouvez-vous m'aider car je ne vois vraiment pas l'erreur . Merci,

    Mon Code est le suivant :

    Structure pour conserver tous les éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct ougdata_t{
    	float *ttt;
    	float **tt;
    	float ***t;
     
    	int n,m,p,c ;					/* Index : X,Y,Z */
    	int max_n,max_m,max_p;			/* Capacité : X,Y,Z */
    }ougdata_t;
    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
     
    /* Fonction d'allocation de la mémoire au départ */
    ougdata_t* initDisplacement(){
     
    	int nmp,nm,i,j;
     
    	ougdata_t *tmp = (ougdata_t*)malloc(sizeof(ougdata_t)); 
    	if(tmp==NULL) return NULL;
     
    	tmp->n = 0;				/* Initialisation des indices dans le tableau */
    	tmp->m = 0;
    	tmp->p = 0;
     
    	tmp->max_n = 1000;			/* Taille du tableau au départ */
    	tmp->max_m = 10;			
    	tmp->max_p = 12;			/* Taille des déplacements du noeud */
     
    	tmp->c=tmp->n;
     
    	/* On alloue tout l'esplace mémoire necessaire */
    	nmp = tmp->max_n * tmp->max_m * tmp->max_p;
    	tmp->ttt = (float *) malloc(nmp * sizeof(float));
     
    	/* Allocation mémoire pour n x m x 1 */
    	nm = tmp->max_n * tmp->max_m;
    	tmp->tt = (float **) malloc(nm * sizeof(float *));
     
    	/* Allocation mémoire for n x 1 x 1 */
    	tmp->t = (float ***) malloc(tmp->max_n * sizeof(float **));
     
    	/* Attache des différents tableau entre eux */
    	for (i = 0; i < tmp->max_n; i++){
    		tmp->t[i] = tmp->tt + tmp->max_m*i;
    		for (j = 0; j < tmp->max_m; j++){
    			tmp->t[i][j] = tmp->ttt + tmp->max_m*tmp->max_p*i + tmp->max_p*j;
    		}
    	}
    	return tmp;
    }
    /* Fonction pour ajouter une donnée, si la taille de la ligne n'est pas assez grande, on réalloue */
    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
    int AddDisplacement(ougdata_t* tmp, float *val){
     
    	int nmp, nm, j, i;
     
    	/* Le tableau de donné n'est pas initialisé */ 
    	if(tmp->t == NULL) return 0;
     
    	/* Le nombre de colonne est au max, nous devons réallouer */
    	if(tmp->m == tmp->max_m){
     
    		printf("Double X");
    		system("PAUSE");	
    		/* On double la capacité du nombre de ligne du tableau */
    		tmp->max_m = tmp->max_m*2;
     
    		/* Nous devons réallouer un nouvel espace mémoire pour tout contenir */
    		nmp = tmp->max_n * tmp->max_m * tmp->max_p;
    		tmp->ttt=(float *)realloc(tmp->ttt,sizeof(float) * nmp);
     
    		/* Allocation mémoire pour n x m x 1 */
    		nm = tmp->max_n * tmp->max_m;
    		tmp->tt=(float **)realloc(tmp->tt,sizeof(float *) * nm);
     
    		/* Pour chaque nouvel emplacement, nous liquons les données */
    		tmp->t[tmp->n] = tmp->tt + tmp->max_m*tmp->n;
     
    		for (j = (tmp->m); j < tmp->max_m; j++){
    			tmp->t[tmp->n][j] = tmp->ttt + (tmp->max_m*tmp->max_p*tmp->n) + tmp->max_p*j;
    		}
    	}
     
    	for(i=0;i<12;i++)
    		tmp->t[tmp->n][tmp->m][i] = val[i];
     
    	tmp->m = tmp->m+1;
    	return 1;
    }
    /* Fonction qui permet de passer à une autre ligne */
    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 AddLine(ougdata_t* tmp, hdf_f* tmp_hdf){
     
    	int nmp, nm, i,j;
     
    	printf("New Line\n");
    	system("PAUSE");
     
    	/* Le tableau de donné n'est pas initialisé */  
    	if(tmp->t == NULL) return 0;
     
    	/* Le nombre de ligne est au maximum, nous devons réallouer le tableau pour plus de place */
    	if(tmp->n == tmp->max_n){
    		/* Appel à la fonction de vidage du buffer des données dans le tableau de déplacements */
                                  /* Vide le tableau en l'ecrivant dans un fichier */
    		tmp->n=-1;
    	}
                 tmp->n=(tmp->n)+1;
    	tmp->c = tmp->m;
    	tmp->m = 0;
     
    	return 1;
    }
    L'erreur provient juste àpres la fonction addLine().

    SVP, cela fait 2 jours que je suis dessus sans succés.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je n'ai pas très bien compris votre code.
    Vous avez besoin d'un tableau à 3 dimensions. Le C ne prévoit pas de tableaux multidimensionnels. Cependant si on écrit Tab[][][], on a écrit la description d'un tableau tri dimensionnel. Mais c'est en fait un tableau de tableaux de tableaux.
    Il y a une autre écriture pour cela, ***Tab, c'est à dire un pointeur sur tableau de pointeurs etc.
    Tout ceci pour dire que je ne comprend pas à quoi servent *ttt et **tt. Je pense que ***t suffit.
    Je n'ai pas non plus compris ce que vous appelez une ligne, taille de ligne, etc.

    Si j'étais vous, je récrirais le code suivant ce principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tmp->t = (float*) malloc(sizeof(float)*N1);
    for (int i=0, i<N1; i++)
    {
      tmp->t[i]=(float*) malloc(sizeof[float)*N2);
      for (int j=0; j<N3; j++)
      {
        tmp->t[i][j]=(float*) malloc(sizeof[float)*N3);
      }
    }
    pour la libération c'est le même principe, mais dans l'autre sens.

    Bon courage

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 9
    Par défaut
    Je voudrais si l'espace mémoire réservé sera bien continue ? Le code que je vous ai fournie m'a été donné en tant qu'exemple.

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par mickael.martins77 Voir le message
    Je voudrais si l'espace mémoire réservé sera bien continue ? Le code que je vous ai fournie m'a été donné en tant qu'exemple.
    La lecture de cette reponse de la FAQ CLC devrait t'interesser.

  5. #5
    Expert confirmé
    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
    Par défaut
    @mickael.martins77 :
    Je voudrais si l'espace mémoire réservé sera bien continue ? Le code que je vous ai fournie m'a été donné en tant qu'exemple.
    Dans le code que tu proposes au début (qui est assez abscons du fait notamment d'un choix discutable des identificateurs), l'espace mémoire des données est bien continu.
    C'est même un inconvénient dans ton cas parce que tu veux redimensionner le tableau.
    Il est organisé en n plans, chaque plan possède m lignes et chaque ligne a p colonnes (en utilisant tes notations).
    Si on veut augmenter le nombre de lignes ou de colonnes ou les deux, il va falloir actualiser les pointeurs mais aussi repositionner les données dans le tableau des données. Prenons par exemple n=1, m=2, p=3. Le tableau contient dans l'ordre (j'ai mis la valeur des indices m et p)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Données    00 01 02 10 11 12
     Pointeurs  ^0       ^1
    on veut le redimensionner en p=4. On réalloue les données et on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Données    00 01 02 10 11 12  X  X 
     Pointeurs  ^0       ^1
    alors que le tableau devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Données    00 01 02  X 10 11 12  X 
     Pointeurs  ^0          ^1
    Il est préférable d'allouer séparément chaque ligne, plutôt que le tableau entier. Le tableau n'est plus continu mais l'accès aux données est inchangé. L'allocation et la libération est (un peu) plus complexe mais cela simplifie considérablement le redimensionnement. Reprenons l'exemple précédent dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Données    00 01 02   /-/    10 11 12
     Pointeurs  ^0                ^1
    réallocation indépendante de chacune des deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Données    00 01 02 X  /-/   10 11 12 X
     Pointeurs  ^0                ^1
    @ Pierre Dolez Attention à la manière dont vous exprimez les choses :
    Cependant si on écrit Tab[][][], on a écrit la description d'un tableau tri dimensionnel. Mais c'est en fait un tableau de tableaux de tableaux.
    Il y a une autre écriture pour cela, ***Tab, ....
    Cette phrase semble dire que float ***Tab est une autre écriture de float Tab[][][] ce qui est évidemment faux.

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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