我已经没有希望和想法了。我一直在尝试调试这个简单的代码,它应该在文件中创建一个简单的表,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);
}
指向
浮点f1
和f2
的指针未初始化。使它们成为简单的浮点变量,并使用地址运算符传递它们
float f1, f2;
calc23(x, &f1, &f2);
printf("..", f1, f2);
以下建议的代码:
- 干净地编译
- 不会 SEG 故障,因为没有未定义的行为会导致 SEG 故障
- 正确检查系统功能中的错误
- 文档为什么包含每个头文件
- 更正问题注释中列出的问题
- 选择使用
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
简单的调试代码: F1 和 F2 未初始化