Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1709 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Type de renvoi d'une fonction

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Type de renvoi d'une fonction

n°388024
livevil
Let the bassline getcha...
Posté le 09-05-2003 à 11:24:59  profilanswer
 

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
mood
Publicité
Posté le 09-05-2003 à 11:24:59  profilanswer
 

n°388027
Taz
bisounours-codeur
Posté le 09-05-2003 à 11:26:59  profilanswer
 

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
n°388029
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 11:27:21  profilanswer
 

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
n°388034
livevil
Let the bassline getcha...
Posté le 09-05-2003 à 11:32:09  profilanswer
 

++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....

n°388036
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 11:32:14  profilanswer
 

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
n°388041
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 11:33:34  profilanswer
 

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
n°388056
Taz
bisounours-codeur
Posté le 09-05-2003 à 11:53:10  profilanswer
 

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

n°388058
Taz
bisounours-codeur
Posté le 09-05-2003 à 11:53:37  profilanswer
 

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

n°388060
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 11:54:14  profilanswer
 

++Taz a écrit :

toiv as te coucher, tu dis n'importe quoi


:heink: où ça ?


---------------
last.fm
n°388061
Taz
bisounours-codeur
Posté le 09-05-2003 à 11:55:31  profilanswer
 

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

mood
Publicité
Posté le 09-05-2003 à 11:55:31  profilanswer
 

n°388065
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 11:59:28  profilanswer
 

++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
n°388093
konar_spre​me
Posté le 09-05-2003 à 12:17:04  profilanswer
 

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à...

n°388094
Taz
bisounours-codeur
Posté le 09-05-2003 à 12:17:13  profilanswer
 

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

n°388097
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 09-05-2003 à 12:19:13  profilanswer
 

++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
n°388099
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 12:20:02  profilanswer
 

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
n°388101
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 12:21:02  profilanswer
 

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
n°388102
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 09-05-2003 à 12:21:54  profilanswer
 

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
n°388135
livevil
Let the bassline getcha...
Posté le 09-05-2003 à 13:09:46  profilanswer
 

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.

n°388219
livevil
Let the bassline getcha...
Posté le 09-05-2003 à 14:00:56  profilanswer
 

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 ?

n°388247
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 14:15:05  profilanswer
 

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
n°388250
Taz
bisounours-codeur
Posté le 09-05-2003 à 14:17:11  profilanswer
 

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.

n°388256
MagicBuzz
Posté le 09-05-2003 à 14:18:53  profilanswer
 

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
n°388266
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 14:27:35  profilanswer
 

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
n°388321
livevil
Let the bassline getcha...
Posté le 09-05-2003 à 15:12:10  profilanswer
 

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...

n°388326
Konar
Posté le 09-05-2003 à 15:17:00  profilanswer
 

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...

n°388335
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 15:26:24  profilanswer
 

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
n°388362
Taz
bisounours-codeur
Posté le 09-05-2003 à 16:03:45  profilanswer
 

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

n°388371
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 16:10:23  profilanswer
 

++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
n°388373
Taz
bisounours-codeur
Posté le 09-05-2003 à 16:12:48  profilanswer
 

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

n°388375
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 16:15:10  profilanswer
 

++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
n°388383
Taz
bisounours-codeur
Posté le 09-05-2003 à 16:22:33  profilanswer
 

désolé pour le bordel

n°388386
Konar
Posté le 09-05-2003 à 16:24:10  profilanswer
 

++Taz a écrit :

désolé pour le bordel


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

n°388387
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 16:24:21  profilanswer
 

++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
n°388388
theshockwa​ve
I work at a firm named Koslow
Posté le 09-05-2003 à 16:26:06  profilanswer
 

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
n°388397
livevil
Let the bassline getcha...
Posté le 09-05-2003 à 16:34:47  profilanswer
 

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

n°388400
Taz
bisounours-codeur
Posté le 09-05-2003 à 16:36:58  profilanswer
 

oui les compilateurs pré-ANSI

n°389274
Dag elg
Posté le 10-05-2003 à 18:48:03  profilanswer
 

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

n°389279
Taz
bisounours-codeur
Posté le 10-05-2003 à 18:54:34  profilanswer
 

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

n°389290
xav14
Posté le 10-05-2003 à 19:26:11  profilanswer
 

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

n°389292
Kristoph
Posté le 10-05-2003 à 19:29:35  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Type de renvoi d'une fonction

 

Sujets relatifs
Ptite question sur la fonction switch :)probleme avec la fonction shell_exec()
SQLServer : procedure stockée ou fonctionProblème vec la fonction mail....
[php] comment rerouter les mail envoyés par la fonction mail de php?Y a t-il moyen de proteger les attributs d'une classe (type private) ?
[Validation] document type does not allow element "ul" ???Que renvoi la commande ftp LIST à mon BufferedReader ?
Taille d'une variable de type "WORD"[php] appeler une fonction dans une regexp ou un truc du genre :d
Plus de sujets relatifs à : Type de renvoi d'une fonction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR