2011-10-10 34 views
1

我想知道如何在C++中正確使用for和while循環中的指針。通常我使用C而不是C++編寫。我這次使用C++ std庫的唯一原因是我可以使用代碼中其他數學函數所需的複數函數。編譯時使用指針for conditional while/for循環會產生錯誤

作爲賦值的一部分,我們給了下面的函數聲明。我寫的部分是在函數中註釋的。

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:長期敵人不能評價服用1個參數

以下行的函數:

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

你到底打算讓'coeffs(ⅰ)'做什麼? 'coeffs'不是一種功能,是嗎? – jwodder

+2

你確定它是'敵人'而不是'coeffs'的錯誤嗎?另外,它應該是'coeffs [i]'而不是'coeffs(i)'? – quasiverse

+0

是的,它的意思是coeffs [i]。對不起,使用matlab太多了...... – user986875

回答

2

coeffs(i)被調用約定到取一個整數參數的函數。但在你的情況下,它是一個指針。因此,您需要使用[]運算符來訪問索引處的元素。

另外((coeffs_end-1)-i)解析爲地址位置。您需要解除引用才能獲取該位置的值。

+0

太棒了。我改變了,現在我得到了編譯錯誤錯誤C2665:'std :: pow':8重載沒有一個可以轉換所有參數類型 – user986875

+2

@ user986875 - 正如我所說的,你需要'*((coeffs_end-1 )-i)'提供該位置的引用。注意之前的'*'運算符。 – Mahesh

+0

啊我現在明白了。謝謝。 – user986875

1

也許它會更可讀的清潔器的方式寫:

#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)


編輯:NOTE:事實上這是可以做到更簡單:

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

不錯!這非常有用。不知道std :: distance。謝謝你的提示。 – user986875

+0

@ user986875:'distance'不是絕對必要的,因爲你可以說'coeffs_end - coeffs',但它是一個很好的接觸,因爲它是非常自我描述的。 –

+0

@ user986875:我添加了另一個更簡單的選擇。 –