0

実際、この質問を書いているときに、別の短い質問が頭に浮かんだので、最初に質問します。

第 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;
}
4

1 に答える 1