cerhu > comp.lang.* > comp.lang.c

BESSI Alessandro (05/10/2003, 14h08)
J'ai un segmentation fault sur une fonction et je comprend pas du tout
pourquoi....

Voici la fonction:

MATRICE add_m(MATRICE a, MATRICE b) {
return(a);
}

et la definition de MATRICE:
typedef struct matrice {
int nb_l;
int nb_c;
CPLX matrix[100][100];
} MATRICE;

Je précises qu'il n'y a aucune erreur à la compilation, et ke ca plante ke
kan j'appelle cette fonction.... Elle marche si je remplace MATRICE b, par
int b, ms le probléme c'est que cette fonction est prevu (au futur) pour
calculer la somme de deux matrices...

Merci de votre aide.

Alex
Anthony Fleury (05/10/2003, 14h58)
"BESSI Alessandro" <PASSPAMalessandro.bessi> a écrit :
[..]
> int nb_l;
> int nb_c;
> CPLX matrix[100][100];
> } MATRICE;
> Je précises qu'il n'y a aucune erreur à la compilation, et ke ca plante ke
> kan j'appelle cette fonction.... Elle marche si je remplace MATRICE b, par
> int b, ms le probléme c'est que cette fonction est prevu (au futur) pour
> calculer la somme de deux matrices...


Afin d'avoir de l'aide, tu pourrais donner un peu plus de code stp? du genre
donner le strict minimum compilable qui montre ton segfault, ou alors au
moins donner la fonction appelante ou autre, car là je ne vois pas ce qui
peut poser problème (sous reserve aussi d'une bonne définition de CPLX que
tu ne donnes pas (je suppose un truc du genre typedef struct cplx { int
r,i;}CPLX; ).

Au passage, il serait mieux de passer tes matrices par adresse plutot que
par valeur. Car vu la taille de tes matrices tu fais des passages un peu
gourmands...

donc plutot :

MATRICE* add_m(MATRICE* a, MATRICE* b) {
return a;
}

Le fait de retourner un MATRICE* t'oblige par contre à faire un malloc()
dans ta fonction.
Emmanuel Delahaye (05/10/2003, 16h44)
In 'fr.comp.lang.c', "BESSI Alessandro" <PASSPAMalessandro.bessi>
wrote:

[..]
> typedef struct matrice {
> int nb_l;
> int nb_c;
> CPLX matrix[100][100];
> } MATRICE;
> Je précises qu'il n'y a aucune erreur à la compilation, et ke ca plante ke
> kan j'appelle cette fonction.... Elle marche si je remplace MATRICE b, par
> int b, ms le probléme c'est que cette fonction est prevu (au futur) pour
> calculer la somme de deux matrices...


Tu passes des objets par valeur. C'est déconseillé, sutout que ce sont de
gros objets. Essaye plutôt de passer/retourner l'adresse:

MATRICE *add_m(MATRICE *pa, MATRICE *pb)
{
/* calcul, je suppose */
return pa;
}
Emmanuel Delahaye (05/10/2003, 17h39)
In 'fr.comp.lang.c', "Anthony Fleury"
<fleury_anthony> wrote:

> MATRICE* add_m(MATRICE* a, MATRICE* b) {
> return a;
> }
> Le fait de retourner un MATRICE* t'oblige par contre à faire un malloc()
> dans ta fonction.


Pas forcément. On peut retourner l'adresse passée en paramètre.
Anthony Fleury (06/10/2003, 17h20)
"Emmanuel Delahaye" <emdelYOURBRA> a écrit :
> In 'fr.comp.lang.c', "Anthony Fleury"
> <fleury_anthony> wrote:
> Pas forcément. On peut retourner l'adresse passée en paramètre.


Juste une question, quel en serait l'interêt?? Autant j'y vois un interêt et
je l'utilise aussi en C++ mais autant en C je ne vois pas du tout...

par exemple, tu as
MATRICE a,b,*c;
faire : c = add_m(&a,&b);
est "contre-intuitif, car d'une a sera modifié, ce qui n'est pas trivial vu
la notation (donc bien documenter la fonction) et de deux c et a
representent le même objet à une indirection prêt...

Mais vu que je n'ai pas tant d'expérience que ca en C, tu as des exemples
dans lesquels cette notation aurait un interêt?
Emmanuel Delahaye (06/10/2003, 19h04)
In 'fr.comp.lang.c', "Anthony Fleury"
<fleury_anthony> wrote:

> Juste une question, quel en serait l'interêt?? Autant j'y vois un
> interêt et je l'utilise aussi en C++ mais autant en C je ne vois pas du
> tout...


c = add_m (add_m (&a, &b), &d);
Dominique Baldo (06/10/2003, 19h25)
Emmanuel Delahaye nous disait
> >> > MATRICE* add_m(MATRICE* a, MATRICE* b) {
> >> > return a;
> >> > }

> > Juste une question, quel en serait l'interêt?? Autant j'y vois un
> > interêt et je l'utilise aussi en C++ mais autant en C je ne vois pas du
> > tout...

> c = add_m (add_m (&a, &b), &d);


Pas bien! enfin je trouve; quitte à renvoyer "a" autant ne rien renvoyer
du tout et faire une fonction:

void add_m(MATRICE *inout, MATRICE *op2 );

parce que l'inconvénient des fonctions qui renvoient un pointeur c'est
qu'on ne sait jamais justement si elles font une allocation ou pas ...
tu me diras suffit de lire la doc (voire sa propre doc)
N'empeche qu'en déclarant ta fonction void tu es (à peu près) certain
qu'il n'y a pas d'allocation même si tu ne RTFM pas
Emmanuel Delahaye (06/10/2003, 19h35)
In 'fr.comp.lang.c', Dominique Baldo <dom> wrote:

> Pas bien! enfin je trouve; quitte à renvoyer "a" autant ne rien renvoyer
> du tout et faire une fonction:


J'ai pas dit que c'était bien! Mais l'OP avait apparemment des vélléités dans
ce sens...

> void add_m(MATRICE *inout, MATRICE *op2 );


Je préfèrerais quand même un code retour qui renseigne si fa fonction s'est
bien effectuée...
Anthony Fleury (06/10/2003, 21h27)
"Emmanuel Delahaye" <emdelYOURBRA> a écrit :
> In 'fr.comp.lang.c', "Anthony Fleury"
> <fleury_anthony> wrote:
> >> Pas forcément. On peut retourner l'adresse passée en paramètre.

> > Juste une question, quel en serait l'interêt?? Autant j'y vois un
> > interêt et je l'utilise aussi en C++ mais autant en C je ne vois pas du
> > tout...

> c = add_m (add_m (&a, &b), &d);


Ah, j'aurai dû y penser je suis impardonnable vu que c'est à peu près la
même raison pour laquelle je le fais dans d'autres langages. Cependant, je
trouve ca pas très beau en C ! (et je n'y vois d'utilité à part la
obscursification du code que si la fonction est inlinée)
AG (08/10/2003, 10h08)
Anthony Fleury wrote:
> faire : c = add_m(&a,&b);
> est "contre-intuitif, car d'une a sera modifié, ce qui n'est pas trivial vu
> la notation (donc bien documenter la fonction) et de deux c et a
> representent le même objet à une indirection prêt...


j'ai pas compris en quoi :

1°) la matrice a sera modifié ?
2°) c et a représentent le même objet ?

Rien n'empêche de faire un malloc à l'intérieur de la matrice, non ?

Alexandre, stupéfait.
Anthony Fleury (08/10/2003, 18h41)
"AG" <AG> a écrit :
>> Anthony Fleury wrote:
> > faire : c = add_m(&a,&b);
> > est "contre-intuitif, car d'une a sera modifié, ce qui n'est pas trivial vu
> > la notation (donc bien documenter la fonction) et de deux c et a
> > representent le même objet à une indirection prêt...

> j'ai pas compris en quoi :
> 1°) la matrice a sera modifié ?


J'ai extrapolé un peu, au final, ca fera une addition de matrice. Conclusion
tu renvoies le resultat, et ce resultat sera la somme de a et de b ok? mais
si tu fais un return a, tu retournes l'adresse de la matrice qui est pointé
par a, et tu veux qu'elle soit la somme de a et b donc a sera modifié! Je
sais pas si je suis clair... en clair, tu fais a += b; en matriciel avec ce
code

> 2°) c et a représentent le même objet ?


Même raison qu'au dessus, c sera un pointeur sur une matrice et ce pointeur
sera le pointeur sur a vu que tu retournes le pointeur sur a, donc c et a
pointent sur le même objet.

> Rien n'empêche de faire un malloc à l'intérieur de la matrice, non ?


Tout ca ce sont des extrapolations sur du code que le posteur d'origine n'a
pas mis. Mais dans mon exemple, et dans ce que j'ai compris du poste
d'Emmanuel, on était d'accord sur le fait que les matrices étaient toutes
deux initialisées et avaient toutes deux une dimension et des valeurs
dedans, donc si tu modifies un des paramètres comme le ferai un operator+=()
en C++, alors tu n'as pas de malloc() à faire.
Discussions similaires
Matrices

MATRICES

Matrices

matrices SDP


Fuseau horaire GMT +2. Il est actuellement 03h25. | Privacy Policy