Pb de tableau en C

pom -  
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
A voir également:

2 réponses

crabs Messages postés 908 Date d'inscription   Statut Membre Dernière intervention   507
 
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 :
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] = ... ;
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
typedef struc t_mat
{
unsigned int dim; // la dimension du tableau
double * data;
double operator[](int i){return data[i];}
} Tableau;
maintenant tu peut faire t1[3]=5;
hic : aucun problème en C++, je ne garantie pas la réussite en C...
0