我正试图以这种方式使用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'。
任何线索?
答案 0 :(得分:3)
memset()
的value参数只是一个字节,即使参数的类型是int
。
The manual page将函数描述为:
memset - 用常量字节填充内存
因此,d_val
的最低8位将被写入内存。由于您将内存视为short
数组,因此会得到“错位”值,这些值由在short
的字节中重复的相同字节组成。
简而言之,不要这样做;使用for
循环重复写入实际的short
。
答案 1 :(得分:2)
memset
一次写一个字符,而你正在短时间访问它们。 57054 = 222 * 256 + 222