Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Gestion dymamique de la taille d'un tableau de pointeurs [ Divers / Débutant(e) ] (timy94)

samedi 25 novembre 2006 à 21:42:55 | Gestion dymamique de la taille d'un tableau de pointeurs

timy94

La taille d'un tableau de char lors de la déclaration est
char * TAB[5];

Comment en cours du programme augmenter la taille de TAB.
Je n'arrive pas a utiliser realloc


merci

Timy94


samedi 25 novembre 2006 à 22:08:30 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

SAKingdom

Membre Club
Réponse acceptée !
Impossible justement. C'est un tableau. Sa taille est fixe. Il faut déclarer un pointeur de pointeur.

char **TAB;

L'inconvénien c'est que tu devra allouer pour, chaque pointeur, sa mémoire dynamiquement (avec malloc ou autre).

C++ (@++)


samedi 25 novembre 2006 à 23:38:11 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

SAKingdom

Membre Club
Réponse acceptée !
Si ça peut t'aider, j'avais fais des fonctions qui geraient dynamiquement la mémoire de pointeur de pointeurs. Elles peuvent probablement être améliorée:

void **malloc2d (int num, int size)
{
    void **tab = (void**)malloc(sizeof(void*)*num), **c = tab;

    while(num > 0)
    {
        *c = (void*)malloc(size);
        c++; num--;
    }

    return tab;
}

void free2d (void **tab, int num)
{
    void **c = tab;

    while(num > 0)
    {
        free(*c);
        c++; num--;
    }

    free((void*)tab);
}

Ça fontionne comme ça:

char **TAB;

TAB = (char**)malloc2d(2, 5); // 2 espaces mémoires contenant chacun 5 octets (puisqu'il s'agit ici de char)

...

free2d(TAB, 2); // Libération de la mémoire

C++ (@++)


dimanche 26 novembre 2006 à 00:13:41 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

Galmiza

void **malloc2d (int num, int size) { void **tab = (void**)malloc(sizeof(void*)*num), **c = tab; while(num > 0) { *c = (void*)malloc(size); c++; num--; } return tab; } Attention ta variable tab n'existe plus en dehors de la fonction ou elle est crée. Il se peut que quelque chose soit écrit par dessus, et le programme plantera.

dimanche 26 novembre 2006 à 00:35:21 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

SAKingdom

Membre Club
Bon. J'ai fais à la va vite une fonction de réallocation qui permet de redéfinir la taille de tout les pointeurs pointé et apporter aussi des corrections (sécurités) à mes autres fonctions:

void **malloc2d (int num, int size)
{
    void **tab, **c;

    if(num <= 0 || size <= 0) return 0;

    tab= (void**)malloc(sizeof(void*)*num); c = tab;

    if(!c) return 0;

    while(num > 0)
    {
        *c = (void*)malloc(size);
      
       if(*c == 0) return 0;
      
        c++; num--;
    }

    return tab;
}

void free2d (void **tab, int num)
{
    void **c = tab;

    if(c == 0 || num <= 0) return;

    while(num > 0)
    {
        free(*c);
        c++; num--;
    }

    free((void*)tab);
}

void **realloc2d (void **tab, int num, int newsize)
{
    void **d;

    if(tab == 0 || num <= 0 || newsize <= 0) return 0;

    d = tab;

    while(num > 0)
    {
        void *c = (void*)realloc(*d, newsize);

        if(!c) return 0;

        *d = c; d++; num--;
    }

    return tab;
}

Bon, voici un exemple:

char **TAB = (char**)malloc2d(2, 10);

strcpy(TAB[0], "allo ");
strcpy(TAB[1], "les amis ");

realloc2d(TAB, 2, 25); // Si la la nouvelle taille est plus petite que l'ancienne, il peut y avoir des problèmes

strcat(TAB[1], "sa va ?");

printf("%s%s\n", TAB[0], TAB[1]);

free2d(TAB, 2);

Galmiza >> Tu es sûr? Il s'agit pourtant bien d'allocation dynamique.

C++ (@++)


dimanche 26 novembre 2006 à 00:46:14 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

Galmiza

Oui ;), la variable tab est créée dans la fonction, donc est détruite en sortant de la fonction.
Le système croit les 4 octets libres donc peut se permettre d'écrire dessus.

char **TAB = (char**)malloc2d(2, 10);
TAB est la copie du tab de la fonction.
Or à l'adresse de tab, n'importe quoi peut être écrit par le système.
Donc TAB (qui reste inchangé) peut pointer vers des données 'inconnues'.

Fais ainsi:
char **TAB;
TAB = (char**)malloc2d(2, 10,&TAB);


dimanche 26 novembre 2006 à 00:54:33 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

SAKingdom

Membre Club
Réponse acceptée !
Son addresse est retourné et la mémoire est toujours alloué car à moin que je me trompe, c'est à ça que sers malloc. Elle est ensuite récupérer par TAB qui pointera donc sur la zone réservé par malloc.

D'ailleur, y'a encore des problèmes dans mes fonctions. Voici ENCORE une correction:

void **malloc2d (int num, int size)
{
    void **tab, **c;

    if(num <= 0 || size <= 0) return 0;

    tab = (void**)malloc(sizeof(void*)*num); c = tab;

    if(!c) return 0;

    while(num > 0)
    {
        *c = (void*)malloc(size);

        if(*c == 0)
        {
            while(c > tab)
            {
                c--; free(*c);
            }

            free((void*)tab);

            return 0;
        }           
        c++; num--;
    }

    return tab;
}

void **realloc2d (void **tab, int num, int newsize)
{
    void **d;

    if(tab == 0 || num <= 0 || newsize <= 0) return 0;

    d = tab;

    while(num > 0)
    {
        void *c = (void*)realloc(*d, newsize);

        if(!c)
        {
            while(d > tab)
            {
                free(*d); d--;
            }

            free((void*)tab);
        }
        *d = c; d++; num--;
    }

    return tab;
}

C++ (@++)


dimanche 26 novembre 2006 à 01:12:26 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

SAKingdom

Membre Club
Réponse acceptée !
Orrrrffff décidément:

void **realloc2d (void **tab, int num, int newsize)
{
    void **d;

    if(tab == 0 || num <= 0 || newsize <= 0) return 0;

    d = tab;

    while(num > 0)
    {
        void *c = (void*)realloc(*d, newsize);

        if(!c)
        {
            while(d > tab)
            {
                free(*d); d--;
            }

            free((void*)tab);

             return 0;
        }
        *d = c; d++; num--;
    }

    return tab;
}

C++ (@++)


jeudi 30 novembre 2006 à 14:15:08 | Re : Gestion dymamique de la taille d'un tableau de pointeurs

timy94

Voila comment j'ai traité mon problème de réservation de mémoire pour une tableau de pointeur sur strucutre et ça marche pas mal
Une fonction que alloue de la mémoire au tableau et aux strucutres et une fonction qui libère de la mémoire la place en memoire pour
 les structures et qui diminue le nombre d'élément d'un tableau .UNEPAGE et un define qui indique le nombre d'element minimun à réserver.


/*******************************************************************************
* Fonction : augmentertaille            
* Objet : Réservation de la place mémoire

*********************************************************************************

struct tar ** augmentertaille (struct tar ** p ,int nb ) {

      /*------------------------------ DECLARATIONS ---------------------------*/

      int init;

      /*---------------------------- DEBUT DE TRAITEMENT ----------------------*/

      init = nb;

      //Pour toujours un multiple de UNEPAGE

      for (nb  ; nb < init+UNEPAGE; nb++) {

            //Augmente la taille du tableau d'un pointeur, soit 4 octets

            p = realloc (p, (nb+1) * 4);

            //Alloue la place d'une structure

            p[nb] = (struct tar *) calloc (1, sizeof (struct tar));

      }

      return p;

}

 

/********************************************

* Fonction : liberertaille *

*

* Objet : Libère la place mémoire réservée *

* *

************************************/

void liberertaille (struct tar ** p ,int nb ) {

      /*------------------------------ DECLARATIONS ---------------------------*/

      div_t divis;

      /*---------------------------- DEBUT DE TRAITEMENT ----------------------*/

      //Pour toujours un multiple de UNEPAGE

      divis = div (nb,UNEPAGE);

      for (nb = (divis.quot*UNEPAGE)+UNEPAGE - 1; nb >= 0; nb--) {

            //Libère la structue

            free (p[nb]);

            //réduit le tableau d'un pointeur,l'adresse 0 vaut un pointeur

            p = realloc (p, (nb+1) * 4);

      }

}



Timy94




Cette discussion est classé dans : taille, tableau, gestion, pointeurs, dymamique


Répondre à ce message

Sujets en rapport avec ce message

Tableau [ par druggedsephiroth ] Je comprends vraiment pas, j'ai un tableau:#define taille 8int cache[taille][taille];ensuite au début du soft, dans la procédure main je mets ca: for Help Me [ par manta7 ] Bonjour, j'aimerais coder un fonction qui prend en paramètre un tableau de nombres entiers, et qui recherche, dans ce tableau, la plus grande différen taille tableau [ par MiTcH37 ] J'aimerai savoir comment connaitre la taile d'un tableau, pour ne pas les envoyer comme argument dans une fonction.ex : void fct(int trier[], int tail C ANSI allocation dynamique de tableau [ par pedu ] Ce petit pro beug en sortie, pourquoi et que faire ?#include #include int (*pi)[1][1]; /* pointeur sur un tableau d'entiers */void main(void){ unsi passer un tableau de pointeurs en parametres [ par achirane ] bonjour,je debute en C (dur..) et j'ai un pb qui va surement vous faire ricaner ;-) :je voudrais passer un tableau de pointeurs en parametre a ma fonc Pointeurs et tableau de pointeurs [ par dragon3x6 ] Salut à la communauté des developpeurs C,j'essai d'écrire un bout de code qui enregistre une liste de mots dans une structure de type arbre.Lorsqu'un creation d'un tableau de taille augmentant a chaque iteration d'une boucle [ par rom12 ] Salut,J'ai besoin de creer un tableau de taille variable... dt la taille n'est pas connue d'avance (d'ou le pb avec malloc).En fait, j'ai une boucle q Quelle est la taille max d'1 tableau de car? [ par unclecrufek ] Est-ce possible de dimensionner un tableau de caracteres de maniere a ce qu'il contenir plusieur centaine de car? PB de "const" pour un tableau en C [ par james ] est-on obligé de definir une taille pour un tableau declaré en const?faut-il donné la taille dans cette dans le .h et dans le .cdernier question: a-t- Tableau de grande taille [ par LuckyNut ] Slut,J'ai un problème pour créer un tableau de grande taille à 2 dimensions : int tab[100][62000];Le programme plante sur un "stack overflow"Cette var


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.