2012-03-09 4 views
1

다음 코드가 왜 아래 숫자에 해당하는지 이해하는 데 어려움이 있습니다. 누구든지 float에서 int 로의 변환을 설명 할 수 있습니까? 코드를 가정하면, 그렇지 않으면 올바른float에서 int 로의 변환이 이상하게 보입니다.

counter = 0; 
pathCells[counter][0].x = pCLocation.x; 
pathCells[counter][0].y = pCLocation.y; 
cellCount[counter]++;  
NSLog(@"%@",[NSString stringWithFormat:@"pCLocation at: 
%f,%f",pCLocation.x,pCLocation.y]); 
NSLog(@"%@",[NSString stringWithFormat:@"path cell 0: %i,%i", 
pathCells[counter][cellCount[counter-1]].x,pathCells[counter][cellCount[counter]].y]); 
2012-03-09 01:17:37.165 50LevelsBeta1[1704:207] pCLocation at: 47.000000,16.000000 
2012-03-09 01:17:37.172 50LevelsBeta1[1704:207] path cell 0: 0,1078427648 
+1

'pathCells'의 유형은 무엇입니까? –

+0

시도해 보셨습니까? NSLog (@ "% @", [NSString stringWithFormat : @ "경로 셀 0 : % i, % i", pathCells [counter] [0] .x, pathCells [counter] [0]. 와이]); 무엇이 인쇄됩니까? – Mrunal

+0

어디서든 NSLog (@ "% @", [NSString stringWithFormat : XXX, a, b, c]);를 쓸 수 있으며, NSLog (XXX, a, b, c)로 대체 할 수 있습니다. '. – benzado

답변

3

(pCLocation는 CGPoint입니다) :

나는 당신이 NSLog 및 기타의 printf 스타일의 기능이 어떻게 작동하는지 이해하는 데 도움이 될 것 같아요. NSLog(@"%c %f", a_char, a_float)을 호출하면 코드가 형식 문자열과 값을 스택에 푸시 한 다음 해당 함수 코드의 시작 부분으로 이동합니다. NSLog는 다양한 수의 인수를 허용하기 때문에 아직 스택에서 얼마나 많이 팝 아웃해야하는지 알지 못합니다. 적어도 형식 문자열이 있으므로이를 꺼내 스캔을 시작합니다. 형식 지정자 %c을 발견하면 스택에서 1 바이트를 팝하여 해당 값을 인쇄합니다. 그런 다음 %f을 찾았으므로 이제는 다른 32 비트를 가져 와서 부동 소수점 값으로 인쇄합니다. 그런 다음 형식 문자열의 끝에 도달하므로 완료됩니다.

이제는 키커가 있습니다. NSLog에 거짓말을하고 int를 제공하지만 실제로 float을 제공한다고 말하면 거짓말인지 알 수있는 방법이 없습니다. 단순히 진실을 말하는 것으로 가정하고 메모리에있는 비트를 인쇄하지만 인쇄하도록 요청했습니다.

그래서 이상한 값을보고있는 것입니다. 부동 소수점 값을 int 인 것처럼 인쇄하고 있습니다. 당신이 정말로 int 값을 원하는 경우에, 당신도해야 : NSLog(@"cell.x: %i", (int)cell.x);

  • 이 그것을 float를 남겨 그러나 소수 숨길 형식 문자열을 사용하십시오 : NSLog(@"cell.x: %.0f", cell.x);

    1. 이 캐스트를 적용 (대체 이론이지만 여전히 유용 할 수 있습니다.)

      초기화되지 않은 메모리의 내용을 인쇄하고있을 수 있습니다.

      제공된 코드에서 counter = 0은 변경되지 않습니다.

      pathCells[0][0].x = pCLocation.x; 
      pathCells[0][0].y = pCLocation.y; 
      cellCount[0]++; 
      

      그런 다음 인쇄 :

      pathCells[0][cellCount[-1]].x 
      pathCells[0][cellCount[0]].y 
      

      내가 당신이 원하는 cellCount[-1]이 아니라고 확신 그래서 당신은에 값을 할당합니다. C는 특정 크기의 배열로 작업한다고 생각하더라도 실제로 foo 오프셋에 bar 오프셋을 더하는 것을 의미하므로 foo[bar]을 허용합니다. -1의 지수는 한 걸음 뒤로 물러나는 것을 의미합니다. 그래서 경고 또는 오류가 발생하지 않으며 단지 데이터 만 남습니다.

      pathCells, cellCountcounter이 무엇인지, 그리고 어떻게 서로 관련되어 있는지 명확히해야합니다. 나는 당신이 이런 것들을 결합하는 방법에 버그가 있다고 생각합니다.

    +0

    : pathCells : CGPoint pathCells [50] [50]; cellCounter 및 counter는 모두 int 유형입니다. 그 -1 오류를 수정하고 시도해보십시오 : % i % i 대신 % f % f 올바른 값을 얻었지만 % i % i 또는 % d % d를 사용하면 위의 값을 얻을 수 있습니다. –

    +0

    업데이트 : 내 데이터 포인트를 내 포인트 구조로 변경했습니다. MyPoint는 int 대신 float 대신 x 및 y를 사용하며 이제는 nslog에서 올바른 결과를 얻습니다. 그러나 내 원래의 질문은 아직 명확하게 답변되지 않았습니다. –

    관련 문제