2010-12-01 23 views
10

Je dois faire une conversion d'une angular_velocity générale en degrés/seconde.Conversion d'unités dans boost.units de angular_velocity en degrés_per_second

Pour illustrer ce problème, l'exemple boostUnits.cpp:

#include <boost/units/systems/si.hpp> 
#include <boost/units/systems/angle/revolutions.hpp> 
#include <boost/units/systems/angle/degrees.hpp> 
#include <boost/units/conversion.hpp> 
#include <boost/units/pow.hpp> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    boost::units::quantity< boost::units::si::angular_velocity> m_speed(
    (30.0*boost::units::si::radians_per_second) 
); 
    std::cout << "m_speed: " << m_speed << std::endl; 

    uint32_t result = static_cast<uint32_t>(
    boost::units::quantity<boost::units::si::angular_velocity,uint32_t>(
     m_speed*boost::units::degree::degrees/boost::units::si::seconds 
    ).value() 
); 
    std::cout << " result: "<< result << std::endl; 

    return(0); 
} 

produit cette sortie du compilateur:

g++ boostUnits.cpp 
/usr/local/include/boost/units/detail/conversion_impl.hpp: In static member function ‘static boost::units::quantity<Unit2, T2> boost::units::conversion_helper<boost::units::quantity<Unit1, T1>, boost::units::quantity<Unit2, T2> >::convert(const boost::units::quantity<Unit1, T1>&) [with Unit1 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::dimensionless_type> >, void>, T1 = double, Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l, 1l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, T2 = unsigned int]’: 
/usr/local/include/boost/units/quantity.hpp:193: instantiated from ‘boost::units::quantity<Unit, Y>::quantity(const boost::units::quantity<Unit2, YY>&, typename boost::disable_if<boost::mpl::and_<typename boost::units::is_implicitly_convertible<Unit2, Unit>::type, boost::units::detail::is_non_narrowing_conversion<YY, Y>, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >, typename boost::units::detail::disable_if_is_same<Unit, Unit2>::type>::type*) [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::dimensionless_type> >, void>, YY = double, Unit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l, 1l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, Y = unsigned int]’ 
boostUnits.cpp:16: instantiated from here 
/usr/local/include/boost/units/detail/conversion_impl.hpp:345: error: no matching function for call to ‘conversion_factor(boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::dimensionless_type> >, void>&, boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l, 1l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>&)’ 

Quelle est la syntaxe pour obtenir la spécification de type souhaité et la conversion ultérieure? Dois-je spécifier une unité degrees_per_second, et si oui, comment?

Documentation: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_units.html

Nous vous remercions d'avance pour votre aide.

+0

'type' incomplète signifie généralement que vous êtes un manque un include. Vous ne donnez pas assez d'informations pour nous dire lequel – icecrime

+0

j'ai ajouté un échantillon complet qui devrait rendre le problème plus facile à diagnostiquer. L'erreur est légèrement différente d'avant. –

+2

Parfois, il est plus facile de ne pas utiliser des bibliothèques comme 'boost 'pour * tout * but. La conversion d'une vitesse angulaire ne semble pas avoir besoin de «boost» ou quelque chose de similaire. Pourquoi n'utilisez-vous pas simplement les mathématiques sans avoir huit inclus et deux lignes de code illisible étant plus long qu'une fenêtre pourrait couvrir? Ce n'est pas une solution au problème, je sais, c'est juste un commentaire. Est-ce qu'une balise de devoirs manque? – Flinsch

Répondre

10

Steven Wantabe provided the solution sur la liste de diffusion boost-users.
J'ai implémenté un exemple de travail ci-dessous.

boostUnits.cpp:

#include <boost/units/systems/si.hpp> 
#include <boost/units/systems/angle/revolutions.hpp> 
#include <boost/units/systems/angle/degrees.hpp> 
#include <boost/units/conversion.hpp> 
#include <boost/units/pow.hpp> 
#include <boost/units/io.hpp> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

    typedef boost::units::divide_typeof_helper< 
     boost::units::degree::plane_angle, 
     boost::units::si::time 
    >::type degrees_per_second; 

int main() 
{ 

    boost::units::quantity< boost::units::si::angular_velocity> m_speed(
    (30.0*boost::units::si::radians_per_second) 
); 

    std::cout << "m_speed rad/sec: " << m_speed << std::endl; 

    std::cout << "m_speed deg/sec: " << 
    static_cast< 
     boost::units::quantity<degrees_per_second> 
    >(m_speed) << 
    std::endl; 

    uint32_t result = static_cast<uint32_t>(
    static_cast< 
     boost::units::quantity<degrees_per_second> 
    >(m_speed).value()); 

    std::cout << "int result: "<< result << std::endl; 

    return(0); 
} 

Terminal Sortie:

g++ boostUnits.cpp 
./a.out 
m_speed rad/sec: 30 s^-1 rad 
m_speed deg/sec: 1718.87 deg s^-1 
int result: 1718 
0

Vous n'avez pas besoin que beaucoup de code. L'algèbre naturelle peut vous y mener.

#include<boost/units/systems/si/io.hpp> 
#include<boost/units/systems/cgs/io.hpp> 
#include <boost/units/systems/angle/degrees.hpp> 

#include<boost/units/cmath.hpp> 
#include<iostream> 

using std::cout; 
using namespace boost::units; 

int main(){ 

    quantity<si::angular_velocity> m_speed = 30.*si::radian/si::second ; 
    cout 
     << m_speed << '\n' 
     << m_speed/(degree::degree/si::second) << '\n' 
     << quantity<si::dimensionless>(m_speed/(degree::degree/si::second))*(degree::degree/si::second) << '\n' 
     << (quantity<si::dimensionless>(m_speed/(degree::degree/si::second))*(degree::degree/si::second)).value() << '\n' 
     << int((quantity<si::dimensionless>(m_speed/(degree::degree/si::second))*(degree::degree/si::second)).value()) 
    ; 
} 

Sortie:

30 s^-1 rad 
30 deg^-1 rad 
1718.87 deg s^-1 
1718.87 
1718 
+0

Il est possible que cela implique de nouvelles fonctionnalités qui sont devenues disponibles depuis la publication de la question originale il y a 5 ans. Merci pour la mise à jour! –

+0

Peut-être, mais j'en doute. Il utilise seulement la conversion d'unités au constructeur qui était dans Boost. Unités depuis le début autant que je sache. Désolé d'être si en retard. – alfC

+0

Merci pour l'approche, c'est joli! –