使用条件 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 循环的指针在编译时会出错的主要内容,如果未能解决你的问题,请参考以下文章