2012-03-22 114 views
2

我正在嘗試在C語言中使用二分法來查找某個方程的根,但是當我嘗試在文件中編寫此過程的每一步時,出現問題「分段故障」。這可能是我做過的一個白癡錯誤,但是我一直試圖解決這個問題很長一段時間。不管怎樣,對不起試圖在文件中寫入時的文件分割

#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; 

} 

感謝,如果這個問題不適合:我用gcc編譯,這是該代碼。

+0

爲什麼不將它打印到控制檯而不是隔離問題? – 2012-03-22 16:23:39

+0

您的文件名不完整 - 您只能提供葉名。嘗試提供一個完全合格的名稱並檢查您的fopen是否成功。顯然fopen失敗了,因爲當你嘗試訪問文件指針時你會遇到段錯誤。 – BitBank 2012-03-22 16:27:39

+0

即使將它打印到控制檯,問題仍然存在。 – user1286390 2012-03-22 16:37:32

回答

1

打開的文件過多。您正在遞歸調用attractor,並且每次調用將打開文件bisection-part1.txtfopen失敗時返回NULL。程序因分段錯誤而終止,因爲您正嘗試使用NULL文件描述符。

您需要打開文件一次,並通過其文件描述符到attractor功能:

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

您還應該使用fclose關閉所有文件(S),你與他們做了。

打開文件數限制通常爲1024.可以通過執行ulimit -n打印。


如果所有fprintf電話與printf取代,程序運行的堆棧空間,因爲這一點,段故障而終止。由於功能attractor的遞歸級別太高,程序將用盡堆棧空間。

+0

無論如何,如果我嘗試使用printf(不寫入文件中)而不是fprintf(寫入文件),分段錯誤仍然出現 – user1286390 2012-03-22 17:10:49

+0

OK。我更新了我的答案。 – 2012-03-22 17:31:52

2

這裏

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

你逝去的double*參數,而不是預期double。應該是

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

改爲。

+0

對不起,我忘了更改「lf」,當試圖使用double而不是float時。無論如何,使用double或float,問題「分段錯誤」仍然出現。 – user1286390 2012-03-22 16:32:19

+0

@ user1286390,我在進一步研究後更新了我的帖子,因爲它看起來不需要'lf' - 'f'代表'double'。 – 2012-03-22 16:38:42

+0

對不起,但問題仍在發生。 – user1286390 2012-03-22 16:41:56