首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bradski &Kaehler的“学习OpenCV”示例3-9中的const浮动联合ptr

Bradski &Kaehler的“学习OpenCV”示例3-9中的const浮动联合ptr
EN

Stack Overflow用户
提问于 2013-10-06 07:50:56
回答 1查看 765关注 0票数 0

在Gary &禤浩焯Kaehler的"学习OpenCV“中,有一个关于CvMat矩阵结构的章节,其中包含以下示例代码(示例3-9:将所有元素相加在一个单通道矩阵中)。

代码语言:javascript
复制
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问题的结果。

  1. 为什么是const?由于ptr稍后在函数中递增,所以我不理解为什么声明为const
  2. 为什么是.ptr?作者指出,“当将指针计算到矩阵中时,请记住矩阵元素data是一个联合。因此,当取消引用该指针时,必须指示正确的联合元素,才能获得正确的指针类型。”那么,为什么不使用类型为fl的联合成员float*,以便代码行为 浮动* ptr = mat->data.fl +行*mat->步骤;

而不是使用带有ptr类型的uchar*,而需要额外的强制转换?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-06 08:01:58

为什么是康斯特?由于ptr稍后在函数中递增,我不明白为什么声明它为const。

因为指针不是const,而是它所指向的对象。您正在讨论的内容将被编写为float *const ptr,但正如您所看到的,ptr并不是这样声明的。

为什么是.ptr?

因为工会的大小可能与float不同。想象一下这个数组:

代码语言:javascript
复制
               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,它将产生不正确的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19206627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档