使用条件 while/for 循环的指针在编译时会出错

Posted

技术标签:

【中文标题】使用条件 while/for 循环的指针在编译时会出错【英文标题】:Using pointers for conditional while/for loops gives error when compiling 【发布时间】:2011-10-10 00:00:50 【问题描述】:

我想知道如何在 C++ 中的 for 和 while 循环中正确使用指针。通常我使用 C 而不是 C++ 编写。这次我使用 C++ std 库的唯一原因是我可以使用代码中其他数学函数所需的复数函数。

作为分配的一部分,我们得到了以下函数声明。我写的部分在函数中进行了注释。

 typedef std::complex<double> complex;

 // Evaluates a polynomial using Horner's approach.
 // Inputs:
 //  [coeffs, coeffs_end) - polynomial coefficients, ordered by descending power
 //  x - point of evaluation
 // Outputs:
 //  p - value of polynomial at x
 //  dp - value of polynomial derivative at x
 //  ddp - value of polynomials second derivative at x
 //
 template<typename T>
 inline void poly_val(T const* coeffs, T const* coeffs_end, T x, T & p, T & dp, T & ddp)
  
      //MY CODE HERE
      int i = 0;
      const T *pnt = coeffs;
      while(pnt != coeffs_end)
                  //Evaluate coefficients for descending powers
          p += coeffs(i)*pow(x,((coeffs_end-1)-i));
          pnt++;
          i++;
      
 

函数不知道数组的长度,所以我猜测停止条件是指针'coeffs_end',它指向数组'coeffs'中的最后一个值。我可以以这种方式在条件中使用指针吗? (传统上我会将数组的长度输入函数,但我们不能修改声明)

如果我这样做,我会在编译时不断收到错误(我没有得到):

C2064:term foes 不计算为带 1 个参数的函数

对于以下行:

      p += coeffs(i)*pow(x,((coeffs_end-1)-i));

【问题讨论】:

您到底打算让coeffs(i) 做什么? coeffs 不是函数,是吗? 您确定错误中是foes 而不是coeffs?另外,应该是coeffs[i] 而不是coeffs(i) 是的,它的意思是 coeffs[i]。抱歉,使用 matlab 太多了... 【参考方案1】:

coeffs(i) 是对采用整数参数的函数的调用约定。但在你的情况下,它是一个指针。因此,您需要使用[] 运算符来访问其索引处的元素。

同样((coeffs_end-1)-i) 解析为地址位置。您需要取消引用它以获取该位置的值。

【讨论】:

太棒了。我改变了,现在我得到了编译错误 error C2665: 'std::pow' : 8 个重载中没有一个可以转换所有参数类型 @user986875 - 正如我所说,您需要 *((coeffs_end-1)-i) 取消引用该位置。注意之前的* 运算符。 @user986875 确保指针算法解析为有效的内存位置以取消引用。始终使用指针算术安全。祝你好运。【参考方案2】:

也许以更简洁的方式编写它会更具可读性:

#include <cmath>
#include <iterator>

template<typename T>
inline void poly_val(T const* coeffs, T const* coeffs_end, T x, T & p, T & dp, T & ddp)

  const std::size_t nterms = std::distance(coeffs, coeffs_end);
  for (std::size_t i = 0; i != nterms; ++i)
  
    p += coeffs[i] * std::pow(x, nterms - 1 - i);
  

由于原始指针可以被视为迭代器,我们可以使用std::distance 来确定以[first, last) 为边界的数组的大小。


编辑:实际上它可以更容易地完成:

  for (const T * it = coeffs; it != coeffs_end; ++it)
  
    p += *it * std::pow(x, std::distance(it, coeffs_end) - 1);
  

【讨论】:

很好!!!这非常有用。不知道std::distance。感谢您的提示。 @user986875: distance 不是绝对必要的,因为你可以说coeffs_end - coeffs,但这是一个很好的接触,因为它非常具有自我描述性。 @user986875:我添加了另一个更简单的替代方案。 @Kerrek SB Woot!更整齐!让我想知道为什么他们不让我们从 C++ 开始,因为有大量有用的功能可用。但我想这是一种“从基础开始”的心态^.^

以上是关于使用条件 while/for 循环的指针在编译时会出错的主要内容,如果未能解决你的问题,请参考以下文章

04循环结构(while/do-while/for)

JavaScript循环 while/do while/for的使用

4 常见循环if,while,for

循环语句 while,do while ,for 循环

Python 循环语句(while, for)

if,while,for循环