2012-03-22 7 views
2

나는이 문제를 얻을 파일 에서이 프로세스의 모든 단계를 작성하려고하면 일부 방정식의 뿌리를 찾기 위해 이분법의 방법을 사용하는 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; 

} 

이 질문에 적합하지 않다면 어쨌든 죄송합니다. 여기

+0

콘솔을 사용하여 문제를 격리시켜야하는 이유는 무엇입니까? –

+0

파일 이름이 완전하게 형성되지 않았습니다 - 리프 이름 만 제공하십시오. 정규화 된 이름을 제공하고 fopen이 성공했는지 확인하십시오. 분명히 파일 포인터에 액세스하려고 할 때 segfault가 발생하기 때문에 fopen이 실패합니다. – BitBank

+0

콘솔에 인쇄해도 문제가 계속 발생합니다. – user1286390

답변

1

열린 파일이 너무 많습니다. attractor을 반복적으로 호출하고 각 호출은 bisection-part1.txt 파일을 엽니 다. fopen은 실패시 NULL을 반환합니다. NULL 파일 설명자를 사용하려고하기 때문에 프로그램이 세그먼트 화 오류로 종료됩니다. 당신은 또한 당신이 그들과 함께 완료 후 모든 파일을 닫습니다 fclose를 사용해야합니다

void attractor(FILE *bisection, double *a1, double *a2, double *epsilon) { ... } 

:

당신은 한 번 파일을 열고 attractor 기능의 파일 설명을 통과해야합니다.

열린 파일 수는 일반적으로 1024입니다. ulimit -n을 실행하여 인쇄 할 수 있습니다. 모든 fprintf 통화가 printf로 대체하는 경우


프로그램이 스택 공간이 부족하고이 때문에이 세그먼트 오류와 함께 종료됩니다. 함수의 재귀 수준이 attractor이므로 스택 공간이 부족합니다.

+0

어쨌든 fprintf (파일에 쓰는) 대신 printf (파일에 쓰지 않음)를 사용하려고하면 세그먼트 화 오류가 여전히 – user1286390

+0

으로 나타나 OK입니다. 나는 나의 대답을 업데이트했다. –

2

fprintf(bisection, "%.4f %.4f %.4f %.4f %.4f\n", a1, a2, fa1, fa2, epsilon); 

대신 예상 doubledouble* 매개 변수를 전달하고 있습니다.

fprintf(bisection, "%.4f %.4f %.4f %.4f %.4f\n", *a1, *a2, fa1, fa2, *epsilon); 

이어야합니다.

+0

죄송합니다, float 대신 double을 사용하려고 시도하면 "lf"를 변경하는 것을 잊었습니다. 어쨌든, double 또는 float을 사용하면 "Segmentation fault"라는 문제가 계속 나타납니다. – user1286390

+0

@ user1286390, 'lf'가 필요하지 않은 것처럼 추가 연구 후에 게시물을 업데이트했습니다. 'f'는 'double'을 나타냅니다. –

+0

죄송합니다. 문제는 여전히 발생합니다. – user1286390

관련 문제