2016-12-02 16 views
1

В настоящее время я работаю над кодом C ниже. Мне нужно получить доступ к массиву за пределами цикла while, после fclose. Похоже, что ядро ​​blackfin ADSP падает каждый раз, когда я запускаю его. Я буду нуждаться в этом дальше, чтобы выполнить БПФ. Пожалуйста помоги!Невозможно сохранить массив вне цикла while

#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; 
} 

Хорошо, благодарю вас всех за исправление моих ошибок, но проблема все еще не решена. Я могу напечатать все значения внутри, но за пределами цикла он печатает только последнее значение набора данных, есть ли какое-то точное решение для этого? Я гугл в течение нескольких часов, но пока не успел. код выглядит следующим образом>

#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); 
} 
+3

Добро пожаловать в переполнение стека! См. [Почему »while (! Feof (файл))« всегда неправильно? »(Http://stackoverflow.com/q/5431941/2173917) –

+1

Проверьте возвращаемое значение' fgets (dat1, n, file1) ' перед использованием 'dat1' – chux

+0

Зависит от того, что в вашем файле я предполагал, но это, скорее всего, утечка памяти. Сколько раз вы пробиваете цикл while? Сохраняется только указатель на последний 'malloc'. – yano

ответ

1

Вы можете выделить память для буфера перед чтением файла, вне цикла. Затем каждый раз перед чтением в буфер просто используйте memset и устанавливайте буфер для всех нулевых символов.

Кроме того, попробуйте использовать Fread читать непосредственно в буфер, а не fgets

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() будет в лучшем случае выводить только одно двойное значение из начала последней строки во входном файле. Это то, что вы действительно хотите сделать?

Примечание: dat1[] объявлен как массив long int, но призыв к sscanf(), кажется, пытается извлечь float значения.

I.E. код несовместим с типами данных, ни извлечения отдельных значений, ни печати.

Одно замечание: с текущим кодом есть массивная утечка памяти из-за указателем m быть многократно переписаны вызовами malloc() А в связи с использованием feof(), последний вызов fgets() не получится, так что cotents из dat1[] будет начиная с байта NUL

Предложить выделение массив указателей на объекты fractl16

Тогда для каждой строки для чтения, используйте malloc(), чтобы установить следующий указатель на массив указателей, ...