Type de renvoi d'une fonction

Type de renvoi d'une fonction - C++ - Programmation

Marsh Posté le 09-05-2003 à 11:24:59    

Fonction calculate_interactions : cette fonction est appelée depuis la partie principale du programme. La fonction définit une variable "xxx" de type coord_cssr.
 

Code :
  1. void calculate_interactions(unit_cell_cssr *record1, spg_desc_cssr *spg_param, def_matrix_cssr *operator)
  2. {
  3. /* Some variables aren't used yet*/
  4. int h,k,l,number,mnumber;
  5. coord_cssr xxx;
  6.  for(number=1;number<=record1->num_atoms;number++)
  7.   {
  8.   xxx=apply_matrix(&record1->atom[h].coord,&operator[1]);
  9.   printf("Coord apres matrice:%f %f %f\n",xxx.x,xxx.y,xxx.z);
  10.   }
  11. }


 
La fonction apply_matrice est définie par:

Code :
  1. coord_cssr apply_matrix(coord_cssr *coord, def_matrix_cssr *matrix)
  2. {
  3. coord_cssr coord_final;
  4. coord_final.x=(coord->x*matrix->aa)+(coord->y*matrix->ab)+(coord->z*matrix->ac)+matrix->ad;
  5. coord_final.y=(coord->x*matrix->ba)+(coord->y*matrix->bb)+(coord->z*matrix->bc)+matrix->bd;
  6. coord_final.z=(coord->x*matrix->ca)+(coord->y*matrix->cb)+(coord->z*matrix->cc)+matrix->cd;
  7. printf("x:%f y:%f z:%f apply matrix==>%f %f %f\n",coord->x,coord->y,coord->z,coord_final.x,coord_final.y,coord_final.z);
  8. return coord_final;
  9. }


 
Définition des types utilisés :
->Type coord_cssr défini par :
typedef struct
 {
 double x;
 double y;
 double z;
 }
coord_cssr;
 
->Type unit_cell_cssr :
typedef struct
 {
 double a;
 double b;  
 double c;
 double alpha;
 double beta;
 double gamma;
 int spgnum;
 char spgname[11];
 int spgopt;
 int num_atoms;
 int flag_coord;
 char first_title[60];
 char second_title[60];
 atom_cssr *atom;
 }
unit_cell_cssr;
 
->Type atom_cssr :
typedef struct
 {
 int number;
 char name[5];
 //double x;
 //double y;
 //double z;
 coord_cssr coord;
 int bond[9];
 double charge;
 int thing;
 }
atom_cssr; /* in fact, record5 and sup */
 
->Type def_matrix_cssr
typedef struct
 {
 int num;
 char name[60];
 double aa, ab, ac, ad,
     ba, bb, bc ,bd,
     ca, cb, cc, cd,
     da, db, dc, dd;
 }
def_matrix_cssr;
 
 
Erreur obtenue à la compil :cc-1515 cc: ERROR File = dcp_file.c, Line = 438
A value of type "int" cannot be assigned to an entity of type "coord_cssr".
 
xxx=apply_matrix(&record1->atom[h],&operator[1]);
^
 
 


Message édité par livevil le 12-05-2003 à 10:32:47
Reply

Marsh Posté le 09-05-2003 à 11:24:59   

Reply

Marsh Posté le 09-05-2003 à 11:26:59    

moi je comprends ton problème, mais ton code est parfaitement fonctionnel en C ansi
 
 
edit: t'auras pas un problème de pointeur toi?


Message édité par Taz le 09-05-2003 à 11:27:46
Reply

Marsh Posté le 09-05-2003 à 11:27:21    

livevil a écrit :

Voila, j'ai une fonction qui fait appel un type defini par typedef struct

Code :
  1. typedef struct
  2. {
  3. double x;
  4. double y;
  5. double z;
  6. }
  7. coord_cssr;
  8. //La fonction :
  9. coord_cssr apply_matrix(coord_cssr *coord, def_matrix_cssr *matrix)
  10. {
  11. coord_cssr coord_final;
  12. coord_final.x=(coord->x*matrix->aa)+(coord->y*matrix->ab)+(coord->z*matrix->ac)+matrix->ad;
  13. coord_final.y=(coord->x*matrix->ba)+(coord->y*matrix->bb)+(coord->z*matrix->bc)+matrix->bd;
  14. coord_final.z=(coord->x*matrix->ca)+(coord->y*matrix->cb)+(coord->z*matrix->cc)+matrix->cd;
  15. return coord_final;
  16. }


Et je veux fair en sorte d'appeler la fonction de la facon suivant :
nll_coord=apply_matrix(coord,nom_de_la_matrice);
 
Mais apparemment, le type renvoye par la fonction est int. ESt ce que
c'est possible de faire ca en C ? (Je suis sur station SGI, OS IRIX,
compilateur qui comprend le C ANSI, normalement)


 
Ce sera plus lisible ... ;)
 
Edit : Raté ! :D


Message édité par theshockwave le 09-05-2003 à 11:28:54

---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 11:32:09    

++Taz a écrit :

moi je comprends ton problème, mais ton code est parfaitement fonctionnel en C ansi
 
 
edit: t'auras pas un problème de pointeur toi?


Je ne sais pas trop. Deja je ne suis pas programmeur a la base :-). MAis c'est effectivement du cote
des pointeurs que j'ai commence a chercher. Enfin je ne vois pas trop, la....

Reply

Marsh Posté le 09-05-2003 à 11:32:14    

D'accord, y'a des règles qui font que si une variable est déclarée et retournée tout de suite après, elle n'est pas détruite en sortie de fonction, mais est-ce bien le cas là ? Est-ce bien le cas sur ce compilo ?
 
Je connais plus le C++ que le C, mais normalement, dans un cas comme ca, le destructeur de la struct doit être appelé (en C++, les struct sont comme des classes et peuvent avoir un destructeur, si, si ...)
 
donc là, j'en viens à me demander si il n'y a pas un pb à ce niveau là ...


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 11:33:34    

livevil a écrit :


Je ne sais pas trop. Deja je ne suis pas programmeur a la base :-). MAis c'est effectivement du cote
des pointeurs que j'ai commence a chercher. Enfin je ne vois pas trop, la....


 

Code :
  1. coord_cssr *apply_matrix(coord_cssr *coord, def_matrix_cssr *matrix)
  2. {
  3. coord_cssr *coord_final = malloc(sizeof(coord_cssr));
  4. coord_final->x=(coord->x*matrix->aa)+(coord->y*matrix->ab)+(coord->z*matrix->ac)+matrix->ad;
  5. coord_final->y=(coord->x*matrix->ba)+(coord->y*matrix->bb)+(coord->z*matrix->bc)+matrix->bd;
  6. coord_final->z=(coord->x*matrix->ca)+(coord->y*matrix->cb)+(coord->z*matrix->cc)+matrix->cd;
  7. return coord_final;
  8. }


 
ca passe ?
 
 
Edit : Oui, je sais, c'est pas une solution conseillée car le malloc est dans la fonction ... Il vaudrait mieux allouer la structure à l'extérieur ... Mais c'est pour voir ... :D


Message édité par theshockwave le 09-05-2003 à 11:50:47

---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 11:53:10    

mais y a pas besoinde f aire de malloc, putain: donne nous tout le code concerné!

Reply

Marsh Posté le 09-05-2003 à 11:53:37    

theShOcKwAvE a écrit :

D'accord, y'a des règles qui font que si une variable est déclarée et retournée tout de suite après, elle n'est pas détruite en sortie de fonction, mais est-ce bien le cas là ? Est-ce bien le cas sur ce compilo ?
 
Je connais plus le C++ que le C, mais normalement, dans un cas comme ca, le destructeur de la struct doit être appelé (en C++, les struct sont comme des classes et peuvent avoir un destructeur, si, si ...)
 
donc là, j'en viens à me demander si il n'y a pas un pb à ce niveau là ...

toiv as te coucher, tu dis n'importe quoi

Reply

Marsh Posté le 09-05-2003 à 11:54:14    

++Taz a écrit :

toiv as te coucher, tu dis n'importe quoi


:heink: où ça ?


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 11:55:31    

le C et le C++ sont deux langages différents, alors ne donnent pas de conseils C++ ou de choses comme ça à un programmeur C

Reply

Marsh Posté le 09-05-2003 à 11:55:31   

Reply

Marsh Posté le 09-05-2003 à 11:59:28    

++Taz a écrit :

le C et le C++ sont deux langages différents, alors ne donnent pas de conseils C++ ou de choses comme ça à un programmeur C


 
Je me disais que ca pouvait servir d'indication ... A vérifier ... J'ai été clair sur ce point ... J'ai clairement dit que je n'était pas sur de la validité de ce que je disais en C ...

Citation :

Deja je ne suis pas programmeur a la base :-).


Il ne semble pas s'y connaître bcp plus que moi dans ce langage ...
 
Edit : balises ...


Message édité par theshockwave le 09-05-2003 à 11:59:52

---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 12:17:04    

theShOcKwAvE a écrit :


Je connais plus le C++ que le C, mais normalement, dans un cas comme ca, le destructeur de la struct doit être appelé (en C++, les struct sont comme des classes et peuvent avoir un destructeur, si, si ...)


 
"Plus le C++ que le C" ?
Je vois pas comment c'est possible.
On peut connaître le C et ne pas connaître le C++, mais l'inverse me paraît pas très logique. Faudrait qu'on m'explique là...

Reply

Marsh Posté le 09-05-2003 à 12:17:13    

ben si tu veux je peux parler de python tant qu'à faire

Reply

Marsh Posté le 09-05-2003 à 12:19:13    

++Taz a écrit :

toiv as te coucher, tu dis n'importe quoi


 
toujours aussi incapable de communiquer avec semblabes...  :sarcastic:  :sarcastic:  :sarcastic:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 09-05-2003 à 12:20:02    

konar_spreme a écrit :


 
"Plus le C++ que le C" ?
Je vois pas comment c'est possible.
On peut connaître le C et ne pas connaître le C++, mais l'inverse me paraît pas très logique. Faudrait qu'on m'explique là...
 


 
Bon ...Une dernière fois hors sujet et après, on revient au pb d'origine ... :D
En C++, t'es pas obligé d'apprendre à faire un malloc, tu n'es pas obligé de savoir ce qu'est un struct, .... Ce ne sont que les exemples les plus simples, mais tu as bien d'autres subtilités ...


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 12:21:02    

Tetragrammaton IHVH a écrit :


 
toujours aussi incapable de communiquer avec semblabes...  :sarcastic:  :sarcastic:  :sarcastic:  


 
ses semblables ne font pas ce genre d'erreurs, voyons .... :lol:


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 12:21:54    

theShOcKwAvE a écrit :


 
ses semblables ne font pas ce genre d'erreurs, voyons .... :lol:


 
ah oui c'est vrai :D
 
Euh, sinon, blague à part, la dernière solution que tu as fourni semble correcte.


Message édité par Tetragrammaton IHVH le 09-05-2003 à 12:23:40

---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 09-05-2003 à 13:09:46    

theShOcKwAvE a écrit :


 

Code :
  1. coord_cssr *apply_matrix(coord_cssr *coord, def_matrix_cssr *matrix)
  2. {
  3. coord_cssr *coord_final = malloc(sizeof(coord_cssr));
  4. coord_final->x=(coord->x*matrix->aa)+(coord->y*matrix->ab)+(coord->z*matrix->ac)+matrix->ad;
  5. coord_final->y=(coord->x*matrix->ba)+(coord->y*matrix->bb)+(coord->z*matrix->bc)+matrix->bd;
  6. coord_final->z=(coord->x*matrix->ca)+(coord->y*matrix->cb)+(coord->z*matrix->cc)+matrix->cd;
  7. return coord_final;
  8. }


 
ca passe ?


 
Je vais essayer ca tout à l'heure. Je ne suis plus sur la machine pour le moment.

Reply

Marsh Posté le 09-05-2003 à 14:00:56    

Bon, ca n'a pas l'air de marcher plus. J'ai toujours l'erreur :
 
cc-1515 cc: ERROR File = dcp_file.c, Line = 438
  A value of type "int" cannot be assigned to an entity of type "coord_cssr".
 
                xxx=apply_matrix(&record1->atom[1],&operator[1]);
                   ^
donc  la fonction retourne un int, non ?

Reply

Marsh Posté le 09-05-2003 à 14:15:05    

livevil a écrit :

Bon, ca n'a pas l'air de marcher plus. J'ai toujours l'erreur :
 
cc-1515 cc: ERROR File = dcp_file.c, Line = 438
  A value of type "int" cannot be assigned to an entity of type "coord_cssr".
 
                xxx=apply_matrix(&record1->atom[1],&operator[1]);
                   ^
donc  la fonction retourne un int, non ?


:heink:
 
type de ta variable qui l'accueille : coord_cssr * ... sinon, forcément, ca ne va pas passer ... Mais c'est surprenant qu'il parle d'un type int ... Je ne vois pas trop d'où il le sort ... Peut-être qu'il y a une erreur ailleurs ...
 
pas de pb de surcharge de fonctions en C, logiquement ...
mise à part le fait que sur la plupart des plateformes, un pointeur et un int sont sur 32bits, j'arrive pas à voir de rapport ... :(


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 14:17:11    

virer moi ce malloc bordel. le problème je le vois gros comme une maison, c'est que livevil passe mal ses arguments à sa fonction qui est tout as fait valide.

Reply

Marsh Posté le 09-05-2003 à 14:18:53    

euh... peut-être une connerie, mais si tu enlèves l'étoile dans la déclaration de ta fonction, tu retourneras la variable typée correctement putôt qu'un pointeur...
 
D'autant plus qu'à priori, le pointeur actuellement retourné pointe dans le vide, car toute variable locale à une fonction est détruite à la sortie de la fonction, maloc ou non.
 
Edit : J'y connait rien en C, mais j'ai toujours fais comme ça dans les autres langages. Mais c peut-être une connerie, je sais pas...


Message édité par MagicBuzz le 09-05-2003 à 14:19:48
Reply

Marsh Posté le 09-05-2003 à 14:27:35    

MagicBuzz a écrit :

euh... peut-être une connerie, mais si tu enlèves l'étoile dans la déclaration de ta fonction, tu retourneras la variable typée correctement putôt qu'un pointeur...


La première def qu'il donne n'a pas de pointeurs, justement ...
 

MagicBuzz a écrit :

D'autant plus qu'à priori, le pointeur actuellement retourné pointe dans le vide, car toute variable locale à une fonction est détruite à la sortie de la fonction, maloc ou non.


Ben ... En fait, il me semble que dans certains cas particuliers, la variable n'est pas détruite, mais il me semblait qu'il fallait faire le return dans l'instruction qui suit la déclaration de la variable ... C'est assez restrictif ... Mais je peux me tromper (:D)


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 15:12:10    

Bon, je ne trouve toujours pas. J'avais une erreur dans l'appel de  
ma fonction , mais ca ne change rien a la compilation. Toujours
ce int...
 
Dans la partie qui appelle la fonction, j'ai une variable xxx de  
type coord_cssr qui doit recevoir le return de la fonction. Je ne pense
pas que ca vienne de l'appel, mais plutot du return de la fonction...

Reply

Marsh Posté le 09-05-2003 à 15:17:00    

MagicBuzz a écrit :


 
D'autant plus qu'à priori, le pointeur actuellement retourné pointe dans le vide, car toute variable locale à une fonction est détruite à la sortie de la fonction, maloc ou non.


 
moui... je fais un malloc dans une fct, mais qd je sors de ma fct, le pointeur retourné par malloc est invalide ?
 
va falloir que l'un de nous retourne en cours ou dans ses bouquins sur ce coup la...

Reply

Marsh Posté le 09-05-2003 à 15:26:24    

Konar a écrit :


 
moui... je fais un malloc dans une fct, mais qd je sors de ma fct, le pointeur retourné par malloc est invalide ?
 
va falloir que l'un de nous retourne en cours ou dans ses bouquins sur ce coup la...


 
j'ai lu un peu vite, j'avais même pas remarqué ca ... C'est vrai que c'est assez énorme ... Heureusement qu'on ne détruit pas le résultat des malloc quand on sort des fonctions !!


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 16:03:45    

pas de malloc
la norme dit clairement que
 

Code :
  1. struct dawa {};
  2. struct dawa fonction()
  3. {
  4.   struct dawa d;
  5.   return d;
  6. }

fonctionne aussi bien que si f retournait un int

Reply

Marsh Posté le 09-05-2003 à 16:10:23    

++Taz a écrit :

pas de malloc
la norme dit clairement que
(...)
fonctionne aussi bien que si f retournait un int


 
Ouais, je suis ok ... Mais ca me dérange quant au moment de la destruction de la struct ...c'est à l'utilisateur de la détruire dans son code appelant ?
sinon, ce cas fonctionne-t-il aussi quand tu as des instructions entre la decl de ta variable du type struct et le return ? Je ne demande pas si ca compile, mais je demande si la struct est toujours valide en résultat ...


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 16:12:48    

mais y a pas de destructeur bordel!!! ça exsite pas: y a pas d'allocation. si la structure que tu renvois contient un pointeur alloué, a toi de le libérer à la main. y a aucun problème d'utilisation. si tu regardes bien, y a tout un tas de fonctions C standard qui renvoie des structures

Reply

Marsh Posté le 09-05-2003 à 16:15:10    

++Taz a écrit :

mais y a pas de destructeur bordel!!! ça exsite pas: y a pas d'allocation. si la structure que tu renvois contient un pointeur alloué, a toi de le libérer à la main. y a aucun problème d'utilisation. si tu regardes bien, y a tout un tas de fonctions C standard qui renvoie des structures


ok ...


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 16:22:33    

désolé pour le bordel

Reply

Marsh Posté le 09-05-2003 à 16:24:10    

++Taz a écrit :

désolé pour le bordel


 
pas grave... au final t'avais un peu raison bordel.

Reply

Marsh Posté le 09-05-2003 à 16:24:21    

++Taz a écrit :

désolé pour le bordel


C'est bon ... On va pas en faire un fromage ... pendant que livevil nous regarde ! :D
c'est vrai que j'ai pas réalisé que les structs étaient simplement déclarées dans la pile comme toute autre variable ... :whistle: erreur de débutant ...


---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 16:26:06    

Konar a écrit :


 
pas grave... au final t'avais un peu raison bordel.


 
 
Euuuh ... ++Taz a toujours raison (enfin ... jusqu'à maintenant, je l'ai pas vu dire une connerie ...), simplement, il est avarre en explications ... Si tu ne les lui demande pas clairement, il dira "c'est ca POINT" ! :D et à la limite, il ajoutera "Bordel !" pour faire plus méchant ! :D
 
Edit : Bon ... Ben si, une connerie ! :D Mais c'est pas souvent ! :D


Message édité par theshockwave le 09-05-2003 à 17:00:47

---------------
last.fm
Reply

Marsh Posté le 09-05-2003 à 16:34:47    

Est ce que certains compilateurs n'acceptent que des return de
type classique (int, float) et pas des structures?

Reply

Marsh Posté le 09-05-2003 à 16:36:58    

oui les compilateurs pré-ANSI

Reply

Marsh Posté le 10-05-2003 à 18:48:03    

pourquoi ne pas creer coord_final dans main et appeler la fonction avec un pointeur sur coord_final en parametre et supprimer le return?

Reply

Marsh Posté le 10-05-2003 à 18:54:34    

moi j'ai toujours pas compris le problème amsi je pense livevil connait aps les pointeurs et merdent sont appel de fontion, fonction qui est tout à fait correcte

Reply

Marsh Posté le 10-05-2003 à 19:26:11    

depuis quand l'allocation de structure avec un = marche en C ?

Reply

Marsh Posté le 10-05-2003 à 19:29:35    

Moi, je pense tout simplement qu'il n'a pas déclaré sa fonction au moment ou il l'appelle mais bon, c'est tout ce que je vois comme ça avec si peut de code :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed