无法在while循环外保留数组

时间:2016-12-02 15:42:51

标签: c embedded signal-processing blackfin

我目前正在处理下面的C代码。我需要在while之后访问fclose循环之外的数组。似乎 blackfin ADSP 内核每次运行时都会崩溃。我将进一步需要它来执行FFT。请帮忙!

#include <stdlib.h>
#include <stdio.h>
#include <flt2fr.h>
#include <fract_math.h>
#include <math_bf.h>
#include <complex.h>
#include <filter.h>

int main() 
{
    int n = 1024;
    long int dat1[n];
    FILE *file1;
    fract16 *m;
    int i;

    // file1 open and read the values
    file1 = fopen("0.dat", "r");
    if (file1 == NULL) {
       printf("I couldn't open 0.dat for reading.\n");
       exit(0);
    }

    while (!feof(file1)) {
        fgets(dat1, n, file1);
        m = malloc(sizeof(fract16) * n);
        for (i = 0; i < n; i++) {
            sscanf(dat1, "%f", &m[i]); //getting error here
        }
    }

    fclose(file1);
    printf("%lf\n", m);
    return 0;
}

好的,谢谢大家纠正我的错误,但问题仍未得到解决。我可以打印内部的所有值,但在循环外它只打印数据集的最后一个值,有没有精确的解决方案呢?我用谷歌搜索了几个小时但还没有成功。 代码如下&gt;

#include <stdlib.h>
#include <stdio.h>
#include <flt2fr.h>
#include<fract_math.h>
#include <math_bf.h>
#include <complex.h>
#include <filter.h>
int main()
{
    int n = 1024;
    long int dat1[n];
    FILE *file1;
    fract16 *m;

    file1 = fopen("0.dat", "r");
      if (file1 == NULL) {
         printf("I couldn't open 0.dat for reading.\n");
         exit(0);
      }

    while( !feof(file1))
    {

       fgets(dat1,n,file1);
       sscanf(dat1, "%f", &m);
       printf("%f\n",m); //Prints all elements in the 1st column of the  array, 0.dat is a nx2 matrix
    }
    fclose(file1);
}

2 个答案:

答案 0 :(得分:1)

在while循环之外,您可以在读取文件之前为缓冲区分配内存。然后每次在读入缓冲区之前,只需使用memset并将缓冲区设置为所有空字符。

另外,尝试使用fread直接读入缓冲区而不是fgets

答案 1 :(得分:0)

变量m被定义为fract16

的指针和数组

解决问题建议:

if( 1 != sscanf(dat1, "%f", m+(sizeof(fract16)*i) )
{
    perror( "sscanf failed" );
    exit( EXIT_FAILURE );
}

错误正在导致,因为m已经是指针,并且您希望它继续作为指针

暂且不说。代码不会检查在调用fgets()时实际读取了多少数据,因此for()很可能正在读取实际数据的末尾。通过while()循环的每次旅行都会破坏/覆盖从之前调用malloc()

获得的指针

然后在代码中是声明:

printf("%lf\n", m);

但是m是一个指向`fract16对象数组的指针。

和那些fract16个对象可能是double个值,但这个细节并不清楚。在任何情况下,对printf()的这种调用最多只会从输入文件中最后一行的开头输出一个double值。那是你真正想做的吗?

注意:dat1[]被声明为long int的数组,但对sscanf()的调用似乎是在试图提取float值。

即。代码与数据类型不一致,也不是单个值的提取,也不是打印。

有一点需要注意:使用当前代码会导致大量内存泄漏,因为m的调用会反复覆盖指针malloc()并且由于使用了feof() ,对fgets()的最后一次调用将失败,因此dat1[]的cotents将以NUL字节开头

建议分配一个指向fractl16个对象的指针数组

然后对于每一行读取,使用malloc()设置指针数组中的下一个指针,...