2016-12-01 88 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中算法的一部分,它在for循環中。奇怪的部分是打印stepGrad數組的NSLog。取決於我是否對NSLog的調用發表評論 - 算法作爲一個整體給出了不同的結果。

如果有人提供了一些調試建議,那將會很棒。

謝謝!

更新1:

它具有相同的問題

簡單的例子,給更多的代碼來支持的問題。

更新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));

的代碼。這現在工作正常。謝謝你的幫助!