我正在尝试以这种方式使用 memset() 填充矩阵中的零区域:
unsigned short *ptr;
for(int i=0; i < nRows; ++i)
{
ptr = DepthMat.ptr<unsigned short>(i); /* OCV matrix of uint16 values */
for(int j=0; j<nCols; ++j)
{
uint n=0;
if(ptr[j] == 0) /* zero region found */
{
d_val = ptr[j-1]; /* saves last non-zero value */
while(ptr[j+n] == 0)
{ /* looks for non zero */
++n;
}
d_val = (d_val < ptr[j+n] ? d_val : ptr[j+n]);
memset( ptr+j, d_val, n*sizeof( ptr[0]) );
j += n;
}
}
}
我寻找零序列,然后存储位置(ptr+j-1
和 ptr+j+n
)和零区域边界的值,最后我使用 memset() 将零替换为 d_val。
问题是,当我检查存储的值时,它们与 d_val 不匹配,例如,我输入值“222”但得到“57054”。
有什么线索吗?
最佳答案
memset()
的值参数只是一个字节,即使参数的类型是 int
。
The manual page将该功能描述为:
memset - fill memory with a constant byte
因此,只有 d_val
的最低有效 8 位将被写入内存。由于您将内存视为 short
的数组,因此您会得到“困惑”的值,这些值由在 short
的字节中重复的相同字节组成。
简而言之,不要这样做;使用 for
循环重复写入实际的 short
。
关于c - 为什么 memset 会输入错误的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21881555/