Compilation non reussie

Bonjour,
j'ai trouvé un code source d'un programme calculant la correlation linéaire entre 2 signaux(cela devrait me permettre de
continuer mon exercice en traitement numerique du signal) ,pourtant le compilateur m'informe qu'il ya une erreur
et je ne peux donc pas l'executer.(je rappelle que je suis debutant en programmation en c).

le code source du programme en question est le suivant

#include <math.h>
#include <stdio.h>

void correlation(double *x,double *y,int n, double *r/*out*/)
{
int i,j,delay,maxdelay;
double mx,my,sx,sy,sxy,denom;
maxdelay=n/2;
printf("%f \n",maxdelay);

/* Calculate the mean of the two series x[], y[] */
mx = 0;
my = 0;
for (i=0;i<n;i++) {
mx += x[i];
my += y[i];
}
mx /= n;
my /= n;

/* Calculate the denominator */
sx = 0;
sy = 0;
for (i=0;i<n;i++) {
sx += (x[i] - mx) * (x[i] - mx);
sy += (y[i] - my) * (y[i] - my);
}
denom = sqrt(sx*sy);

/* Calculate the correlation series */
for (delay=-maxdelay;delay<maxdelay;delay++) {
sxy = 0;
for (i=0;i<n;i++) {
j = i + delay;
if (j < 0 || j >= n)
continue;
else
sxy += (x[i] - mx) * (y[j] - my);
/* Or should it be (?)
if (j < 0 || j >= n)
sxy += (x[i] - mx) * (-my);
else
sxy += (x[i] - mx) * (y[j] - my);
*/
}

r[delay + maxdelay] = sxy / denom;

/* r is the correlation coefficient at "delay" */

}
}

merci d'avance pour toute aide!
Configuration: Windows XP
Internet Explorer 8.0

7 réponses

  1. Modérateur
    Salut,

    Ton main est où?
    0
    1. en fait je n'ai pas de main mais d'autres codes sources.(celui qui suit a l'extension .h)

      void correlation(double *x,double *y,int maxdelay, double *r);
      void fastCorrelation(float *x,float *y,int T, float *r);

      double x[10000]={
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      };

      double y[10000]={
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      100,
      };

      c'est quoi au juste car je ne le comprend pas bien.
      0
  2. Modérateur
    Re,

    La fonction main est indispensable pour un programme.

    Tu compiles quoi?
    Tu dois avoir un fichier avec l'extension .c
    Les .h ne sont que des fichiers d'en-tête (headers) qui sont utiliser par les fichiers .c grâce à la directive #include
    0
    1. merci dejà pour ton aide.

      j'ai un peu modifier le 1er code comme ceci.

      #include <math.h>
      #include <stdio.h>
      #include <conio.h>

      void main(double *x,double *y,int n, double *r/*out*/)
      {
      int i,j,delay,maxdelay;
      double mx,my,sx,sy,sxy,denom;
      maxdelay=n/2;
      printf("%f \n",maxdelay);

      /* Calculate the mean of the two series x[], y[] */
      mx = 0;
      my = 0;
      for (i=0;i<n;i++) {
      mx += x[i];
      my += y[i];
      }
      mx /= n;
      my /= n;

      /* Calculate the denominator */
      sx = 0;
      sy = 0;
      for (i=0;i<n;i++) {
      sx += (x[i] - mx) * (x[i] - mx);
      sy += (y[i] - my) * (y[i] - my);
      }
      denom = sqrt(sx*sy);

      /* Calculate the correlation series */
      for (delay=-maxdelay;delay<maxdelay;delay++) {
      sxy = 0;
      for (i=0;i<n;i++) {
      j = i + delay;
      if (j < 0 || j >= n)
      continue;
      else
      sxy += (x[i] - mx) * (y[j] - my);
      /* Or should it be (?)
      if (j < 0 || j >= n)
      sxy += (x[i] - mx) * (-my);
      else
      sxy += (x[i] - mx) * (y[j] - my);
      */
      }

      r[delay + maxdelay] = sxy / denom;

      /* r is the correlation coefficient at "delay" */

      }
      getch ();
      }

      mais le compilateur affiche comme erreur `main' must return `int'
      0
  3. Modérateur
    Re,

    Un main peut avoir cette forme
    int main()
    {
       /* déclaration variables */
      /* instructions */
      return 0;
    }
    ou
    int main(int argc, char **argv)
    {
       /* déclaration variables */
      /* instructions */
      return 0;
    }


    Donc il n'y a pas des paramétrés qui doivent être passer à main
    En revanche tu peux appeler une fonction et lui passer des arguments dans main

    Ce qui donne
    void correlation(double *x,double *y,int n, double *r);
    
    int main()
    {
       /* déclaration variables */
      /* instructions */
      correlation(x,y,n,r); /* appel de ta fonction */
      /*instructions*/
      return 0;
    }
    
    void correlation(double *x,double *y,int n, double *r){
       /* le code de la fonction */
    }


    0
    1. Pour info voilà le projet complet issu du site cppfrance.com, ci-joint le lien

      http://www.cijoint.fr/cjlink.php?file=cj200812/cijegonJdp.zip

      Le projet à charger est echo_canceller.dsw, il te chargera tous les fichiers nécessaires
      Signal 1 : fx.txt
      Signal 2 : fy.txt
      Résultat : text.txt

      A plus
      0
      1. merci beaucoup!
        je vais essayer.
        0
    2. Modérateur
      Re,

      Ok, je vois.

      J'ai modifié le fichier test1.c (j'ai rendu main en int et j'ai ajouté un return 0; à la fin - voir en gras)
      #include <stdio.h>
      #include <stdlib.h>
      #include <math.h>
      #include "correlation.h"
      #include "outil.h"
      
      
      
      int main(void)
      {
      
              FILE * fr= fopen ("txt.txt", "w");
              FILE * fx= fopen ("fx.txt", "r");
              FILE * fy= fopen ("fy.txt", "r");
              double r[10000];
              int i,nbr, T= 10000;
          for(i=0;i<T;i++) r[i]=0;
      
              nbr=0;
              while (fscanf(fx,"%lf",&x[nbr]) != EOF) { /* essai lecture ligne */
             nbr++;
         }
      
              nbr=0;
              while (fscanf(fy,"%lf",&y[nbr]) != EOF) { /* essai lecture ligne */
             nbr++;
         }
      
          correlation(x,y,T,r);
      
              for(i=0;i<T;i++)
              {
              fprintf(fr,"%lf \n",r[i]*100);
              }
      
              fclose(fr);
              fclose(fx);
              fclose(fy);
      
              printf("Max = %lf\n",maxTab(r,T-1));
              return 0;
      }
      


      J'ai ajouter un saut de ligne pour les fichiers .c
      Et j'ai compilé
      lami20j@debian:~/src/c$ ls -1
      cijegonJdp.zip
      correlation.c
      correlation.h
      echo_canceller.dsp
      echo_canceller.dsw
      echo_canceller.ncb
      echo_canceller.opt
      echo_canceller.plg
      fx.txt
      fy.txt
      outil.c
      outil.h
      @Readme-CodeS-SourceS-FR.txt
      @Source telecharge depuis ce lien.url
      test1.c
      txt.txt
      lami20j@debian:~/src/c$ gcc -c correlation.c outil.c test1.c
      lami20j@debian:~/src/c$ gcc -o test1 correlation.o outil.o test1.o -lm
      lami20j@debian:~/src/c$ ./test1
      -0.000000
      Max = 1.000000
      
      0
      1. excuses-moi de t'embeter mais que veux -tu dire par saut de ligne?
        0
      2. Modérateur
        @joeel85Tu ouvre les fichiers avec un éditeur de texte sans mise en forme et à la fin appuie une fois sur Entrer comme tu le fait quand tu arrive à la fin d'une ligne pour passer à la ligne suivante.
        0
      3. @lami20jainsi en modifiant le fichier test1.c comme tu l'a fait (et en y ajotant un saut de ligne),en ajoutant aussi un saut de ligne au fichiers outil.c et correlation.c (tout en sauvegardant à la fin) et pour tout terminer en chargeant le fichier

        echo_canceller.dsp je devrais reussir la compilation?
        0
    3. Tu gardes tout comme c'est mais tu charges le .dsw en open workspace
      0
      1. merci encore pour tes infos.
        j'ai fait comme tu l'as demandé et la compilation a reussie mais il ya un problème au niveau de
        l'execution car windows ferme le programme et ce dernier ne peux continuer à s'excuter.
        quelle peut en etre la cause ?
        0
    4. Je ne vois pas ton soucis, mais en lui-même le programme n'affiche quasiment rien, il met juste le résultat dans le fichier text.txt.
      Par contre assure toi que ton executable soit dans le même répertoire que tes sources fx.txt et fy.txt parce que mine de rien se sont les données de base
      0
      1. justement le programme n'affiche rien mais il n'ya pas de données dans mon fichier text.txt(il est totalement vide).
        0