2014-03-09 2 views
0

Когда я ввожу значения в документ и распечатываю их из одного и того же цикла, я печатаю правильные значения. Однако, как только я помещаю значения после того, как они были помещены в массив в другом цикле примерно на половину пути, я получаю неправильные значения, остальные согласны. Спасибо за любую помощь!Распечатка дополнительных 2 строк в моем коде

int main(){ 

    int i = 0; 
    int n = 0; 

    float x, y, x1, y2; 

    FILE *fp; 

    /*open the file*/ 

    fp = fopen("/Users/QuantumEh/Documents/datafiles/table.dat", "r"); 

    /*creates array which allocates appropariate size*/ 


    float *x_axis = (float*) malloc(sizeof(fp)); 
    float *y_axis = (float*) malloc(sizeof(fp)); 

    if (fp == NULL){ 

     printf("Could not open \n"); 
     exit(0); 
    } 

    /*reads in the file*/ 

    while (fscanf(fp, "%f %f\n", &x_axis[i], &y_axis[i]) == 2){ 

     printf("%.3f %.3f \n", x_axis[i], y_axis[i]); 

     i++, n++; 

    } 



    /* calculates at one-third and then at two-thirds*/ 

    for (i = 0; i <= n - 1; i++){ 


     x = x_of_interpolation_onethird(x_axis[i + 1], x_axis[i]); //finds x of interpolation 

     y = lagrange_interpolation(&x_axis[i], &y_axis[i], x); //plugs in the orignal x and y and the x of interpolation 

     x1 = x_of_interpolation_twothird(x_axis[i + 1], x_axis[i]); //finds the other x of interpolation 

     y2 = lagrange_interpolation(&x_axis[i], &y_axis[i], x1); //plugs in the orignal x and y and the x of interpolation 


     /* prints out all the numbers*/ 

     //printf("%.3f %.3f \n", x_axis[i], y_axis[i]); 
     //printf("%.3f \n", x1); 
     //printf("%.3f %.3f\n", x, y); 


    } 


    return 0; 
} 
+3

некоторое время, так как я сделал C файл IO, но я не думаю, что sizeof (fp) даст вам достаточное выделение. – kenny

+1

'sizeof (fp)' полностью не имеет отношения к «соответствующему размеру» - когда вы выделяете крошечные массивы и записываете путь от конца, все, что угодно может произойти. – Notlikethat

ответ

0

Основной проблемой является то, что, используя приведенный ниже код делает не определить количество значений с плавающей запятой, необходимых для выделения памяти. Размер fp не имеет ничего общего с необходимой памятью.

fp = fopen("/Users/QuantumEh/Documents/datafiles/table.dat", "r"); 
float *x_axis = (float*) malloc(sizeof(fp)); 

Вместо этого используйте другие методы. Один из методов, определенный для работы, но немного неэффективный, состоит в том, чтобы прочитать плитку дважды.

fp = fopen("/Users/QuantumEh/Documents/datafiles/table.dat", "r"); 
... 
float x,y; 
size_t n = 0; 
while (fscanf(fp, "%f %f\n", &x, &y) == 2) n++; 
float *x_axis = malloc(n * sizeof *x_axis); 
float *y_axis = malloc(n * sizeof *y_axis); 

rewind(fp); 
size_t i = 0; 
for (i=0; i<n; i++) { 
    if (fscanf(fp, "%f %f\n", &x_axis[i], &y_axis[i])!=2) Handle_UnexpectedError(); 
} 
fclose(fp); 

// Use x_axis, y_axis 

// Be sure to free when done 
free(x_axis); 
free(y_axis); 

Примечание: непроверенный код.

Смежные вопросы