Pb en C : fct retournant un tableau

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

7 réponses

Ravachol Messages postés 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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
eileen
 
c une variable globale
je l'ai définie égale à 3 ms elle peut chger
0
eileen > eileen
 
euh un paramètre plutot
0
Canard007 Messages postés 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
eileen
 
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
muppet
 
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 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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 566 Date d'inscription   Statut Membre Dernière intervention   120
 
Désolé pour le doublon ;-)

La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD
0
eileen
 
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
eileen
 
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 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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 566 Date d'inscription   Statut Membre Dernière intervention   120
 
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