나는이 문제를 얻을 파일 에서이 프로세스의 모든 단계를 작성하려고하면 일부 방정식의 뿌리를 찾기 위해 이분법의 방법을 사용하는 C 언어로 노력하고 있는데 "세그멘테이션 오류". 이것은 내가 한 바보 같은 잘못 일지 모르지만 나는 이것을 오랫동안 풀기 위해 노력해 왔습니다. gcc를 사용하여 컴파일 중이며 그 코드는 다음과 같습니다.파일을 쓸 때 파일 세분화
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define R 1.0
#define h 1.0
double function(double a);
void attractor(double *a1, double *a2, double *epsilon);
void attractor(double *a1, double *a2, double *epsilon)
{
FILE* bisection;
double a2_copia, a3, fa1, fa2;
bisection = fopen("bisection-part1.txt", "w");
fa1 = function(*a1);
fa2 = function(*a2);
if(function(*a1) - function(*a2) > 0.0)
*epsilon = function(*a1) - function(*a2);
else
*epsilon = function(*a2) - function(*a1);
fprintf(bisection, "a1 a2 fa1 fa2 epsilon\n");
a2_copia = 0.0;
if(function(*a1) * function(*a2) < 0.0 && *epsilon >= 0.00001)
{
a3 = *a2 - (*a2 - *a1);
a2_copia = *a2;
*a2 = a3;
if(function(*a1) - function(*a2) > 0.0)
*epsilon = function(*a1) - function(*a2);
else
*epsilon = function(*a2) - function(*a1);
if(function(*a1) * function(*a2) < 0.0 && *epsilon >= 0.00001)
{
fprintf(bisection, "%.4f %.4f %.4f %.4f %.4f\n", *a1, *a2, function(*a1), function(*a1), *epsilon);
attractor(a1, a2, epsilon);
}
else
{
*a2 = a2_copia;
*a1 = a3;
if(function(*a1) - function(*a2) > 0)
*epsilon = function(*a1) - function(*a2);
else
*epsilon = function(*a2) - function(*a1);
if(function(*a1) * function(*a2) < 0.0 && *epsilon >= 0.00001)
{
fprintf(bisection, "%.4f %.4f %.4f %.4f %.4f\n", *a1, *a2, function(*a1), function(*a1), *epsilon);
attractor(a1, a2, epsilon);
}
}
}
fa1 = function(*a1);
fa2 = function(*a2);
if(function(*a1) - function(*a2) > 0.0)
*epsilon = function(*a1) - function(*a2);
else
*epsilon = function(*a2) - function(*a1);
fprintf(bisection, "%.4f %.4f %.4f %.4f %.4f\n", a1, a2, fa1, fa2, epsilon);
}
double function(double a)
{
double fa;
fa = (a * cosh(h/(2 * a))) - R;
return fa;
}
int main()
{
double a1, a2, fa1, fa2, epsilon;
a1 = 0.1;
a2 = 0.5;
fa1 = function(a1);
fa2 = function(a2);
if(fa1 - fa2 > 0.0)
epsilon = fa1 - fa2;
else
epsilon = fa2 - fa1;
if(epsilon >= 0.00001)
{
fa1 = function(a1);
fa2 = function(a2);
attractor(&a1, &a2, &epsilon);
fa1 = function(a1);
fa2 = function(a2);
if(fa1 - fa2 > 0.0)
epsilon = fa1 - fa2;
else
epsilon = fa2 - fa1;
}
if(epsilon < 0.0001)
printf("Vanish at %f", a2);
else
printf("ERROR");
return 0;
}
이 질문에 적합하지 않다면 어쨌든 죄송합니다. 여기
콘솔을 사용하여 문제를 격리시켜야하는 이유는 무엇입니까? –
파일 이름이 완전하게 형성되지 않았습니다 - 리프 이름 만 제공하십시오. 정규화 된 이름을 제공하고 fopen이 성공했는지 확인하십시오. 분명히 파일 포인터에 액세스하려고 할 때 segfault가 발생하기 때문에 fopen이 실패합니다. – BitBank
콘솔에 인쇄해도 문제가 계속 발생합니다. – user1286390