Pb de tableau en C

Fermé
pom - 4 nov. 2005 à 09:52
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 4 nov. 2005 à 17:33
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

2 réponses

crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 506
4 nov. 2005 à 17:16
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 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
4 nov. 2005 à 17:33
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