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!
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
-
ModérateurSalut,
Ton main est où?-
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.
-
-
ModérateurRe,
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-
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'
-
-
ModérateurRe,
Un main peut avoir cette formeint main() { /* déclaration variables */ /* instructions */ return 0; }ouint 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 donnevoid 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 */ }
-
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 -
ModérateurRe,
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
-
-
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.
-
@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?
-
-
Tu gardes tout comme c'est mais tu charges le .dsw en open workspace
-
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