2010-03-15 4 views
3

int를 바이트 배열로 변환하는 Objective-C 메서드를 만들어야합니다. 이 경우 NSArray를 반환 유형으로 사용할 수 없으며 UInt8 배열이어야합니다. 이 작업을 수행하는 간단한 방법을 작성했지만 컴파일 중 오류가 발생하여 호환되지 않는 반환 유형이 있음을 알려줍니다. 다음은 코드 스 니펫입니다. 어떤 아이디어?Objective-C : int에서 UInt8 배열을 반환하는 메서드를 만드는 방법

- (UInt8[])ConvertToBytes:(int) i 
{ 

    UInt8 *retVal[4]; 

    retVal[0] = i >> 24; 
    retVal[1] = i >> 16; 
    retVal[2] = i >> 8; 
    retVal[3] = i >> 0; 

    return retVal; 
} 
+2

이 질문에 대한 답변이 아니라 뭔가에 대해 단지 의견은 꽤 바로 여기 아니다'UINT8 * RETVAL [4]'UINT8 값에 사 * 포인터 *의 배열을 지정하면서 'UInt8 []'은 크기가 컴파일 타임에 결정될 UInt8 값의 배열을 지정합니다. 포인터와 그들이 가리키는 것들은 완전히 다른 것들이며, 당신이 그들을 섞지 않도록 매우 조심하고 싶습니다. – Chuck

답변

5

로컬 C 배열을 반환 할 수 없습니다. 당신은 malloc(sizeof(UInt8) * 4)을 필요로하고, 그것을 채우고, 포인터를 돌려 주며, 끝나면 그것을 자유롭게 해주는 것을 잊지 마십시오. 여기가 작성되고 사용되는 방법의 예입니다

(당신이 할당 메모리를 해제의 중요성을 강조하기 위해) :

+ (UInt8 *)convertToBytes:(int)i { 
    UInt8 *retVal = malloc(sizeof(UInt8) * 4); 
    retVal[0] = i >> 24; 
    retVal[1] = i >> 16; 
    retVal[2] = i >> 8; 
    retVal[3] = i >> 0; 
    return retVal; 
} 

- (void)someMethodUsingTheOtherOne { 
    int something = 900; 
    UInt8 *bytesOfInt = [[self class] convertToBytes:something]; 
    someFunctionUsingTheBytes(bytesOFInt); 
    free(bytesOfInt); 
} 

(당신은 내가도를 수를 변경할 것을 알 아마도 것 class 메소드. 인스턴스의 속성에 의존하지 않기 때문에, 클래스 메소드 또는 함수 일 수도 있지만, 배열과 포인터의 작동 방식과는 아무런 관련이 없습니다. 예제에서 좋은 코딩 스타일을 사용하는 것과 같습니다.)

+0

나는 묻기를 바보 같지만 전체 솔루션을 게시 할 수 있습니까? 저는 Objective-C에 익숙하지 않고 Java 배경에서 왔으며 아직 방법의 구조 등을 배우고 있습니다. – Adam

+0

@Adam : 예제로 업데이트했습니다. 그건 그렇고,'UInt8'과 C 배열과 그 모든 것들은 Objective-C에만 국한되는 것이 아니라 C에서옵니다. – Chuck

+0

이 작품! 도와 줘서 고마워. 이제 당신이 묘사 한 것을 봅니다. 말된다. – Adam

10

struct의 값을 반환하십시오. C 스타일 배열을 C 함수에서 반환 할 수 없으며, 이는 Objective-C 메소드에서도 반환 할 수 없음을 의미합니다. 당신은 수 있습니다 구조체를 반환하고 구조체는 구성원으로 허용 배열입니다.


// in a header 
typedef struct 
{ 
    UInt8 val[4]; 
} FourBytes; 


// in source 
- (FourBytes) convertToBytes:(int) i 
{ 
    FourBytes result = { i >> 24, i >> 16, i >> 8, i }; 
    return result; 
} 



- (void) someMethod 
{ 
    FourBytes test = [someObject convertToBytes:0x12345678]; 
    NSLog ("%d, %d, %d, %d", test.val[0], test.val[1], test.val[2], test.val[3]); 
} 

+4

가능하다면이 방법이 더 좋습니다. Structs는 문명화 된 데이터 구조입니다. C 배열은 당신을 박살낼 수 있습니다. – Chuck

+0

두 가지가 동일하지 않다고 지적하는 것이 중요하다고 생각합니다. 구조체는 배열과 동일한 레이아웃을 가질 수 있습니다. 따라서 UInt8 배열을 필요로하는 함수가 있다면 UInt8 멤버가 4 개인 구조체에 대한 포인터를 전달하면 정의되지 않은 동작 인 AFAIK가 발생합니다. – Chuck

+0

'& test.val [0]'을 통과해도 여전히 동작해야합니까? 안됩니다. – dreamlax

관련 문제