Compilation non reussie

joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -  
joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -
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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Ton main est où?
    0
    1. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2
       
      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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2
       
      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. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  4. mikebzh Messages postés 135 Statut Membre 28
     
    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. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2
       
      merci beaucoup!
      je vais essayer.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2
       
      excuses-moi de t'embeter mais que veux -tu dire par saut de ligne?
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention  
         
        Tu 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
      2. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        ainsi 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
  7. mikebzh Messages postés 135 Statut Membre 28
     
    Tu gardes tout comme c'est mais tu charges le .dsw en open workspace
    0
    1. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2
       
      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
  8. mikebzh Messages postés 135 Statut Membre 28
     
    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. joeel85 Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   2
       
      justement le programme n'affiche rien mais il n'ya pas de données dans mon fichier text.txt(il est totalement vide).
      0