2016-12-01 7 views
1

私はXCodeでアプリケーションを開発しており、アルゴリズムのためにCビットを書く必要があります。ここにCコードの一部があります:かなりシンプルなCコードで問題が発生しました

 double dataTag[M][N]; 

     // dataTag initialized to values..... 

     double w[N]; // This is outside for loop at the top level of the method 
     for (int i = 0; i < N; i++) { 
      w[i] = pow(10.0, dataTag[2][i]/10.0/b); 
     } 

     //This is inside for loop..... 

     double disErr[N]; 

     // disErr set and values confirmed with printArray... 

     double transedEstSetDrv[N][M]; 

     // transedEstSetDrv set and values confirmed with printArray... 

     double stepGrad[M] = {0, 0, 0}; 
     for (int j = 0; j < M; j++) { 

      double dotProductResult[M]; 
      dotProductOfArrays(w, disErr, dotProductResult, N); 

      stepGrad[j] = sumOfArrayMultiplication(transedEstSetDrv[j], dotProductResult, M); 
     } 

     // Print array to console to confirm values 
     NSLog(@"%f %f %f", stepGrad[0], stepGrad[1], stepGrad[2]); <-- if this is present algorithm gives different results. 

     //Continue calculations...... 

これはループ内のCのアルゴリズムの一部です。変わった部分は、stepGrad配列を出力するNSLogです。 NSLogへの呼び出しにコメントするかどうかによって、アルゴリズム全体が異なる結果になります。

誰かがデバッグの提案をしてくれれば幸いです。

ありがとうございます!

UPDATE 1:同じ問題があり、問題をサポートするために多くのコードを与え

簡略化した例。

UPDATE 2:

はlength_of_array機能を削除し、簡単のために知られている番号に置き換え。

+2

メモリエラーです。おそらくバッファオーバーフロー。バグを確実に診断するのに十分なコードは含まれていませんが、 'w'がパラメータとして渡され、' LENGTH_OF_ARRAY(w) 'が期待どおりに動作しないと思います。この回答を見るhttp://stackoverflow.com/a/10349610/646887 –

+0

printArrayの有無にかかわらず出力の例を教えてください。 – vitormm

+0

こんにちは、素敵なコメントありがとうございました。私は自分の答えを更新したように見ていきます。 出力値とMatlabオリジナル実装の出力とその緯度と経度を比較します。私はドットの後に少なくとも6小数点以下の精度が必要です。それは私には5を与えます。もしNSLogラインを持っていれば、それが合っているならば7が得られます。 –

答えて

1

私は自分の質問に答えます。

@KlasLindbäckのコメントのおかげで、forループでC静的配列を初期化しないことに関連する問題が修正されました。だから私はこの問題を持っていたし、各配列の宣言の後

memset(a_c_array, 0, sizeof(a_c_array));

をしたコードの前と後のすべてのアレイを渡りました。それは現在正常に動作しています。すべてのあなたの助けをありがとう!

関連する問題