Type de renvoi d'une fonction - C++ - Programmation
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?
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
|
Ce sera plus lisible ...
Edit : Raté !
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 |
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....
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à ...
Marsh Posté le 09-05-2003 à 11:33:34
livevil a écrit : |
Code :
|
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 ...
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é!
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 ? |
toiv as te coucher, tu dis n'importe quoi
Marsh Posté le 09-05-2003 à 11:54:14
ReplyMarsh 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
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 ...
Marsh Posté le 09-05-2003 à 12:17:04
theShOcKwAvE 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à...
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...
Marsh Posté le 09-05-2003 à 12:20:02
konar_spreme a écrit : |
Bon ...Une dernière fois hors sujet et après, on revient au pb d'origine ...
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 ...
Marsh Posté le 09-05-2003 à 12:21:02
Tetragrammaton IHVH a écrit : |
ses semblables ne font pas ce genre d'erreurs, voyons ....
Marsh Posté le 09-05-2003 à 12:21:54
theShOcKwAvE a écrit : |
ah oui c'est vrai
Euh, sinon, blague à part, la dernière solution que tu as fourni semble correcte.
Marsh Posté le 09-05-2003 à 13:09:46
theShOcKwAvE a écrit :
|
Je vais essayer ca tout à l'heure. Je ne suis plus sur la machine pour le moment.
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 ?
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 : |
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 ...
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.
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...
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)
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...
Marsh Posté le 09-05-2003 à 15:17:00
MagicBuzz 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...
Marsh Posté le 09-05-2003 à 15:26:24
Konar a écrit : |
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 !!
Marsh Posté le 09-05-2003 à 16:03:45
pas de malloc
la norme dit clairement que
Code :
|
fonctionne aussi bien que si f retournait un int
Marsh Posté le 09-05-2003 à 16:10:23
++Taz a écrit : pas de malloc |
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 ...
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
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 ...
Marsh Posté le 09-05-2003 à 16:24:10
ReplyMarsh 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 !
c'est vrai que j'ai pas réalisé que les structs étaient simplement déclarées dans la pile comme toute autre variable ... erreur de débutant ...
Marsh Posté le 09-05-2003 à 16:26:06
Konar a écrit : |
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" ! et à la limite, il ajoutera "Bordel !" pour faire plus méchant !
Edit : Bon ... Ben si, une connerie ! Mais c'est pas souvent !
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?
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?
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
Marsh Posté le 10-05-2003 à 19:26:11
depuis quand l'allocation de structure avec un = marche en C ?
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
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.
La fonction apply_matrice est définie par:
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