実際、この質問を書いているときに、別の短い質問が頭に浮かんだので、最初に質問します。
第 1 の質問 (短い):
この方法で定義された構造体を持つヘッダーがあります。
typedef struct _CAMERA_LIST
{
....
}CAMERA_LIST, *PCAMERA_LIST;
この構文の意味は何ですか? (構造体名と右中括弧の後の名前の違いに注意してください)
2 番目の質問 (長い):
私が使用しているハードウェアを適切に初期化する方法を示すハードウェア製造元からのコード例があります。コード メーカーは生のポインターを使用しており、私のアプリケーションでは、boost scoped_ptr または shared_ptr を使用したいと考えています。問題は、割り当てたいメモリ ブロックが通常の新しい ObjectType によって割り当てられるサイズと異なることです。
メーカーのサイトから入手したものの短いバージョンは次のとおりです。
int nNumCam = 3;
CAMERA_LIST* pucl;
pucl = (CAMERA_LIST*) new BYTE [sizeof (DWORD) + nNumCam * sizeof (CAMERA_INFO)];
pucl->dwCount = nNumCam;
printf("Camera %i Id: %d", iCamera, pucl->uci[1].dwCameraID);
そして、ここに私が取得したいものがあります:
int nNumCam = 3;
scoped_ptr<CAMERA_LIST> pucl;
pucl.reset( (CAMERA_LIST*) new BYTE [sizeof (DWORD) + nNumCam * sizeof (CAMERA_INFO)] );
pucl->dwCount = nNumCam;
printf("Camera %i Id: %d", iCamera, pucl->uci[1].dwCameraID);
構造体が正確にどのように見えるかを次に示します。
typedef struct _CAMERA_LIST
{
DWORD dwCount;
CAMERA_INFO uci[1];
}CAMERA_LIST, *PCAMERA_LIST;
問題は、この機能を scoped_ptr/shared_ptr で動作させるにはどうすればよいかということです。また、コード スニペットでは、メモリ ブロックの削除が delete[] ではなく delete によって行われていることに注意してください。scoped_array を使用する必要がありますか? もしそうなら、どのように構造体フィールドにアクセスしますか?
誰かが役に立つと思う場合に備えて、メーカーのサイトからの完全な例があります。
INT nNumCam;
if( is_GetNumberOfCameras( &nNumCam ) == IS_SUCCESS) {
if( nNumCam >= 1 ) {
// Create new list with suitable size
CAMERA_LIST* pucl;
pucl = (CAMERA_LIST*) new BYTE [sizeof (DWORD) + nNumCam * sizeof (CAMERA_INFO)];
pucl->dwCount = nNumCam;
//Retrieve camera info
if (is_GetCameraList(pucl) == IS_SUCCESS) {
int iCamera;
for (iCamera = 0; iCamera < (int)pucl->dwCount; iCamera++) {
//Test output of camera info on the screen
printf("Camera %i Id: %d", iCamera,
pucl->uci[iCamera].dwCameraID);
}
}
}
delete [] pucl;
}