Tableau de structure

SOUMbelgique Messages postés 18 Statut Membre -  
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   -
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.
A voir également:

6 réponses

SOUMbelgique Messages postés 18 Statut Membre
 
personne ne peut éclairer ma lanterne?

merci à vous
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
0
SOUMbelgique Messages postés 18 Statut Membre
 
non je peux utliser le realloc si j'initialise mon pointeur de pointeur à 0.
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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.
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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.
0
SOUMbelgique Messages postés 18 Statut Membre
 
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();
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SOUMbelgique Messages postés 18 Statut Membre
 
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?
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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);
        }
    }
}

0