Pb en C : fct retournant un tableau

Fermé
eileen - 4 août 2004 à 16:15
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 - 5 août 2004 à 16:24
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

7 réponses

Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
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
0
c une variable globale
je l'ai définie égale à 3 ms elle peut chger
0
eileen > eileen
4 août 2004 à 17:43
euh un paramètre plutot
0
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
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!
0
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;
}
0
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.
0
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
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
0
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
4 août 2004 à 18:23
Désolé pour le doublon ;-)

La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
0
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)
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
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.
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
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
0
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
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
0