2010-07-09 7 views
2

안전한가요?std :: vector <float> 및 이중 * - 얼마나 안전한가요?

double darray[10]; 
vector<float> fvector; 
fvector.insert(fvector.begin(), darray, darray + 10); // double to float conversion 

// now work with fvector 

VS2008은 float 변환에 대한 경고 메시지를 표시합니다. 이 경고를 어떻게 없앨 수 있습니까? darrayfloat*으로 변환하는 것이 포인터의 단계 크기 (스트라이드)를 변경하는 것이 적절하지 않다고 생각합니다.

업데이트 : 경고 내용을 알고 있습니다. 그러나 "해상 = adouble; 시나리오를 쉽게 적용 할 수있는 시나리오에서이 경우 경고를 제거 할 수 없습니다.

편집 :darray이 더 이상 함수 인수가되지 않도록 코드를 편집했습니다. 그것을 지적 해 주신 모든 분들께 감사드립니다.

답변

4

std :: transform()을 사용하면 변환 방법을 제공 할 수 있습니다.

#include <vector> 
#include <algorithm> 
#include <iterator> 

struct CastToFloat 
{ 
    float operator()(double value) const { return static_cast<float>(value);} 
}; 

int main() 
{ 
    double data[] = { 1, 2,3,4,5,6,7,8,9,10}; 
    std::vector<float> fl; 


    std::transform(data, data+10, 
        std::back_inserter(fl), 
        CastToFloat()); 
} 
+0

람다를 포함한 C++ 11 :'[] (double val) -> float {return (float) val; }'대신'CastToFloat' – dashesy

-2

내 의견으로는 다른 문제가 있습니다. 벡터에 공간이 부족합니다 ...

+1

이유 :
그런 다음 당신은 경고를 생성하지 않습니다 변환 방법이 필요하십니까? 'vector <>'는 필요한만큼의 공간을 확보하기 위해 자동으로 커집니다. – Gorpik

+1

'.insert' 메소드 패밀리는 필요한 경우 여분의 공간을 할당합니다. 호출 후 벡터 크기는'std :: distance (darray, darray + 10)'즉 10에 의해 증가합니다. –

+0

죄송합니다. 그것은 독일에서 오늘 뜨겁다. :-) std :: copy를 생각하고 있었다. – user331471

1

경고는 명시 적 캐스팅없이 유효 자릿수가 손실되는 것에 대한 경고입니다.

double d = 1.0; 
float f = d; 

할당에 대한 경고를 해제 할 수 있습니다 (MSDN의 #pragma warning 참조).

+0

컴파일러가 똑똑하다면, 1.0이 double에서 정확하게 표현되고 또한 떠 다니는 것을 알아야합니다. 그러나 정확하게 표현할 수없는 0.2는 경고해야합니다. –

+0

나는 옵티마이 저가 두 개의 할당을 하나로 묶을 것을 기대한다. 그러나 필자는 컴파일러 진단에 영향을 미치지 않는 ** 최적화 도구의 기능을 기대합니다. 경고가 있으면 1.0과 0.2를 원합니다. – peterchen

3

double에서 float로 변환의 정확도가 떨어 지므로 경고 메시지가 표시됩니다. 그게 전부입니다. 실제로 fvectorvector<float>이고 vector<double>이 아니라고 가정하면이 정밀도 손실로 인해 살 수 있으므로 경고는 중요하지 않습니다.

+1

+1 예. 경고를 비활성화하거나'std :: transform'을 사용하고 변형 함수에서 명시 적 형변환을 제공하십시오. –

0

VS2008은 float 변환에 대한 경고 메시지를 표시합니다. 이 경고를 어떻게 없앨 수 있습니까?

void some_function(double *darray){ 
    vector<double> fvector; 
    fvector.insert(fvector.begin(), darray, darray + 10); 
} 

또는

void some_function(float *darray){ 
    vector<float> fvector; 
    fvector.insert(fvector.begin(), darray, darray + 10); 
} 

또는 두 변종 함수를 오버로드, 또는 그것을 템플릿 물론

template<typename RandomAccessIterator> 
void some_function(RandomAccessIterator it){ 
    typedef typename iterator_traits<RandomAccessIterator>::value_type value_type; 
    vector<value_type> fvector(it, it + 10); 
} 

, 그것은 고정 10을 가정하는 것은 좋은 생각이 아니다. 함수의 매개 변수 목록에있는 10은 의미가 없으므로 원래 코드가 안전하지 않습니다. 그것은 단순히 무시됩니다. 반복기 또는 포인터가 충분히 많은 값에 대한 액세스를 제공해야한다는 점을 명확하게 문서화하십시오.

관련 문제