Tableau de structure

Bonjour,
voilà mon problème.

j'ai un pointeur de pointeur pptab de type structure.

enco **pptab;

j'ai deux tableaux à gerer en dynamique avec ce pointeur de pointeur

donc j'utilise un realloc

le premier tableau contient des valeurs simples et le second contient les structures.
puis je faire comme cela?

pptab=(enco**) realloc(pptab,x*sizeof(enco*)); // pour le tableau de structures

pptab[i]=(enco*) realloc(pptab,x*sizeof(int)); // pour mon tableau d'entier

merci à vous.
Configuration: Windows XP
Internet Explorer 7.0

6 réponses

  1. personne ne peut éclairer ma lanterne?

    merci à vous
    1. Contributeur
      Salut,
      Pourquoi utiliser realloc ? Lors de la première allocation, utilise plutôt malloc ou calloc.
      Ensuite, tu dois faire une boucloe for pour initialiser chacun des éléments du tableau.
      for(i=0;i<x;i++)
         enco[i]=malloc(...);
      

      Cdlt
      1. non je peux utliser le realloc si j'initialise mon pointeur de pointeur à 0.
        1. Contributeur
          Oui, je sais qu'on peut. Mais, usuellement on utilise malloc pour la première initialisation.
          Cela évite de se poser des questions. Il y a des petites règles qu'on s'efforce de respecter en C, même si ce n'est pas obligatoire.
        2. Contributeur
          Oui, je sais qu'on peut. Mais, lors de la première initialisation, on utilise usuellement malloc ou calloc.
          Comme toute convention, ce n'est pas obligatoire, mais conseillée pour éviter de se poser des questions.
      2. voilà mon programme pour plus d'info.
        #include <stdio.h>
        #include <conio.h>
        #include <process.h>
        #include <alloc.h>
        
        
        struct ident
        {
        char nom[20+1] ;
        char prenom[20+1] ;
        int age;
        };
        
        struct coord
        {
        char rue[25+1];
        int cp,no;
        };
        
        typedef struct 
        {
        struct ident identite;
        struct coord adresse;
        int nocli;
        }client;
        
        void affi(client** pptab,int*ptab,int z );
        
        void main(void)
        {
        int x=0,cptclient=0,i=0;
        char c;
        client  **pptab=0;
        int *ptab=0;
        clrscr();
        
        do
        {
        
        	c=getch();
        	if(c=='t' || c=='T')
        		{
        		
        		i=0;
        		printf("\nfirme num: %d\n\n",x+1);
        		if(!(ptab=(int*) realloc(ptab,(x+1)*sizeof(int)))) exit(0);
        		if(!(pptab=(client**)realloc(pptab,(x+1)*sizeof(int*)))) exit(0);
        		x++;
        		}
        	if(c=='e' || c=='E')
        		{
        		i++;
        		cptclient++;
        		
        		ptab[x-1]=cptclient;
        		if(!(pptab[x-1]=(client*)realloc(pptab[x-1],i*sizeof(client)))) exit(0);
        		printf("CLIENT No %d\n",i);
        		(pptab[x-1][i-1]).nocli=x;
        		printf ("Entrez le nom: ");
        		gets ((pptab[x-1][i-1]).identite.nom);
        		printf ("Entrez le prenom: ");
        		gets((pptab[x-1][i-1]).identite.prenom);
        		printf("Entrez l'age: ");
        		scanf ("%d",&(pptab[x-1][i-1]).identite.age); getchar();
        		printf ("Entrez la rue: ");
        		gets ((pptab[x-1][i-1]).adresse.rue);
        		printf ("Entrez le No: ");
        		scanf ("%d",&(pptab[x-1][i-1]).adresse.no); getchar();
        		printf("Entrez le CP: ");
        		scanf ("%d",&(pptab[x-1][i-1]).adresse.cp); getchar();
        		}
        }
        while(c!='s' && c!='S');
        
        
        	
        	clrscr();
        	affi(pptab,  ptab,x);
        	
        	
        	getch(); 
        
        }
        
        void affi(client**pptab,int*ptab,int x)
        {
        int i,r;
        for(i=0;i<x;i++)
        	{
        	printf("firme numero:%d pour %d de clients",(i+1),ptab[i]);
        	for(r=0;r<ptab[i];r++)
        		{
        		printf("\nCLIENT No %d\n",pptab[i][r].nocli);
        		printf("\nNo client: %d",pptab[i][r].nocli);
        		printf ("\nVoici le nom: %s",pptab[i][r].identite.nom);
        		printf("\nVoici le prenom: %s",pptab[i][r].identite.prenom);
        		printf ("\nVoici l'age: %d",pptab[i][r].identite.age);
        		printf ("\nAdresse: rue %s No %d, CP%d",pptab[i][r].adresse.rue,pptab[i][r].adresse.no,pptab[i][r].adresse.cp);
        		}
        	}
        getch();
        }
        1. mais ma question est que:

          si j'ai un pointeur de pointeur de type structure

          est ce que je peux le realloué avec un entier

          pptab=(enco**) realloc(pptab,x*sizeof(int*));

          c'est le sizeof(int*) qui me gratte. est ce que je peux faire cela?
          1. Contributeur
            Salut,
            Vu ton programme, je comprends mieux l'utilisation de realloc ;)
            Sinon, voici une version corrigée de ton programme. Il doit rester encore des bugs, et je n'ai pas été jusqu'au bout des corrections. Par exemple, tu as utilisé gets au lieu de fgets. Gets ne doit pas être utilisé car c'est dangereux.
            Donc je te laisse corriger jusqu'au bout, j'ai fait le premier remplacement de gets contre fgets pour t'en inspirer.
            Sinon, évite d'utiliser conio.h et process.h (inutile dans ton cas) car ce n'est pas standard, donc pas portable.
            Attention, lorsque l'utilisateur appuie sur 'e' avant d'appuyer sur 't', il y a une jolie erreur de segmentation.
            Et enfin, c'est mieux de renvoyer un int dans le main.
            #include <stdio.h>
            #include <stdlib.h>
            
            
            struct ident
            {
                char nom[20+1] ;
                char prenom[20+1] ;
                int age;
            };
            
            struct coord
            {
                char rue[25+1];
                int cp,no;
            };
            
            typedef struct 
            {
                struct ident identite;
                struct coord adresse;
                int nocli;
            }client;
            
            void affi(client** pptab,int*ptab,int z );
            
            int main(void)
            {
                int x=0,cptclient=0,i=0;
                char c[3];
                client  **pptab=0;
                int *ptab=0;
            
                do
                {
                    puts("choix : ");
                    fgets(c,sizeof(c),stdin);
                    if(c[0]=='t' || c[0]=='T')
                    {
                        i=0;
                        printf("\nfirme num: %d\n\n",x+1);
                        if(!(ptab=(int*) realloc(ptab,(x+1)*sizeof(int)))) exit(0);
                        if(!(pptab=(client**)realloc(pptab,(x+1)*sizeof(int*)))) exit(0);
                        x++;
                    }
                    if(c[0]=='e' || c[0]=='E')
                    {
                        i++;
                        cptclient++;
                        ptab[x-1]=cptclient;
                        if(!(pptab[x-1]=(client*)realloc(pptab[x-1],i*sizeof(client)))) exit(0);
                        printf("CLIENT No %d\n",i);
                        (pptab[x-1][i-1]).nocli=x;
                        printf ("Entrez le nom: ");
                        fgets ((pptab[x-1][i-1]).identite.nom,sizeof(pptab[x-1][i-1].identite.nom),stdin);
                        printf ("Entrez le prenom: ");
                        gets((pptab[x-1][i-1]).identite.prenom);
                        printf("Entrez l'age: ");
                        scanf ("%d",&(pptab[x-1][i-1]).identite.age); getchar();
                        printf ("Entrez la rue: ");
                        gets ((pptab[x-1][i-1]).adresse.rue);
                        printf ("Entrez le No: ");
                        scanf ("%d",&(pptab[x-1][i-1]).adresse.no); getchar();
                        printf("Entrez le CP: ");
                        scanf ("%d",&(pptab[x-1][i-1]).adresse.cp); getchar();
                    }
                }
                while(c[0]!='s' && c[0]!='S');
            
            
            
                affi(pptab,  ptab,x);
            
            
                return 0;
            }
            
            void affi(client**pptab,int*ptab,int x)
            {
                int i,r;
                for(i=0;i<x;i++)
                {
                    printf("firme numero:%d pour %d de clients",(i+1),ptab[i]);
                    for(r=0;r<ptab[i];r++)
                    {
                        printf("\nCLIENT No %d\n",pptab[i][r].nocli);
                        printf("\nNo client: %d",pptab[i][r].nocli);
                        printf ("\nVoici le nom: %s",pptab[i][r].identite.nom);
                        printf("\nVoici le prenom: %s",pptab[i][r].identite.prenom);
                        printf ("\nVoici l'age: %d",pptab[i][r].identite.age);
                        printf ("\nAdresse: rue %s No %d, CP%d",pptab[i][r].adresse.rue,pptab[i][r].adresse.no,pptab[i][r].adresse.cp);
                    }
                }
            }