2017-01-21 6 views
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; 
} 
  1. double values[] = {1.2345, 678.9}; 
    CFArrayRef arr = NumberWrappedValuesArray(&values, 2, kCFNumberDoubleType); 
    

    をそして、これを試してみましたそれ?

  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 **)ではないというコンパイラエラーを私に与えます。私がキャストすると、valueArrayPtrの最初のプリミティブ番号に対して正しいCFNumberが作成されますが、それに続く数字はすべて意味をなさない(例:2.0ではなく3.474077185876084e-310)。何か案が? – wolfrevo

+0

@wolfrevoコンパイラの警告が必要です。私はこの例でそれを修正しました。なぜ値がスクランブルされているのか分かりません。デフォルトの代わりにアロケータとして 'NULL'を使ってみることもできます。私は上記の例を編集しました。 – Leandros

+1

Create Ruleに従うように、最初の単語に 'Create'を付けてこの関数に名前をつけてください。スクランブルされた数値は、これが 'double * 'ではなく' void *'を受け入れるため可能性があります。つまり、 '[i]'は一度に2倍ではなく1バイトずつ進んでいるので、隣の数字の部分を読み込んでいます。これを一般化することはできますが、 'i'に' CFNumberType'のサイズを掛けなければなりません(CFNumberTypeGetSizeがあるとは思いません)。 –

関連する問題