实际上,在写这个问题时,我想到了另一个更短的问题,所以我先问一下:
第一个问题(较短):
我有一个以这种方式定义的结构的标题:
typedef struct _CAMERA_LIST
{
....
}CAMERA_LIST, *PCAMERA_LIST;
这个语法的含义是什么?(注意结构名称和右大括号后名称的区别)
第二个问题(更长):
我有一个来自硬件制造商的代码示例,展示了如何正确初始化我使用的硬件。在代码中,制造商使用原始指针,而在我的应用程序中,我更喜欢使用 boost scoped_ptr 或 shared_ptr。问题是我要分配的内存块的大小与常规 new 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;
}