2011-10-10 3 views
1

C++의 for 및 while 루프에서 포인터를 올바르게 사용하는 방법이 궁금합니다. 일반적으로 C++ 대신 C를 사용하여 씁니다. 이번에는 C++ 표준 라이브러리를 사용하는 유일한 이유는 코드에서 다른 수학 함수에 필요한 복소수 함수를 사용할 수 있기 때문입니다.조건부 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'의 마지막 값을 가리키는 포인터 'coeffs_end'하지 않습니다. 이런 식으로 조건부에서 포인터를 사용할 수 있습니까? (전통적으로 I는 함수에 배열의 길이를 공급했을 것이다, 그러나 우리는 선언을 수정 기운) 나는 그것을 내가 컴파일 할 때 (내가하지 않는) 오류가 계속 이런 식으로 할 경우

을 :

C2064 :

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

정확히'COEFFS (I)에 대한 의도가 무엇'할까? 'coeffs'는 함수가 아닙니다. – jwodder

+2

오류가'fees'이고'coeffs'가 아닌 것은 확실합니까? 또한'coeffs (i) '보다는'coeffs [i]'가되어야 하는가? – quasiverse

+0

그래, coeffs [i]를 의미합니다. 미안 너무 많이 사용하고 있습니다 ... – user986875

답변

2

coeffs(i) 정수 인수를 취하는 함수에 규칙을 호출 : 용어 적을 1 인자 다음 행을

을 복용 함수에 평가하지. 그러나 귀하의 경우에는 포인터입니다. 따라서 인덱스에서 요소에 액세스하려면 [] 연산자를 사용해야합니다.

또한 ((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).


편집 : Acutally 그것은 더 쉽게 수행 할 수 있습니다

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 : 나는 또 다른, 심지어 간단한 대안을 추가했다. –

관련 문제