Pb en C : fct retournant un tableau
eileen
-
Ravachol Messages postés 566 Date d'inscription Statut Membre Dernière intervention -
Ravachol Messages postés 566 Date d'inscription Statut Membre Dernière intervention -
hello tlm!
bon voilà, j'ai un pb en C : je voudrais programmer une fonction retournant un tableau mais je n'y arrive pas, même en utilisant des pointeurs
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;
}
la fonction der_part2(j,t) marche parfaitement mais gradient fait de la merde
merci de votre aide
(dsl si cette question a déjà été posée ms le moteur de recherche ne semble pas marcher)
eileen
bon voilà, j'ai un pb en C : je voudrais programmer une fonction retournant un tableau mais je n'y arrive pas, même en utilisant des pointeurs
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;
}
la fonction der_part2(j,t) marche parfaitement mais gradient fait de la merde
merci de votre aide
(dsl si cette question a déjà été posée ms le moteur de recherche ne semble pas marcher)
eileen
7 réponses
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
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.
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
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
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
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
je l'ai définie égale à 3 ms elle peut chger