c语言循环过程中调用函数,为何循环中调用函数出有关问题

C/C++ code#include

#include

#include

#define PI 3.14159265358979323846264338327950288419716939937510

#define TWO_PI (6.2831853071795864769252867665590057683943L)

#define NF 33554432 //total number of data.

#define NT 512 //number of channels.

#define NTAO 32 // NTAO is the number that we use to creat filter bank.

#define FS 14000100

/* function prototypes */

void checkN (int N);

void dedispersion(double DM, int *displacement, double (*fbk)[NF/(NT*NTAO)], double (*result)[NF/(NT*NTAO)]);

int

main()

{

int i, j, k, *displacement;

double DMbase, shift, (*fbk)[NF/(NT*NTAO)], (*result)[NF/(NT*NTAO)];

double c=0.0;

FILE *fp;

char file[FILENAME_MAX]; // name of data file

DMbase=50000000000000.0;

shift=DMbase*0.1;

/*initiation */

checkN(NF); // Check that NF = 2^n for some integer n >= 1.

checkN(NT);

if(!((fbk = malloc( NF/NTAO * sizeof(double)))&&

(result = malloc( NF/NTAO * sizeof(double)))&&

(displacement = malloc( NT * sizeof(int)))))

printf("memory error \n");

/*read data from txt file.*/

if(!(fp = fopen("fbkwithdis.txt", "r")))

{

printf(" fbkwithdis.txt could not be opened!");

exit(EXIT_FAILURE);

}

for(i=0;i

{

for(j=0;j

fscanf(fp, "%lf ", &fbk[i][j]);

fprintf(fp, "\n");

}

fclose(fp);

/*de-dispersion*/

for(k=0;k<10;k++)

{

c+=shift;

dedispersion(c, displacement, fbk, result);

/*output data to txt file*/

sprintf(file, "%d.txt", k);

if(!(fp = fopen(file, "w")))

{

printf(" File \'%s\' could not be opened!", file);

exit(EXIT_FAILURE);

}

for(i=0;i

{

for(j=0;j

fprintf(fp, "%e ", result[i][j]);

fprintf(fp, "\n");

}

fclose(fp);

}

free(fbk);

free(result);

free(displacement);

}

/* Check that N = 2^n for some integer n >= 1. */

void

checkN (int N)

{

int i;

if(N >= 2)

{

i = N;

while(i==2*(i/2))

i = i/2; /* While i is even, factor out a 2. */

} /* For N >=2, we now have N = 2^n iff i = 1. */

if(N < 2 || i != 1)

{

printf("NF, which does not equal 2^n for an integer n >= 1.");

exit(EXIT_FAILURE);

}

}

void dedispersion(double DM, int *displacement, double (*fbk)[NF/(NT*NTAO)], double (*result)[NF/(NT*NTAO)])

{

int i, j;

int m=0, differ=0, k=0;

double time, frequency;

/*find the displacement for each channel*/

for(i=0;i

{

if(i

frequency=(i*1.0)*FS/(NT-1);

else

frequency=(i*1.0)*FS/(NT-1)-FS;

if(frequency-0.0<0.5&&frequency-0.0>-0.5)

frequency=0.5;

time=DM/((frequency*frequency)*TWO_PI);

displacement[i]=(time/(1.0/FS))/(NT*NTAO);

}

for(i=0;i

if(displacement[i]>(NF/(NTAO*NT)))

displacement[i]=NF/(NTAO*NT);

/* for(i=0;i

printf("%d, ", displacement[i]);

printf("\n");

*/

/*de-dispersion*/

for(i=0;i

{

for(j=0;j

{

result[i][j]=0.0;

if((i!=0)&&(i

differ=displacement[i-1]-displacement[i];

else if((i!=NT-1)&&(i>NT/2-1))

differ=displacement[i+1]-displacement[i];

else

differ=0;

if(differ<0)

printf("error! differ is less than zero!\n");

for(m=0;m

{

k=j+m+displacement[i];

if(k>NF/(NTAO*NT)-1)

break;

result[i][j]+=fbk[i][k];

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值