2017-01-21 13 views
2

CFNumbers의 CFArray에 기본 숫자의 C 배열을 래핑하는 메서드를 구현하는 가장 좋은 방법은 무엇입니까?CFNumbers의 CFArray에서 C의 프리미티브 값을 줄입니다.

내가 같은 전화를 걸 :

double values[] = {1.2345, 678.9}; 
CFArrayRef arr = NumberWrappedValuesArray(&values, 2, kCFNumberDoubleType); 

을 그리고이 시도 : (반환 된 배열은 0 요소가)

CFArrayRef NumberWrappedValuesArray(void * valueArrayPtr, CFIndex count, CFNumberType numberType) { 
    CFMutableArrayRef array = CFArrayCreateMutable(NULL, count, &kCFTypeArrayCallBacks); 

    for (int i = 0; i < count; i++) { 
     CFNumberRef numberWrappedValue = CFNumberCreate(NULL, numberType, &valueArrayPtr[i]); 
     CFArrayAppendValue(array, numberWrappedValue); 
     CFRelease(numberWrappedValue); 
    } 

    CFRelease(array); 
    return array; 
} 
  1. 그것은 작동하지 않습니다, 왜, 어떻게 해결합니까 그것?
  2. 변경할 수있는 CFArray를 피할 수있는 좀 더 우아한 방법이 있습니까?

고마워요!

답변

2

CFArrayCreate을 사용할 수 있습니다.

예 : 명료성을 위해 생략

CFArrayRef NumberWrappedValuesArray(void *valueArrayPtr, size_t size, CFIndex count, CFNumberType numberType) { 
    size_t i, n; 
    CFArrayRef ret; 
    CFNumberRef *ref = malloc(sizeof(CFNumberRef) * count); 

    /* create array of boxed types. */ 
    for (i = 0, n = count; i < n; ++i) 
     ref[i] = CFNumberCreate(NULL, numberType, ((char *)valueArrayPtr) + (size * i)); 

    /* create CFArray. */ 
    ret = CFArrayCreate(NULL, (const void **)ref, count, &kCFTypeArrayCallBacks); 

    /* release boxed types and malloc'ed array. */ 
    for (i = 0; i < n; ++i) 
     CFRelease(ref[i]); 
    free(ref); 

    /* return CFArray, without releasing first! Has to be done by the caller. */ 
    return ret; 
} 

오류 처리.

+0

답변 해 주셔서 감사합니다. CFarrayCreate()에서 ref가 (const void **)가 아니라는 컴파일러 오류가 발생합니다. 내가 캐스팅 할 때 올바른 CFNumber가 valueArrayPtr의 첫 번째 기본 숫자로 생성되지만 이후의 모든 숫자는 의미가 없습니다 (예 : 2.0 대신 3.474077185876084e-310). 어떤 생각? – wolfrevo

+0

@wolfrevo 컴파일러 경고가 필요합니다. 나는 그 예에서 그것을 고쳤습니다. 나는 왜 값들이 왜 뒤죽박죽인지 알지 못한다. 기본값 대신에 할당 자로'NULL'을 사용해 볼 수있다. 위의 예를 편집했습니다. – Leandros

+1

Create Rule을 따르기 위해서이 함수의 첫 단어를'Create'로 지정하십시오. 'double * '이 아닌'void *'를 받아들이 기 때문에 뒤섞인 숫자가있을 가능성이 큽니다. 즉,'[i]'는 한 번에 두 배가 아닌 한 번에 한 바이트 씩 나아가므로 인접한 숫자의 일부를 읽는 것입니다. 이것을 일반화 할 수는 있지만'i'에'CFNumberType'의 크기를 곱해야합니다 (CFNumberTypeGetSize가 있다고 생각하지 않습니다). –