2016-12-01 1 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

그래서 나는 내 자신의 질문에 답할 것입니다.

@Klas Lindbäck의 의견 덕분에 for 루프에서 C 정적 배열을 초기화하지 않는 것과 관련된 문제가 수정되었습니다. 그래서 나는이 문제를 가지고 각 배열의 선언 후

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

을했던 코드 전후 모든 배열을 갔다. 이제는 잘 작동합니다. 모든 도움에 감사드립니다!

관련 문제