我收到了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.
你知道如何使演员阵容正确吗?
答案 0 :(得分:3)
如果U08
和U16
分别是8和16位宽的无符号整数类型,那么正确的转换方法取决于缓冲区中的确切数据格式。
首先,即使缓冲区中的数据布局完全正确,简单的强制转换可能也不是正确的解决方案。除非你的U08
缓冲区最初是一个U16*
缓冲区,并且在该行的某个地方被强制转换为U08*
,否则你可能遇到对齐问题,无论是崩溃还是性能不佳,都会遇到不适当的强制转换。如果是这种情况,那么解决方案是首先摆脱对U08*
的投射,而不是将额外的投射添加回U16*
。
如果U08
缓冲区中的数据布局对于您想要的U16
缓冲区是正确的,那么您应该创建一个U08
缓冲区,而不是创建U16
缓冲区。 , 如果可能的话。如果填充U08
缓冲区的代码无法更改为使用U16
缓冲区,那么这可能是极少数情况下可以接受转换的情况之一;创建一个U16
缓冲区,强制转换为U08*
以填充它,然后您可以将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
值的转换可能会产生意外结果。所以你要么需要避免转换,要么确保你已经考虑了那些意外发生的事情。
答案 1 :(得分:0)
FunctionA(0, (U16*)(m->GetBuffer));
几乎可以肯定是
FunctionA(0, (U16*)(m->GetBuffer()));
当然,除非getBuffer
是一个命名错误的指针而不是函数。
答案 2 :(得分: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);