2

コードはwhileループをスキップしているようです:

int i,j;
i= floor((Lx-23.61)/0.1);
j=0; 
while(Nh - modSED[i][j] > 0.0){
    j++;
}
if(j>0 && modSED[i][j]-Nh > Nh-modSED[i][j-1]){
    fileNH=modSED[i][j-1];
}else{
    fileNH=modSED[i][j];
}

これは、多かれ少なかれ、doubleの配列を介した大まかな線形検索です(i-indexは、コードの別の部分によって事前設定されているため、問題にはなりません)。GDBを見ると、コードが誤動作しているようです。

Breakpoint 1, mag (filter=4, Lx=23.930108812418158, z=0.57071772467724535, Nh=0.011911981460606383) at infopt.c:45
45      while(Nh-modSED[i][j]>0.0){
(gdb) print Nh-modSED[i][j]
$1 = 0.001911981460606383
(gdb) n
48      if(j>0 && modSED[i][j]-Nh > Nh-modSED[i][j-1]){
(gdb) 

また、whileループがtrueと評価されたとしても、j++セグメントをスキップしただけです。

ありがとう、ジョシュ

4

2 に答える 2

1

浮動小数点の比較が原因でエラーが発生しているようです。浮動小数点の比較はあまり安全ではないことはよく知られています。詳細については、以下を参照してください。

2番目のリンクには、浮動小数点演算に関する非常に詳細な説明があります

于 2012-07-24T04:55:10.793 に答える
1

外部2D配列modSEDが間違った次元で宣言されたため(初期化されたcファイルとは異なります)、プログラム、gdb、またはその両方が混乱していました。宣言の次元を修正すると、問題が修正されました。(ここでの問題は、modSEDから正しい値が返されないという大きな問題を指します。)ただし、GDBが間違った出力を提供しているように見えたため、コードの間違った部分でハングアップしていました。

おそらくこれにより、GDBはロジックに逆らい、whileループをスキップしているように見えますか?(今プログラムを実行すると、GDBはjをインクリメントし、それが実行されたことを示すのに問題はありません。)

于 2012-07-24T16:33:33.187 に答える