-3

我得到了U08* _buffer,我需要将此参数传递给获取的函数U16*

函数签名:FunctionA(U16 offset, U16 * pInbuff)

试图这样称呼它:FunctionA(0, (U16*)(m->GetBuffer));

得到

warning C4244: 'argument' : conversion from 'U32' to 'U16', possible loss of data
error C2220: warning treated as error- no 'object' file generated.

你知道如何使演员阵容正确吗?

4

3 回答 3

3

如果U08U16分别是 8 位和 16 位宽的无符号整数类型,则正确的转换方法取决于缓冲区中的确切数据格式。

首先,即使缓冲区中的数据布局完全正确,简单的强制转换也可能不是正确的解决方案。除非您的U08缓冲区最初是一个U16*缓冲区并且被强制转换到U08*沿线的某个位置,否则您可能会因不适当的强制转换而遇到对齐问题,要么崩溃,要么只是性能不佳。如果是这种情况,那么解决方案是首先摆脱该演员U08*阵容,而不是添加一个额外的演员回U16*.

如果缓冲区中的数据布局U08对于您想要的缓冲区是正确的,那么如果可能的话,您应该创建一个缓冲区来开始,U16而不是创建一个缓冲区。如果填充缓冲区的代码无法更改为使用缓冲区,那么这可能是可以接受强制转换的罕见情况之一;创建一个缓冲区,转换为填充它,然后您可以将缓冲区传递给您的函数而无需修改。U08U16U08U16U16U08*U16

如果您一开始不负责创建缓冲区,那么您可能需要创建自己的U16缓冲区,将数据从U08缓冲区复制到U16缓冲区(使用 std::memcpy 或类似方法),然后将该U16缓冲区与FunctionA.

其次,如果U08缓冲区中的数据布局与预期U16缓冲区中的数据布局不同,那么您必须创建自己的U16缓冲区并转换U08数据。


此外,您显示的错误并未描述实际问题;它只是说您已将编译器配置为将警告视为错误并且有一些警告。这是一件好事,但您需要查看警告以确定您需要修复什么以使警告消失。


警告 C4244:“参数”:从“U32”转换为“U16”,可能丢失数据

据我所知,此警告与您显示的代码无关。你很幸运,你得到了一个警告,阻止你显示的代码静默编译,即使它可能是错误的。这就是演员阵容是一个非常糟糕的主意的原因之一。他们可以消除严重错误并隐藏错误。除非您真的知道自己在做什么,否则您不应该使用强制转换,甚至可能很少使用。

上面的警告抱怨一些代码U32正在为一个U16对象分配一个值。例如:

U32 a = 1000000;
U16 b = a;

由于U32具有比 更多的有效值U16,因此并非所有这些U32值都可以转换为U16. U32无法表示的值的转换U16可能会产生意想不到的结果。因此,您要么需要避免转换,要么确保您已经考虑了那些意外发生的情况。

于 2013-07-02T12:27:14.013 回答
0
FunctionA(0, (U16*)(m->GetBuffer));

那几乎可以肯定是

FunctionA(0, (U16*)(m->GetBuffer()));

除非,当然,getBuffer是一个命名错误的指针,而不是一个函数。

于 2013-07-02T13:08:40.210 回答
0

如果您的类型是整数,其中 U08 是无符号字节,U16 是无符号 16 位字,那么您可以通过填充数据来解决问题。以下代码应填充数据并允许您将缓冲区作为无符号 16 位值数组传递。

int bufferSize;  // set this value with the actual buffer size
U16 wordBuffer= new U16[bufferSize];
U16 *wordBufferIndexer = wordBuffer;
U08 *byteBufferIndexer = byteBuffer;
for (int i = 0; i < bufferSize; ++i)
{
    wordBufferIndexer = *(byteBufferIndexer++);
}

FunctionA(0, wordBuffer);
于 2013-07-02T13:31:34.833 回答