2017-01-04 1 views
3

아래 코드는 사용자가 '예'를 선택했는지 여부에 따라 휠을 10 번 또는 1 번 회전합니다.for 루프에서 int 값을 무작위로 생성합니다. 7 번 반복 한 후에는 매우 큰 음수를 반환합니다. 왜 이런거야?

회전 방법은 0-100 사이의 숫자를 취하고 해당 숫자를 기준으로 필터를 회전합니다. 기계를 테스트하기 위해 0-99 사이의 난수를 생성하려고합니다. 나는이 방법이 그렇게 할 수 있어야한다고 생각한다. 그러나 7 번이 끝나면 생성 된 난수는 실행이 끝날 때까지 -2.147483465E + 09가됩니다. 출력은 다음과 같습니다.

89 
20 
1 
58 
78 
39 
90 
-2.147483465E+09 
-2.147483465E+09 
-2.147483465E+09 

가비지 수집과 관련된 것이 있습니까? 'sUVFilter'는 메서드에 의해 0으로 변경되지 않습니다.이 값은 rand.Next()로 설정했을 때의 값입니다.

도움이나 정보를 제공해 주시면 감사하겠습니다. 고마워. 여기에 문제의 코드가 있습니다. 코멘트에서

private void RotateFilterWheel() 
    { 
     List<float> filterValuesList = new List<float>(); 
     int timesToRotate = 1; 
     int success = 0; 
     Random rand = new Random(); 

     MessageBoxResult result = MessageBox.Show("Rotate filter 10 times?", "Rotate Filter", MessageBoxButton.YesNo); 
     if (result == MessageBoxResult.Yes) 
     { 
      timesToRotate = 10; 
     } 

     for (int x = 0; x < timesToRotate; x++) 
     { 

      int sUVFilter = rand.Next(99); 
      _instDrvr.SetSpectroAutoUVFilterPosition(sUVFilter, ref success); 
      filterValuesList.Add(sUVFilter); 
      Thread.Sleep(5000); 
     } 
     listBox.ItemsSource = filterValuesList; 
    } 

:

프로그램의 진짜 문제 메이커입니다

screenshot

+2

최소한의 완전하고 검증 가능한 예를 게시하십시오. –

+1

@HenkHolterman 이해합니다. 사과드립니다. 나는 왜 내가 매번 50 초 동안 멈추고 있는지 묻고있는 줄 알았다. rand.Next (99) 라인에 의해 설정되고 _instDrvr이 그것을 만진 직후에 sUVFilter에서 감시로 발생하는이 스크린 샷이 있습니다. http://imgur.com/YFNYpfH 목록 상자가 아닙니다. 값은 sUVFilter가 설정되면 발생합니다. –

+0

@RobAdams,'_instDrvr'은 무엇입니까? – Bigeyes

답변

2
_instDrvr.SetSpectroAutoUVFilterPosition(sUVFilter, ref success); 

. 우리는 모터를 작동시키는 것 이외에는 그것에 대해 충분히 알지 못합니다. 그래서 당신은 아마도 이것을하기 위해 어떤 회사의 라이브러리를 사용하고있을 것입니다. 그런 코드는 종종 관리되지 않습니다. COM 구성 요소 일 수 있으며 pinvoke를 사용할 수 있습니다.

진단 도구를 사용하면 메서드 스택이 손상 될 수 있습니다. 이것을 할 수있는 방법은 여러 가지가 있습니다. 하나의 쉬운 방법은 64 비트 코드의 RSP 레지스터 인 32 비트 코드의 EBP 프로세서 레지스터 값을 손상시키는 것입니다. 확인하기 쉽도록 디버그> Windows> 레지스터를 사용하고 호출 전후에 레지스터가 정확히 동일한 값을 가지고 있는지 다시 확인하십시오.

그리고 스택 프레임을 쉽게 손상시킬 수 있습니다. 특히 ref success 인수 덕분입니다. 스택 프레임에 저장된 성공 변수에 대한 포인터를 전달합니다. 4 바이트 이상을 쉽게 쓸 수있는 방법을 제공합니다. 이렇게하면 메서드의 다른 로컬 변수가 무작위로 값을 변경하게됩니다. 이러한 메모리 손상은 디버거에서 다시 볼 수있는 이상한 값을 제외하고는 진단하기가 훨씬 더 어렵습니다.

그게 전부에요.이 문제를 해결하려면 모터 컨트롤러 제조업체 나 소프트웨어 공급 업체의 도움이 필요합니다.

관련 문제