Rechercher : dans
Par :

Pb en C : fct retournant un tableau

Dernière réponse le 5 aoû 2004 à 16:24:00 eileen, le 4 aoû 2004 à 16:15:52 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « pb en C : fct retournant un tableau » dans :
Les piles en langage C VoirLes piles Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la pile IV. Opérations sur les piles A. Initialisation B. Insertion d'un élément dans la pile C. Ôter un élément de la pile D. Affichage...
Décaler les éléments d'un tableau (Rotation) -Récursivité- VoirVoici une procédure récursive qui permet de décaler tous les éléments d’un tableau d’une position à droite à partir de la position p Procedure Decaler (Var t : Tab; p, n : integer); Begin If p
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...

1

Ravachol, le 4 aoû 2004 à 17:35:32

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

Répondre à Ravachol

2

eileen, le 4 aoû 2004 à 17:42:41

C une variable globale
je l'ai définie égale à 3 ms elle peut chger

Répondre à eileen

3

eileen, le 4 aoû 2004 à 17:43:23

Euh un paramètre plutot

Répondre à eileen

4

Canard007, le 4 aoû 2004 à 17:50:27

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!

Répondre à Canard007

5

eileen, le 4 aoû 2004 à 18:15:24

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;
}

Répondre à eileen

8

muppet, le 4 aoû 2004 à 18:25:02

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.

Répondre à muppet

6

Ravachol, le 4 aoû 2004 à 18:19:08

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

Répondre à Ravachol

7

Ravachol, le 4 aoû 2004 à 18:23:20

Désolé pour le doublon ;-)

La pensée ne commence qu'avec le doute.
ROGER MARTIN DU GARD

Répondre à Ravachol

9

eileen, le 4 aoû 2004 à 18:26:18

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)

Répondre à eileen

10

eileen, le 4 aoû 2004 à 18:27:44

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

Répondre à eileen

11

Ravachol, le 4 aoû 2004 à 18:31:33

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

Répondre à Ravachol

12

Char Snipeur, le 5 aoû 2004 à 15:55:13

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

Répondre à Char Snipeur

13

 Ravachol, le 5 aoû 2004 à 16:24:00

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

Répondre à Ravachol