2
CFNumbersのCFArrayにプリミティブ番号のC配列をラップする方法を実装する最良の方法は何ですか?CFNumberのCFArrayでのCプリミティブ値のラップ
私のようなもの呼び出したい:なぜ、どのように私は修正しない、(返された配列が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;
}
- :
double values[] = {1.2345, 678.9}; CFArrayRef arr = NumberWrappedValuesArray(&values, 2, kCFNumberDoubleType);
をそして、これを試してみましたそれ?
- 変更可能なCFArrayを回避する、より洗練された方法がありますか?
ありがとう!
あなたの答えをありがとう!これはCFArrayCreate()でrefが(const void **)ではないというコンパイラエラーを私に与えます。私がキャストすると、valueArrayPtrの最初のプリミティブ番号に対して正しいCFNumberが作成されますが、それに続く数字はすべて意味をなさない(例:2.0ではなく3.474077185876084e-310)。何か案が? – wolfrevo
@wolfrevoコンパイラの警告が必要です。私はこの例でそれを修正しました。なぜ値がスクランブルされているのか分かりません。デフォルトの代わりにアロケータとして 'NULL'を使ってみることもできます。私は上記の例を編集しました。 – Leandros
Create Ruleに従うように、最初の単語に 'Create'を付けてこの関数に名前をつけてください。スクランブルされた数値は、これが 'double * 'ではなく' void *'を受け入れるため可能性があります。つまり、 '[i]'は一度に2倍ではなく1バイトずつ進んでいるので、隣の数字の部分を読み込んでいます。これを一般化することはできますが、 'i'に' CFNumberType'のサイズを掛けなければなりません(CFNumberTypeGetSizeがあるとは思いません)。 –