begin process at 2012 05 30 18:08:24
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

tableau de structure dynamique ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

tableau de structure dynamique ?

mercredi 30 mars 2005 à 20:59:35 | tableau de structure dynamique ?

tintin72

Bonjour,
J'aimerai faire un tableau de structure dynamique mais je galère.
Pour un tableau de int dynamique c'est bon. ex :

int * pTabInt;
int * tmp = NULL;
int iIndex;   
    
        for(iIndex = 0;  iIndex < 15;  iIndex++)
         {
           if(iIndex == 0)
           {
             pTabInt = (int*) malloc (sizeof (int));
            
             if(pTabInt == NULL)
             {
              printf("Echec lors de l'allocation de mémoire ! (malloc)\n");
             } 
                 
             *(pTabInt + iIndex) = iIndex+ 2;   // par exemple            
           }
             else
             {     
              tmp = (int*) realloc (pTabInt, (sizeof (int)));
             
              if(tmp == NULL)
             {
              printf("Echec lors de l'allocation de mémoire ! (realloc)\n");
             }  
              
              pTabInt= tmp;
             *(pTabInt + iIndex) = iIndex + 2;
         
             int * tmp = NULL;
             }    
         }

J'accède ensuite aux éléments du tableau comme ça. ex :
*(pTabInt + 5) ;

Par contre si je veux faire pareil avec une structure genre :

struct  Buffer
{
      int iEntier;
     float fFlottant;
    double dDouble;
};
struct  Buffer *  pTabStrc;
struct  Buffer *  tmp = NULL;


     for(iIndex = 0; iIndex < 15; iIndex++)
         {
           if(iIndex == 0)
           {
             pTabStrc = (struct  Buffer*) malloc (sizeof (struct  Buffer));
            
             if(pTabStrc == NULL)
             {
              printf("Echec lors de l'allocation de mémoire ! (malloc)\n");
             } 
                 
             *(pTabStrc + iIndex).iEntier = iIndex+ 2;               
           }
             else
             {     
              tmp = (struct  Buffer*) realloc (pTabStrc, (sizeof (struct  Buffer)));
             
              if(tmp == NULL)
             {
              printf("Echec lors de l'allocation de mémoire ! (realloc)\n");
             }  
              
              pTabStrc= tmp;
             *(pTabStrc + iIndex).iEntier = iIndex + 2;
         
             int * tmp = NULL;
             }    
         } 

       *(pTabStrc + 5) .iEntier;

Là, le compilo me dit que j'essaie d'accéder à une valeur qui n'est pas une sructure ou qq chose comme ça.
Bref, est ce que qqu'un pourrait me dire si il est possible de faire ce genre de tableau, et si
oui, quelle est la bonne syntaxe ?

Note: Je ne veux pas faire de liste chainée, je préférerai le principe du tableau dynamique.


Tintin 72
mercredi 30 mars 2005 à 22:08:08 | Re : tableau de structure dynamique ?

BruNews

Administrateur CodeS-SourceS
typedef struct _MYBUF {
  long val;
} MYBUF, *LPMYBUB;

LPMYBUB pbuf;

pbuf = (LPMYBUB) malloc(sizeof(MYBUF) * 10); // 10 structures

pbuf[0].val = 0;

ciao...
BruNews, MVP VC++
mercredi 30 mars 2005 à 22:12:21 | Re : tableau de structure dynamique ?

steve_clamage

Utilises l'opérateur []

*(pTabInt + iIndex) = iIndex + 2; -> pTabInt[ iIndex] = iIndex + 2;

(*(pTabStrc + iIndex)).iEntier = iIndex + 2;
ou
(pTabStrc + iIndex)->iEntier = iIndex + 2;  -> pTabStrc[ iIndex].iEntier = iIndex + 2;
jeudi 31 mars 2005 à 09:32:13 | Re : tableau de structure dynamique ?

tintin72

Merci pour vos réponses, maintenant ça fonctionne ;-)
Toutefois, je viens de me rendre compte d'un autre problème.
Par exemple pour le tableau de int dynamique (voir plus haut), lorsque l'incrémentation de la boucle dépasse 23, le programme plante en disant que la mémoire ne peut être "writen" blablabla.
J'ai pensé à un pb avec la fonction realloc mais je suis pas sûr.
Est ce que vous auriez une idée ? 

Tintin 72
jeudi 31 mars 2005 à 11:31:50 | Re : tableau de structure dynamique ?

ymca2003

La méthode que tu as mise plus haut n'alloue aboluement pas un tableau d'entier, tu ne fait que réallouer un entier à chage fois (malloc et realloc (pTabInt, (sizeof (int)));) et que tu stocke dans pTabInt. Donc quand tu veux accéder à un élément autre que pTabInt[0] tu tape à un endroit non alloué de la mémoire et donc plantage assuré au bout d'un moment.

La bonne méthode pour allouer un tableau d'entier (ou d'autre chose)
int size = 12
TRUC* p = malloc(12*sizeof(TRUC)); 
jeudi 31 mars 2005 à 13:06:44 | Re : tableau de structure dynamique ?

tintin72

OK, merci pour ton explication. Mais, pourrais tu me dire alors, comment
faire un tableau (de int par ex) vraiment dynamique, (cad dont on ne connaît 
absolument pas la taille au départ), et auquel on peut allouer des éléments
au fur et à mesure selon les besoins lors de l'exécution du programme.
Tu vas certainement me parler des listes chainées, mais je voudrais garder 
le concepte du tableau (qui je crois est plus rapide lors du listage).

Merci 

Tintin 72
jeudi 31 mars 2005 à 14:19:13 | Re : tableau de structure dynamique ?

ymca2003

Pour la première allocation :
TRUC* p = malloc(12*sizeof(TRUC));

pour les suivantes :
 p = realloc(p, 13*sizeof(TRUC));

=> le contenu précédent est conservé (vérifier quand même le retour pour éviter de perdre p si NULL).
jeudi 31 mars 2005 à 15:14:51 | Re : tableau de structure dynamique ?

tintin72

J'ai adapté ton exemple dans la boucle de tableau de int (plus haut) mais le programme plante toujours avec la même erreur (la mémoire ne peut être "writen" blablabla).
Je ne comprends pas non plus pourquoi tu alloue 12 TRUC dès  la 1ere allocation, un seul suffit non ?

Tintin 72
jeudi 31 mars 2005 à 15:18:38 | Re : tableau de structure dynamique ?

ymca2003

J'ai mis 12 mais tu met ce que tu veux.
Autant allouer dès le nombre voulu pur faire ta boucle d'init (15, 23,  on s'en fout).
Ensuite dans ton prog si tu te rend compte qu'il en fallait plus, tu fais un realloc.

int * pTabInt;
int iIndex;   
pTabInt = malloc(15*sizeof(int));
 for(iIndex = 0;  iIndex < 15;  iIndex++)
   pTabInt[iIndex] = iIndex*2+5;

...
pTabInt = realloc(pTabInt, 75*sizeof(int));
pTabInt[74] = 1234;

jeudi 31 mars 2005 à 17:29:35 | Re : tableau de structure dynamique ?

tintin72

OK, j'ai trouvé pourquoi ça plantait.
En fait je n'allouais pas assez de mémoire pour realloc tout simplement :-)

Merci pour ton aide

Tintin 72


Cette discussion est classée dans : int, tmp, iindex, ptabint, ptabstrc


Répondre à ce message

Sujets en rapport avec ce message

jai un probleme avec ma source!!!!! jai vérifeir et je ne trouve rien...pouvez vous m'aider.... [ par retaks666 ] alors jai veut faire un programme ki génére une suite de caractere d'un nombre donné...et sa marche po... je vous done ma source si vous pouvez m'aide Prob de compilation gcc [ par Tidam ] Salut a tous voila j'ai un ptit probleme de compilation avec gcc voyez par vous meme -bash-2.05b$ gcc -o belga main.cpp /tmp/ccRnrb pb comprehension (int*) VC++ // TC++ [ par BarthOlivier ] Salut ,J'ai rencontré un truc marrant que je n'arrive pas a expliquer... voici le code :#include "stdafx.h"#include "stdio.h"#include "conio.h"#define Compréssion et décompression d'huffman [URGENT] [ par tekbright717 ] J'ai un comme sujet de faire la compréssion et décompression d'huffman. J'ai avancé le sujet mais je suis bloquer dans ma fonction de création de l'ar ASM inline et mingw (GCC) [ par skirby ] Bonjour tout le monde,J'aimerais mettre de l'assembleur inline dans mon code en C.J'utilise Code::Block et mingw.Voici un extrait de code qui ne veut aide petit prog c [ par mayapour ] Bonjour, Débutant en C, je souhaiterai savoir comment changer ce programme initiale (liste chainée) qui demande à l'utilisateur de choisir les optio problème de conversion [ par IH2MCBETA ] Bonjour ,voila une erreur que je n'arrive pas résoudre code:void CPage1::OnEnKillfocusNbrun(){</font algorithme de tri [ par chegue02 ] Bonjour, svp vous pouvez mé corrigé ce code concernant l'algorithme de tri merci d'avance #include #include // fonction qui permet de trier tab en gcc, prob de compilation [ par Metrox ] 'lut all, je tourne ss une debian (knoppix, pr etre precis), et j'essaie de compiler un truc tt bete, mais il me sort une erreur...que faire?!?CODE(es pb avec fonctions sqrt de math.h [ par fox88 ] voici mon code : void histod::calcul_moyenne_ecartype(){ //CALCUL MOYENNE DU NB D'APPELS MOYEN JOURNALIER unsigned long accu=0; int moyenne=0;<br


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,576 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales