【问题标题】:iterating over const matrix and vector迭代 const 矩阵和向量
【发布时间】:2015-08-07 20:04:01
【问题描述】:

我有一个以常量矩阵和向量作为输入的函数,我正在尝试按如下方式迭代列

void matx_mut(const int *A, const int **B, unsigned int c, unsigned int a_col_start, unsigned int a_col_end,     unsigned int a_row_start, unsigned int a_row_end)
{
        unsigned int i
        int  *a_ptr, *b_ptr;
        // do initial processing

        for( i = a_col_start; i <= a_col_end; i++)
        {
            // some code 

            a_ptr = &A[a_col_start];
            b_ptr = &B[i][a_row_start];

            // more code 

        }
} 

但是,我收到以下警告“警告 C4090: '=' : different 'const' qualifiers”。我不能将 a_ptr 和 b_ptr 更改为 const,因为我在每次迭代时都在更改它们的值,对吧?

除了在第二个 for 循环中声明两个指针之外,有没有解决此警告的好方法。

我尝试使用初始指针 A 和 B,但这使得它不容易阅读:(

【问题讨论】:

  • 您是否(不是)错过了;
  • 和类似a_row_start的定义?
  • 如果你修改a_ptr[0],你实际上是在修改A[a_col_start],这正是const int *A试图阻止你做的事情。
  • 有理由将它们设为 const 吗?如果要更改它们的值,则不应使用 const。
  • @Sourav Ghosh,谢谢,我忘记输入了。我编辑了我的原始帖子。

标签: c pointers matrix


【解决方案1】:

根据c4090警告的描述,

操作中使用的变量是使用指定的修饰符定义的,该修饰符可防止在编译器未检测到的情况下对其进行修改。表达式无需修改即可编译。

当指向 const 或 volatile 项的指针分配给未声明为指向 const 或 volatile 的指针时,可能会导致此警告。

原因:在您的代码中

 a_ptr = &A[a_col_start];
 b_ptr = &B[i][a_row_start];

目标指针不是const,源指针是。在这种情况下,如果您尝试修改 (through) a_ptr 的值,请根据标准第 §6.7.3 章

如果尝试通过使用具有非 const 限定类型的左值来修改使用 const 限定类型定义的对象,则行为未定义.. [...]

您将面临未定义的行为。因此,编译器会警告您,由于通过非常量指针修改值,您稍后可能会遇到潜在的 UB。

这里的重点是,警告是有原因的,尝试解决可能的问题,不要试图压制它。

另外,我认为您缺少对 const 类型限定符的理解。如果是这样的定义

 const int * a_ptr;

a_ptr 不是一个常数*a_ptr 是。因此,您可以将a_ptrb_ptr 指针设为const,并在循环内为其赋值。根据const 属性,您无法更改指针指向的位置的值。

【讨论】:

  • 这并不能真正回答问题。所有这些信息都已经说明。 OP 只是真的想违反 const 限定符,而不是使参数成为非 const。
  • @Sourav Ghosh,感谢您提供的信息。以前,我想当放入 const int * a_ptr 时,我会将 *a_ptr 和 a_ptr 中的值作为 const。但是,您的解释清除了这一点。我把 int *a_ptr 改成了 const int * a_ptr,警告就没有了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2017-11-14
  • 2016-02-22
  • 2017-01-30
  • 1970-01-01
相关资源
最近更新 更多