无法从"转换参数1 unsigned int *"到"大小t *"

时间:2015-07-03 11:01:56

标签: c++

我正在开发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;
  ...

4 个答案:

答案 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_castsizeof (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

的addess
  

无法将参数1从“unsigned int *”转换为“size t *”

显然,在您的系统上,size_t typedefunsigned 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;