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

C语言合并两个集合(L,L1) 将L1中不在L中的元素插入到L线性表中

c语言声明08

数据结构问题 (Sqlist &l)与(Sqlist l)的区别