Pb en C : fct retournant un tableau
Fermé
eileen
-
4 août 2004 à 16:15
Ravachol Messages postés 566 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 - 5 août 2004 à 16:24
Ravachol Messages postés 566 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 - 5 août 2004 à 16:24
7 réponses
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
4 août 2004 à 17:35
4 août 2004 à 17:35
Salut,
la variable 'd' elle sort d'où, elle a quelle valeur quand tu fais le malloc ?
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
la variable 'd' elle sort d'où, elle a quelle valeur quand tu fais le malloc ?
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
Canard007
Messages postés
5929
Date d'inscription
mercredi 26 mai 2004
Statut
Contributeur
Dernière intervention
18 septembre 2009
215
4 août 2004 à 17:50
4 août 2004 à 17:50
elle renvoie quoi ta fonction der_part2?
car si c'est un double par exemple..ba il est sur 2 octet et quand tu fait grad+j pas tu vanace que de 1 octet...resultat tu ecrase tes données
COIN!
car si c'est un double par exemple..ba il est sur 2 octet et quand tu fait grad+j pas tu vanace que de 1 octet...resultat tu ecrase tes données
COIN!
erf!
oui effectivement der_part2 renvoie un double
mais vu que grad est un tableau de doubles, grad+j devrait en tenir compte non ?
enfin c ce que j'avais compris moi
ds le doute g modifié le code mais ça ne change rien du tout :
double *gradient(double* t)
{
double *grad = (double*) malloc(sizeof(double)*d);
int j;
for (j=0;j<d;j++)
{
grad[j]=der_part2(j,t);
}
return grad;
}
oui effectivement der_part2 renvoie un double
mais vu que grad est un tableau de doubles, grad+j devrait en tenir compte non ?
enfin c ce que j'avais compris moi
ds le doute g modifié le code mais ça ne change rien du tout :
double *gradient(double* t)
{
double *grad = (double*) malloc(sizeof(double)*d);
int j;
for (j=0;j<d;j++)
{
grad[j]=der_part2(j,t);
}
return grad;
}
Concernant le "grad+j", si je me fie à ma mémoire (méfiance tout de même lol) ça marche car effectivement grad est un pointeur de double.
Maintenant il me semble que le problème vient du fait que grad est une variable locale, donc "détruite" en sortie de fonction. Donc le fait de retourner cette variable, c'est un peu jouer à la roulette russe avec la pile lol. Comment faire alors ? une variable globale ? à part ça ... j'avoue que ma mémoire me fait défaut. (erf, le chomage ça attaque :-/)
Bonne chance.
Maintenant il me semble que le problème vient du fait que grad est une variable locale, donc "détruite" en sortie de fonction. Donc le fait de retourner cette variable, c'est un peu jouer à la roulette russe avec la pile lol. Comment faire alors ? une variable globale ? à part ça ... j'avoue que ma mémoire me fait défaut. (erf, le chomage ça attaque :-/)
Bonne chance.
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
4 août 2004 à 18:19
4 août 2004 à 18:19
Salut,
"quand tu fait grad+j pas tu vanace que de 1 octet"
Ben non, il avance d'un élément soit en l'occurence 1 double. *(grad + j) revient à grad[j] ;-)
Eileen quel est, au juste, le pb que tu rencontres ?
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
"quand tu fait grad+j pas tu vanace que de 1 octet"
Ben non, il avance d'un élément soit en l'occurence 1 double. *(grad + j) revient à grad[j] ;-)
Eileen quel est, au juste, le pb que tu rencontres ?
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
4 août 2004 à 18:23
4 août 2004 à 18:23
Désolé pour le doublon ;-)
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
bah qd je veux afficher les valeurs que renvoie la fct gradient :
int main(void)
{
int j;
for (j=0;j<d;j++)
{
printf("grad[%i]= %f \n",j+1,(gradient(X))[j]);
}
return 0;
}
ça m'affiche " grad[1]= 0.00000" infiniment
(comme si j'avais fait une boucle infinie)
et ça ne passe jamais à grad[2] (en plus le résultat est faux)
int main(void)
{
int j;
for (j=0;j<d;j++)
{
printf("grad[%i]= %f \n",j+1,(gradient(X))[j]);
}
return 0;
}
ça m'affiche " grad[1]= 0.00000" infiniment
(comme si j'avais fait une boucle infinie)
et ça ne passe jamais à grad[2] (en plus le résultat est faux)
en fait j'aimerais juste savoir si qq'un arrive à coder une fonction toute bête renvoyant un tableau, que je voie le code et que je le compare au mien
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
4 août 2004 à 18:31
4 août 2004 à 18:31
J'ai compilé ton code moyennant une petite modif dans le for pour éviter l'appel de ta fonction.
Voici l'affichage résultant :
3.600000 .. 4.600000 .. 5.600000
Appuyez sur la touche « Entrée » pour continuer !
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
int d =3; double* gradient(double* t) { double *grad = (double*) malloc(sizeof(double)*d); int j; for (j=0;j<d;j++) { *(grad+j)=j+*t; } return grad; } int main(int argc, char *argv[]) { double *test; double t=3.6; test = gradient(&t); printf("%f .. %f .. %f\n", *(test+0), test[1], *(test+2)); return EXIT_SUCCESS; }
Voici l'affichage résultant :
3.600000 .. 4.600000 .. 5.600000
Appuyez sur la touche « Entrée » pour continuer !
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 août 2004 à 15:55
5 août 2004 à 15:55
Moi, j'ai jamais reussi. J'ai fini par me résoudre à utiliser <vector> qui en plus à beaucoup d'avantages comparer au tableau (à moins que cet en tête n'existe pas en , seulement en C++)
peu être qu'une version du compilo pour Ravachol, et eileen serai le bien venu : exemple
avec gcc2.95.3, double a[N],b[N];
a=b;
est autoriser, chaque éléments de b est copier dans a.
avec gcc3.2 , il y a une erreur.
à par ça, en efet renvoyer un pointeur pose des problèmes en général, surtout sur une variable local. sinon, tu peu utiliser la passage en paramère.
au lieu de J=grad(T), tu fait grad(T,J).
Salutation !
Char Snipeur
peu être qu'une version du compilo pour Ravachol, et eileen serai le bien venu : exemple
avec gcc2.95.3, double a[N],b[N];
a=b;
est autoriser, chaque éléments de b est copier dans a.
avec gcc3.2 , il y a une erreur.
à par ça, en efet renvoyer un pointeur pose des problèmes en général, surtout sur une variable local. sinon, tu peu utiliser la passage en paramère.
au lieu de J=grad(T), tu fait grad(T,J).
Salutation !
Char Snipeur
Ravachol
Messages postés
566
Date d'inscription
vendredi 5 mars 2004
Statut
Membre
Dernière intervention
30 octobre 2005
120
5 août 2004 à 16:24
5 août 2004 à 16:24
Salut,
voici pour le compilo :
gcc 3.3.2
Le prog est écrit sous l'EDI KDevelop 3.0.1
Pour Vector je crois que c'est du C++ seulement.
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
voici pour le compilo :
gcc 3.3.2
Le prog est écrit sous l'EDI KDevelop 3.0.1
Pour Vector je crois que c'est du C++ seulement.
A++
La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
4 août 2004 à 17:42
je l'ai définie égale à 3 ms elle peut chger
4 août 2004 à 17:43