2015-02-05 4 views
1

나는 스위프트와 아이폰 OS 개발에 아주 새로운 해요 그러나 나는 다음과 같은 장치에서 실행되는 경우 충돌이 내 애플 리케이션을 일으키는 버그 건너했습니다아이폰 OS 스위프트 - 특정 장치에 EXC_BAD_INSTRUCTION

아이폰 4S 아이폰 5 시오 2 시오 망막 여기

닫 신고되는 코드이다

// bin2dec - converts binary string into decimal string 
func bin2dec(input: String) -> String { 
    var counter = countElements(input) 
    var digit: Character 
    var power = 1 
    var result = 0 

    while counter > 0 { 
     digit = input[advance(input.startIndex, counter-1)] 

     switch digit { 
     case "0": 
      result += 0 
     case "1": 
      result += 1 * power 
     default: 
      power = power/2 
      break 
     } 
     counter-- 
     power *= 2 
    } 
    return "\(result)" 
} 

및 오류 : 0

Thread 1: EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP,subcode=0x0) 

감사합니다. 감사합니다.

+0

어떤 입력이 그것을 죽이고 어떤 줄에 있습니까? – cjwirth

+0

아 물론 물론, "0"으로 줄에 스위치 안쪽 : 그리고 전체 32 비트 문자열을 받으면 예 : (11111111111111111111111111111111) – SimonTheEngineer

답변

7

iPhone 4S, iPhone 5, iPad 2, iPad Retina는 32 비트 장치이며, Int 은 32 비트 정수입니다. 따라서

var power = 1 

로 시작하고 오버 플로우 예외가 발생할

power *= 2 

32 회 호출.

  • 사용 Int64 : 신속한에서 정수 연산은 자동 (Objective-) C, 명시 적으로 "오버 플로우 사업자"&*, &+

    가능한 솔루션을 사용하지 않는 경우와 같이 "랩 어라운드"하지 않습니다 Int 대신.

  • power (결과는 이 필요하지 않음)의 최종 곱셈을 피하십시오. 숫자 이진 숫자의 문자열을 변환하는 간단한 방법이 있다는 것을

참고, 예를 How to convert a binary to decimal in Swift?를 참조하십시오.

+1

현재 64 비트 장치에서 문제가 여전히 발생하지만 문자열이 두 배 길다는 점에 유의할 가치가 있습니다. – cjwirth

+0

물론, 어리석은 나를. 그 점을 지적 해 주셔서 감사합니다! – SimonTheEngineer

관련 문제