我已经没有希望和想法了。我一直试图调试这个简单的代码,它应该在文件中创建一个简单的表3天。运行时我总是遇到一个分段错误。我是c的新手,但我知道分段错误是什么。我似乎无法解决这个问题。运行已编译的代码时,它会创建一个具有正确名称的空文件,但随后会发生错误,并且我会保留一个新的但完全空的文件。所以问题,我想,是在fopen和第一个fprintf之间。有什么想法吗?
#include <stdio.h>
#include <math.h>
void calc23(float x, float *f1, float *f2){
*f1 = pow(x,2)-4.0*x+8.0;
*f2 = pow(x,3)+2.0*x;
}
void main(){
FILE *datf;
datf = fopen("mydatatable.data", "w");
float *f1, *f2;
float r = -2.0;
for(int i=1; i<100; i++){
calc23(r, f1, f2);
fprintf(datf, "%f %f %f \n", r, *f1, *f2);
r += (4.0/99.0);
}
fclose(datf);
}
答案 0 :(得分:1)
指向浮动f1
和f2
的指针未初始化。
使它们成为简单的浮点变量,并使用地址运算符
float f1, f2;
calc23(x, &f1, &f2);
printf("..", f1, f2);
答案 1 :(得分:0)
简单调试代码: f1和f2未初始化
答案 2 :(得分:0)
以下提议的代码:
powf()
而不是pow()
,因此所有值(和文字)都有float
现在建议的代码:
#include <stdio.h> // fopen(), fclose(), fwrite(), FILE
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <math.h> // powf()
// prototypes
void calc23(float x, float *f1, float *f2);
int main( void )
{
FILE *datf = fopen("mydatatable.data", "w");
if( !datf )
{
perror( "fopen to write mydatatable.data failed");
exit( EXIT_FAILURE );
}
// implied else, fopen successful
float f1;
float f2;
float r = -2.0f;
for(int i=1; i<100; i++)
{
calc23(r, &f1, &f2);
fprintf(datf, "%f %f %f \n", r, f1, f2);
r += (4.0f/99.0f);
}
fclose(datf);
}
void calc23(float x, float *f1, float *f2)
{
*f1 = powf(x,2.f)-4.0f*x+8.0f;
*f2 = powf(x,3.f)+2.0f*x;
}
该计划输出的前几行:
-2.000000 20.000000 -12.000000
-1.959596 19.678400 -11.444072
-1.919192 19.360065 -10.907337
-1.878788 19.044994 -10.389402
该计划输出的最后几行:
1.838385 4.026119 9.889888
1.878789 4.014692 10.389421
1.919193 4.006530 10.907358
1.959597 4.001633 11.444093