-1

私のプログラムには、正割法を使用して関数の根を見つける非常に単純な関数があります。以下に示す printf() で正常に動作します。しかし、コメントアウトすると、ループが際限なく繰り返されます。理由がわかりません...

変数を変更するprintfについて読んだことがありますが、変数のストレージを変更するものは何もありません。何か不足していますか?繰り返しは重要ではなく、関数は何百万回も呼び出されるため、印刷するのは優れたソリューションではありません。

double guess1=500.;
double y1=estimater(r,volume,guess1,adm,tm,rr[r]);
double guess2=adm/30.;
double y2=estimater(r,volume,guess2,adm,tm,rr[r]);
int i;
double guess3=0.;
double y3;
double tol =heightTOL;
int secmax=SECANTMAX;
for(i=1;i<=secmax;i++){
    guess3=guess2-y2*(guess2-guess1)/(y2-y1);
    if(guess3>adm/2.){
        guess3=adm/2.;
    }
    if(guess3<=0.){
        guess3=0.;
    }
    y3=estimater(r,volume,guess3,adm,tm,rr[r]);
    y1=y2;
    y2=y3;
    guess1=guess2;
    guess2=guess3;
    if(fabs(guess2-guess1)<tol){
        break;
    }
    if(i==secmax){
        printf("\nRan out of iterations in height finder\n");
    }
    printf("%d     %f",i,guess3); //THIS ONE HERE!!!!!!!!
}
return guess3;
4

1 に答える 1

1

printfデータをまったく変更していません。printf関数のファミリがデータに影響を与える唯一の方法は、%nフォーマット指定子 (渡されたアドレスの変数に書き込む) を使用する場合、または間違ったフォーマット引数を渡すなど、未定義の動作を呼び出す何かを行っている場合です。 . ここではこれらのいずれも行っていないため (フォーマット文字列は正しい)、バグは別の場所にあります。

すべての配列アクセスが境界内にあることを確認してください。コードを Valgrind または他のバリデーターで実行して、メモリ エラーを見つけてみてください。

于 2012-07-09T19:45:23.357 に答える