Compilation non reussie

joeel85 Messages postés 66 Statut Membre -  
joeel85 Messages postés 66 Statut Membre -
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!

7 réponses

lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

Ton main est où?
0
joeel85 Messages postés 66 Statut Membre 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
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
joeel85 Messages postés 66 Statut Membre 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
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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
joeel85 Messages postés 66 Statut Membre 2
 
merci beaucoup!
je vais essayer.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
joeel85 Messages postés 66 Statut Membre 2
 
excuses-moi de t'embeter mais que veux -tu dire par saut de ligne?
0
lami20j Messages postés 21644 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570 > joeel85 Messages postés 66 Statut Membre
 
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
joeel85 Messages postés 66 Statut Membre 2 > lami20j Messages postés 21644 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
mikebzh Messages postés 135 Statut Membre 28
 
Tu gardes tout comme c'est mais tu charges le .dsw en open workspace
0
joeel85 Messages postés 66 Statut Membre 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
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
joeel85 Messages postés 66 Statut Membre 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