Se connecter / S'enregistrer
Votre question

Fonction tableau pointeur

Tags :
  • Mémoires
  • Programmation
Dernière réponse : dans Programmation
3 Février 2011 15:26:21

bonjour,
je suis un peu perdue sur l'utilisation des tableaux dans une fonction en langage C.
je veux tout simplement qu'une fonction corréle 2 signaux (sous forme de tableaux dans le 'main') et me ressorte sous forme d'un tableau le signal résultat (dont j'utilise ensuite les éléments)
J'ai lu qu'une fonction ne peut pas sortir un tableau mais qu'il faut utiliser les pointeurs: Comment?? et pourquoi??

Dans mon main:

  1. {
  2. ...
  3. float sigR1S1[LRV];
  4. float sigR2S1[LRV];
  5. float sigR1S2[LRV];
  6. float sigR2S2[LRV];
  7.  
  8. ...
  9.  
  10. double *f1 = correlation(sigR1S1,sigR2S1,LRV);
  11. double *f2 = correlation(sigR1S2,sigR2S2,LRV);
  12.  
  13.  
  14. }


ma fonction:

  1. double* correlation(float signal1[], float signal2[], int longueur)
  2.  
  3. {
  4. int K,J,A;
  5. double c1[longueur],c2[longueur];
  6. int L,P,B;
  7.  
  8. for (K=0; K<longueur; K++)
  9. {
  10. for (J=0; J<longueur-K; J++)
  11. {
  12. A=signal1[J]*signal2[K+J];
  13. c1[K]=A+c1[K];
  14. }
  15. }
  16.  
  17. for (L=-1; L>-longueur; L--)
  18. {
  19. for (P=0; P<longueur; P++)
  20. {
  21. if (P>=(-L))
  22. {
  23. B=signal1[P]*signal2[P+L];
  24. c2[L+longueur]=c2[L+longueur]+B;
  25. }
  26. }
  27. }
  28.  
  29. double *f=[2*LRV];
  30.  
  31. int Y,W;
  32. for (Y=0; Y<longueur; Y++)
  33. {
  34. f[Y]=c2[Y];
  35. }
  36. for (Y=longueur; Y<2*longueur; Y++)
  37. {
  38. W=Y-longueur;
  39. f[Y]=c1[W];
  40. }
  41. return f;
  42. }



merci!!

Autres pages sur : fonction tableau pointeur

3 Février 2011 19:55:05

Bonsoir,

Le langage C te permet de retourner une seule variable, toutes les autres variables définies dans la fonction sont perdue lorsqu'on quitte celle-ci. Or un tableau n'est pas une variable, c'est un pointeur vers une zone mémoire où plusieurs variables sont mises bout à bout. Si ça n'est pas clair il faut revoir sur les nombreux cours qu'on trouve un peu partout la notion de pointeur et de tableaux en C.

Si tu veux que ta fonction retourne un tableau tu as deux solutions:
  • Tu déclares le tableau dans la fonction appelante et tu le passes comme argument de la fonction:
    1. // Définition
    2. void correlation(float signal1[], float signal2[], float resultat[], int longueur){
    3. resultat[0] = 42; // etc...
    4. (...)
    5. }
    6.  
    7. // Appel
    8. (...)
    9. float resultat[LRV];
    10. correlation(sigR1S1,sigR2S1,resultat,LRV);


  • Tu crées le tableau de résultat avec de l'allocation dynamique:
    1. // Définition
    2. float* correlation(float signal1[], float signal2[], int longueur){
    3. float *resultat = (float *)malloc(longeur*sizeof(float));
    4. resultat[0] = 42; // etc...
    5. (...)
    6. return resultat;
    7. }
    8.  
    9. // Appel
    10. (...)
    11. float *resultat = correlation(sigR1S1,sigR2S1,LRV);
    m
    0
    l
    4 Février 2011 10:51:39

    Merci pour la réponse!

    Deux autres questions:
    1) au début j'avais fait:
    1. /*Fonction*/
    2. double* correlation(float signal1[], float signal2[], int longueur)
    3. {double *f=[2*LRV];
    4. //....
    5. return f;
    6. }
    7. /*Appel*/
    8. double *f1 = correlation(sigR1S1,sigR2S1,LRV);

    ça ne marchait pas, or je ne vois pas la différence avec ta réponse excepté l'allocation dynamique du tableau: pourquoi cette allocation est nécessaire vu que je connais sa longueur?

    2) J'utilise cette fonction 2 fois de suite pour 2 signaux différents,
    je me suis rendue compte que la deuxième utilisation de ma fonction "conserve" les résultats du premier. Pourquoi il y a cette "conservation de mémoire" les variables étant différentes??
    J'ai tenté d'utiliser "free" dans ma fonction après le return mais aucune différence (sans doute car la fonction s'arrête avec le return). Comment faire pour remettre à zéro ma fonction (sachant qu'après j'ai évidemment besoin de conserver mes variables sorties par la fonction!)?

    Merci pour ton aide!
    m
    0
    l
    Contenus similaires
    4 Février 2011 19:16:23

    eeeLLL a dit :
    or je ne vois pas la différence avec ta réponse excepté l'allocation dynamique du tableau: pourquoi cette allocation est nécessaire vu que je connais sa longueur?

    Quand tu crées une variable dans une fonction, sa mémoire est allouée sur la zone mémoire qu'on appelle la pile. Cette zone mémoire est perdue quand tu quittes la fonction. En utilisant l'allocation dynamique, la mémoire est allouée sur le tas qui est une zone mémoire qui est conservée tant que tu ne la libère pas explicitement avec la fonction free(). Je suis pas certain d'être clair, c'est plus facile en ayant des notions d'assembleur :) 

    Pour ta deuxième question je vois pas, tu peux nous montrer le code ? :) 
    m
    0
    l
    a b L Programmation
    4 Février 2011 20:55:54

    Comme edyr l'indiquait, un tableau, n'est qu'un concept abstrait, car un tableau n'est qu'un pointeur qui n'est qu'une adresse mémoire (pointant juste le début d'une zone quelque part en mémoire).
    Si le problème vient de ta fonction, alors attention, car tu n'initialises pas le contenu du tableau avant de le lire (et en C, un tableau n'est pas forcément rempli de 0, mais est remplit de ce qui se trouvait déjà dans cette zone mémoire). Lors du second appel, même si ce n'est réservé que sur la pile, tu peux, par chance, tomber sur la même zone mémoire, et comme cette zone mémoire n'est pas, non plus, réinitialisée à 0 lors qu'il n'est plus valable, il se peut que tu y retrouves les données de l'ancien appel. Il ne faut pas se baser sur la chance lorsqu'on programme en C. :) 
    Si tu fais autre chose entre les 2 appels, il se peut que tu y trouves des valeurs totalement différentes.
    Donc, toujours mettre à 0 le contenu des tableaux si tu ne les initialises pas. Pour ça, tu peux faire un memset(tableau, 0x00, taille tableau) qui met directement tout à 0 sans faire de boucle.
    m
    0
    l
    11 Février 2011 21:49:35

    Merci pour vos aides!
    Effectivement j'avais des problèmes d'initialisation de tableaux dans ma fonction .... Tout fonctionne correctement maintenant!
    m
    0
    l
    Tom's guide dans le monde
    • Allemagne
    • Italie
    • Irlande
    • Royaume Uni
    • Etats Unis
    Suivre Tom's Guide
    Inscrivez-vous à la Newsletter
    • ajouter à twitter
    • ajouter à facebook
    • ajouter un flux RSS