读书人

为何循环中调用函数出有关问题

发布时间: 2012-04-14 17:14:21 作者: rapoo

【求助】为何循环中调用函数出问题

C/C++ code
    for(k=0;k<10;k++)    {        c+=shift;        dedispersion(c, displacement, fbk, result);


程序中,上面这句出问题。我试过,只要写成c=shift;就完全没问题,但是在下面函数中,c这个参数就变不了了。可是一些成如上的形式,编译,连接没问题,但是运行一半就自动关闭程序。如果我把k=1,就可以运行正常。这是为什么呢?

整个代码如下:

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <math.h>#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)]);intmain(){    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<NT;i++)    {        for(j=0;j<NF/(NTAO*NT);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<NT;i++)        {            for(j=0;j<NF/(NTAO*NT);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<NT;i++)    {            if(i<NT/2)        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<NT;i++)        if(displacement[i]>(NF/(NTAO*NT)))            displacement[i]=NF/(NTAO*NT);        /*    for(i=0;i<NT;i++)        printf("%d, ", displacement[i]);    printf("\n");*/    /*de-dispersion*/    for(i=0;i<NT;i++)    {        for(j=0;j<NF/(NTAO*NT);j++)        {            result[i][j]=0.0;            if((i!=0)&&(i<NT/2))                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<differ+1;m++)            {                k=j+m+displacement[i];                if(k>NF/(NTAO*NT)-1)                    break;                    result[i][j]+=fbk[i][k];                        }            }    }} 



[解决办法]
你文件里啥内容……我调试看看……

读书人网 >C语言

热点推荐