我正在开发Student Project并从Visual Studio获取站点和构建库的SDK。一旦我在VS中使用cmake打开的解决方案构建库并在VS中构建就会给出上述错误。不知道如何解决它。
这是我得到错误的过程。
pmdDllExport int pmdpGetSourceDataDescription (unsigned hnd, PMDDataDescription *result)
{
if (!idOk (hnd))
{
globalErrorMessage = "unknown handle";
return PMD_UNKNOWN_HANDLE;
}
SrcPluginData *dat = g_data[hnd];
int c_channels = 1;
//
dat->currentDD.type = PMD_USER_DEFINED_0; /* USER DEFINE TYPE DATA for O3D3xx data*/
dat->currentDD.subHeaderType = PMD_IMAGE_DATA;
dat->currentDD.img.numSubImages = 6;/* Mentions number of images in image data
buffer. We have six images*/
...
/* Get Size of image data buffer */
**dat->o3d3xxCamera->getFrameDataSize (& (dat->currentDD.size));**
dat->currentDD.PID = hnd;
dat->currentDD.DID = g_did;
/*Output this descriptor to calling function */
memcpy (result , &dat->currentDD, sizeof (PMDDataDescription));
return PMD_OK;
}
当我检查o3d3xxCamera->getFrameDataSize
定义的内容时,定义为
int32_t getFrameDataSize (size_t *dataSize);
我查看了很多查询,他们说更好地将变量传递给类型size_t
当我检查它的结构是什么dat->currentdd
时。所以我不确定如何将此类型更改为size_t
。
/**<local datadescriptor of the current data */
PMDDataDescription currentDD;
struct PMDDataDescription
{
unsigned PID;
unsigned DID;
unsigned type;
unsigned size;
unsigned subHeaderType;
...
答案 0 :(得分:2)
不要只想reintepret_cast
指针!这不符合您的要求,除非size_t
恰好与unsigned int
相同,后者因平台而异。
相反,您将要使用临时文件,并在完成后复制:
size_t size = dat->currentDD.size; // this will promote as necessary
dat->o3d3xxCamera->getFrameDataSize(&size);
dat->currentDD.size = size; // write it back
如果static_cast
与sizeof (size_t)
不同,则其中一项或其他任务可能需要sizeof (unsigned int)
。这很好,因为它将保留值(假设该值在两种类型中均可表示)。
答案 1 :(得分:1)
如果类型有不同的尺寸,则无法可靠地施放!
接收器会将指针视为指向变量的指针,该变量的大小与实际大小不同,并且会出现断裂(未定义的行为)。
只需将结构更改为
即可size_t size;
如果你不能改变结构,那么你当然可以使用临时函数进行调用,然后将该值转换为结构。假设你从来没有需要<{1}}的更高精度,那就行了。
答案 2 :(得分:0)
dat->o3d3xxCamera->getFrameDataSize (& (dat->currentDD.size));
这会将dat->currentDD.size
的地址作为参数传递给getFrameDataSize()
函数。
PMDDataDescription currentDD;
struct PMDDataDescription
{
unsigned PID;
unsigned DID;
unsigned type;
unsigned size;
currentDD.size
的类型为unsigned
。
int32_t getFrameDataSize (size_t *dataSize);
该函数需要size_t
。
无法将参数1从“unsigned int *”转换为“size t *”
显然,在您的系统上,size_t
typedef
与unsigned int
不同,使得两个指针不兼容。这可能发生在64位系统上,其中int
为32位,但size_t
为64位。
简单修复只是简单地转换类型(1):
dat->o3d3xxCamera->getFrameDataSize(& ( static_cast< size_t >(dat->currentDD.size) ) );
正确的事情(tm)可能会(2)重构PMDDataDescription
以使用size_t
成为其size
成员。
(1):我说这很容易,不是说它是正确的。我不知道PMDDataDescription
是什么,它可能来自哪个库,或者它用于什么。我不知道getFrameDataSize()
使用其参数做了什么。如果它上面有指针算术,那么转换就会破坏你的应用程序,而你几乎无能为力,因为这两个API显然不同意数据类型。我们在这里看到一个非常脆弱的设置。
(2):您可能无法控制其来源。您可能正在查看属于指定的 API的内容,即由于实际原因无法更改。我只是说'正确构建的软件不应该首先遇到这个问题。
答案 3 :(得分:0)
你不能投射指针。你应该尝试只投出&#39; unsigned char&#39;进入&#39; size_t&#39;,而不是&#39; unsigned char *&#39;和&#39; size_t *&#39;