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;
}
- 그것은 작동하지 않습니다, 왜, 어떻게 해결합니까 그것?
- 변경할 수있는 CFArray를 피할 수있는 좀 더 우아한 방법이 있습니까?
고마워요!
답변 해 주셔서 감사합니다. CFarrayCreate()에서 ref가 (const void **)가 아니라는 컴파일러 오류가 발생합니다. 내가 캐스팅 할 때 올바른 CFNumber가 valueArrayPtr의 첫 번째 기본 숫자로 생성되지만 이후의 모든 숫자는 의미가 없습니다 (예 : 2.0 대신 3.474077185876084e-310). 어떤 생각? – wolfrevo
@wolfrevo 컴파일러 경고가 필요합니다. 나는 그 예에서 그것을 고쳤습니다. 나는 왜 값들이 왜 뒤죽박죽인지 알지 못한다. 기본값 대신에 할당 자로'NULL'을 사용해 볼 수있다. 위의 예를 편집했습니다. – Leandros
Create Rule을 따르기 위해서이 함수의 첫 단어를'Create'로 지정하십시오. 'double * '이 아닌'void *'를 받아들이 기 때문에 뒤섞인 숫자가있을 가능성이 큽니다. 즉,'[i]'는 한 번에 두 배가 아닌 한 번에 한 바이트 씩 나아가므로 인접한 숫자의 일부를 읽는 것입니다. 이것을 일반화 할 수는 있지만'i'에'CFNumberType'의 크기를 곱해야합니다 (CFNumberTypeGetSize가 있다고 생각하지 않습니다). –