2017-02-16 5 views
2

私は値を持つuint32_tの配列を塗りつぶすブラックボックスフレームワーク(cdg)に対して取り組んでいます。 コールは、次のようになります。配列のrawポインタをunique_ptrにキャスト

std::size_t dataCount = 100; 
uint32_t* data = new uint32_t[dataCount]; 
cdg.generate(data); 

残念ながら、フレームワークは、テンプレートを使用していないので、私はuint32_t*に渡す必要があります。生のポインタを取り除くには、それをstd::unique_ptr<uint32_t>に "ラップ"したいと思います。したがって、それは私が std::unique_ptr<uint32_t[]>を使用しなければならないと思う配列です。 unique_ptrに生のポインタを変換する方法はありますか私はそのような何かを行う必要があります。

const std::size_t dataCount = 100; 
std::unique_ptr<uint32_t[]> data = std::make_unique<uint_32_t[]>(dataCount); 
cdg.generate(data.get()); 
+2

'std :: vector'と' std :: vector :: data() 'を使いますか? – BoBTFish

+1

なぜuint32_tのベクトルを使用しないのですか? – finlaybob

+3

'dataCount'が定数の場合は' std :: array'を使います – gurka

答えて

6

スマートポインタは素晴らしいとすべてですが、あなたはそれが配列であることに注意しているので、おそらく、std::vectorを使用することを検討してください。

data()のC配列(従来のインターフェイスの場合)のように、データへのポインタを取得できます。

std::vector<uint32_t> nums(100); // creates a vector of size 100 
uint32_t *ptr = nums.data(); 
cdg.generate(ptr);     // passes uint32_t* as needed 

あなたはユニークな所有権を確保する必要がある場合は、unique_ptrは正しい選択です。しかし、あなたの配列をきれいにする何かがほしいと思ったように聞こえましたが、Cのメソッドのための生のポインタを与えています。

+0

配列は、「ワーカー」の量で処理する必要があります。これを行うには、配列を「分割して」そのようなワーカーに渡したい: std :: size_t workerCount = 10; std :: size_t workCount = dataCount/workerCount; (std :: size_t i = 0; i Hymir

+0

はい、[data()](http://en.cppreference.com/w/cpp/container/vector/data)ドキュメントに記載されているように、 'data()+ offset'という式は有効です。オフセットは 'size()'より小さい –

+0

'std :: vector'のデータで並行作業に問題はありません。ただし、(re)移動や追加をしない限り問題はありません。 – Wolf

関連する問題