Pb de tableau en C
pom
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour, je viens de me mettre au C, et j'ai un pb avec mes tableaux
Voici ce que j'ai fait :
typedef struc t_mat
{
unsigned int dim; // la dimension du tableau
double * data;
} Tableau;
void alloc_tableau(unsigned int d,Tableau t)
{
assert(d>0);
t.data=malloc(d*sizeof(double));
assert(t.data!=NULL);
}
void affiche_tableau(Tableau t)
{
int i;
for(i=0;i<t.dim;i++)
printf("%3.5f\t",t.data[i]);
printf("\n");
}
int main()
{
Tableau t1;
alloc_tableau(3,t1);
t1.data[0]=1; t1.data[1]=2; t1.data[2]=3;
affiche_tableau(t1);
return 0;
}
et j'obtiens une erreur de segmentation. Le problème vient de la fonction affiche_tableau.
Autre question : plutôt que de faire t1.data[0]=1; etc, y a-t-il un moyen pour faire plutôt t1[0]=1; ce qui et plus simple ?
Merci beaucoup.
Pom
Voici ce que j'ai fait :
typedef struc t_mat
{
unsigned int dim; // la dimension du tableau
double * data;
} Tableau;
void alloc_tableau(unsigned int d,Tableau t)
{
assert(d>0);
t.data=malloc(d*sizeof(double));
assert(t.data!=NULL);
}
void affiche_tableau(Tableau t)
{
int i;
for(i=0;i<t.dim;i++)
printf("%3.5f\t",t.data[i]);
printf("\n");
}
int main()
{
Tableau t1;
alloc_tableau(3,t1);
t1.data[0]=1; t1.data[1]=2; t1.data[2]=3;
affiche_tableau(t1);
return 0;
}
et j'obtiens une erreur de segmentation. Le problème vient de la fonction affiche_tableau.
Autre question : plutôt que de faire t1.data[0]=1; etc, y a-t-il un moyen pour faire plutôt t1[0]=1; ce qui et plus simple ?
Merci beaucoup.
Pom
A voir également:
- Pb de tableau en C
- Tableau word - Guide
- Tableau ascii - Guide
- Trier un tableau excel - Guide
- Tableau croisé dynamique - Guide
- Imprimer tableau excel sur une page - Guide
2 réponses
Salut,
Dans ta fonction d'allocation, il faudrait :
- que tu enregistres la dimension.
- que tu passes un pointeur sur la structure, en effet tu modifies la valeur
du pointeur et de la dimension.
Ce qui donne :
Il faut évidement changer l'appel dans le main :
Pour ta seconde question, tu peux déclarer un pointeur sur 'double',
l'affecter à la valeur du data (aprés l'allocation) et l'utiliser comme tableau.
Mais bon cela est déconseillé car tu perd de la lisibilité du code, mais ça
peut s'appliquer dans le cadre de la recherche de perfo pour des routines
temps réels par exemple [c'est pas le seul truc à faire...].
Dans ta fonction d'allocation, il faudrait :
- que tu enregistres la dimension.
- que tu passes un pointeur sur la structure, en effet tu modifies la valeur
du pointeur et de la dimension.
Ce qui donne :
void alloc_tableau( unsigned int d, Tableau* t ) { assert( d>0 ); t->data = malloc( d*sizeof(double) ) ; assert( t->data!=NULL ) ; t->dim = d ; }
Il faut évidement changer l'appel dans le main :
alloc_tableau( 3, &t1 ) ;
Pour ta seconde question, tu peux déclarer un pointeur sur 'double',
l'affecter à la valeur du data (aprés l'allocation) et l'utiliser comme tableau.
Mais bon cela est déconseillé car tu perd de la lisibilité du code, mais ça
peut s'appliquer dans le cadre de la recherche de perfo pour des routines
temps réels par exemple [c'est pas le seul truc à faire...].
double* vt1 ; ... vt1 = t1.data ; vt1[0] = ... ;