سؤال

وأنا الغوص في دفعة :: روح من أجل تحليل وprotocoll القائم على ASCII. I mananged لاستخراج القيم من خط باستخدام قواعد من هذا القبيل:

rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_a(buffer.speed)];

وأنا أيضا تنجح في ربط هذه القواعد بطريقة ذات معنى. ما هو مفقود لمدة يوم كامل هو ما يلي: القيم البيانات الصحيحة التي تحتاج إلى أن تتحول إلى القيم النقطة العائمة باستخدام معامل تحويل ثابتة (عادة صلاحيات 10).

وماذا أفعل الآن هو مجرد appying هذه العوامل قشور بعد تحليل. ولكن أود أن apprechiate حقا لتشمل عامل التحجيم فقط داخل قاعدة تعريف للحقل. أتصور شيئا من هذا القبيل:

rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_a(buffer.speed,100)];

وأي اقتراحات؟

وشكرا مقدما آرني

هل كانت مفيدة؟

المحلول

واحد طريقة للقيام بذلك هو استخدام Boost.Phoenix . وتشمل هذه الرؤوس:

#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_object.hpp> // For static_cast_
#include <boost/spirit/include/phoenix_operator.hpp> // For multiplication

ومن ثم استخدام شيء مثل:

using namespace boost::phoenix;
using namespace boost::phoenix::arg_names;

rule<> Speed = uint_parser<unsigned int,10,3,3>()[
    ref(buffer.speed) = static_cast_<double>(arg1) * 100
];

وعلى الرغم من أن أجد طائر الفينيق صعبة بعض الشيء لاستخدام وعموما فقط إرسال بلدي عمل :

struct assign_scaled
{
    double& result;
    double scale;

    assign_with_scale(double& r, double scale) : result(r), scale(scale) {}

    void operator()(unsigned int x) const
    {
        result = static_cast<double>(x) * scale;
    }
};

واستخدامها مثل هذا:

    rule<> Speed = uint_parser<unsigned int,10,3,3>()[assign_scaled(buffer.speed, 100)];

وهذا قد يكون أكثر مطول، ولكن أجد أنه من الأسهل للحفاظ عليها.

نصائح أخرى

ومع Spirit.Qi يمكنك استخدام [ref(buffer.speed) = _1 * 100]

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top