Bradski & Kaehler 的“Learning OpenCV”示例 3-9 中的 const float union ptr
Posted
技术标签:
【中文标题】Bradski & Kaehler 的“Learning OpenCV”示例 3-9 中的 const float union ptr【英文标题】:const float union ptr in Bradski & Kaehler's "Learning OpenCV" Example 3-9 【发布时间】:2013-10-06 07:50:56 【问题描述】:在 Gary Bradski 和 Adrian Kaehler 的“Learning OpenCV”中,有一段关于 CvMat 矩阵结构的部分包含以下示例代码(示例 3-9:对单通道矩阵中的所有元素求和)
float sum( const CvMat* mat )
float s = 0.0f;
for(int row=0; row<mat->rows; row++ )
const float* ptr = (const float *)(mat->data.ptr + row * mat->step);
for(int col=0; col<mat->cols; col++ )
s += *ptr++;
return( s );
关于这段代码有几处我不明白,但它们可能是我多年未使用 C 而不是 OpenCV 问题的结果。
为什么是const
?由于 ptr
稍后在函数中递增,我不明白为什么将其声明为 const
。
为什么是.ptr
?作者指出“在计算指向矩阵的指针时,请记住矩阵元素data
是一个并集。因此,在取消引用该指针时,必须指出并集的正确元素才能获得正确的指针类型。”那么为什么不使用float*
类型的联合成员fl
以便代码行是
float* ptr = mat->data.fl + row * mat->step;
而不是使用uchar*
类型的ptr
并需要额外的演员表?
【问题讨论】:
好书,但您可能不应该再使用已弃用的 c-api Arghhhhhhh - 标准文本中使用的 API 已弃用? 嗯,是的。改用他的 c++ api。再次,好书,但请从here获取代码示例 很好的资源,但我认为他们不包括问题中的书籍样本。 【参考方案1】:为什么是常量?由于 ptr 稍后在函数中递增,我不明白为什么它被声明为 const。
因为const
不是指针,而是它指向的对象。你所说的应该写成float *const ptr
,但正如你所见,ptr
并没有这样声明。
为什么是 .ptr?
因为联合体的大小可能与float
不同。想象一下这个数组:
union * union * union * union *
+0 +1 +2 +3 (correct)
+----------------+----------------+----------------+
union boundaries: | union | union | union |
+----------------+----------------+----------------+
float boundaries: | float |junk| float |junk| float |junk|
+----------------+----------------+----------------+
^ ^ ^ ^ ^
float * float * float * float * float *
+0 +1 +2 +3 +4
^--------- these are all wrong ----------^
如果你得到一个指向第一个float
的指针并对其应用指针运算,如果union
大于float
,则会产生不正确的结果。
【讨论】:
谢谢 - 我的两个问题都得到了很好的回答。鉴于您关于工会规模的观点,data.fl
工会成员何时会被证明有用或安全使用?以上是关于Bradski & Kaehler 的“Learning OpenCV”示例 3-9 中的 const float union ptr的主要内容,如果未能解决你的问题,请参考以下文章
重磅OpenCV创始人Gary Bradski将任Dorabot机器人视觉首席科学家
LinkList *L和 LinkList *&L和LinkList &*L
数据结构顺序表中Sqlist *L,&L,Sqlist *&L