ЗАЖИМЫ и зажимы мм: прорезь поплавкового типа

У меня проблема со слотом поплавкового типа. В моем файле базы знаний есть шаблон:

(deftemplate test
(slot slot1 (type INTEGER) (default 10))
(slot slot2 (type FLOAT) (default 4.0))
)

Я использую clipsmm для интеграции CLIPS с Qt-приложением. Я так утверждаю факт:

CLIPS::Fact::pointer fact;
QString fact_str = "(test (slot1 15) (slot2 4.3))";
fact = env.assert_fact(Std(fact_str)); //Std() translates QString into std::string

Этот факт добавлен в повестку дня, но slot2 имеет значение = 4.0 вместо 4.3:

<== Activation 0 start:
<== f-0 (initial-fact)
:== ?answer ==> 0 <== 0 //this is global
==> Activation 0 start:
==> f-0 (initial-fact)
Start!
==> f-1 (test (slot1 15) (slot2 4.0))

Если я использую «Экспертную систему XCLIPS», все в порядке, а значение slot2 = 4.3. Что я делаю не так?

UPD. Я изменил environment.cpp следующим образом:

Fact::pointer Environment::assert_fact( const std::string& factstring )
{
  void* clips_fact = EnvAssertString( m_cobj, const_cast<char*>(factstring.c_str()) );

  std::cout << "factstring =" << factstring << std::endl;     //std::cout is added
  if ( clips_fact )
    return Fact::create( *this, clips_fact );
  else
    return Fact::pointer();
}

и отображается правильно: "factstring = (test (slot1 15) (slot2 4.3))"

UPD2. Я попытался добавить факт таким образом:

CLIPS::Template::pointer temp;
temp = env.get_template(Std("test"));
CLIPS::Fact::pointer f1;
f1 = CLIPS::Fact::create(env, temp);
CLIPS::Value v1 = CLIPS::Value(15);
CLIPS::Value v2 = CLIPS::Value(4.3);
f1->set_slot(Std("slot1"), v1);
f1->set_slot(Std("slot2"), v2);
env.assert_fact(f1);

и получили такой результат:

==> f-2     (test (slot1 15) (slot2 4,3.0))

person lebendig    schedule 22.03.2017    source источник
comment
Работаю в Linux (OpenSuse 13.2), использую CLIPS 6.30.0-2.6, clipsmm-0.3.4, Qt 4.8.6   -  person lebendig    schedule 22.03.2017
comment
Вы проверили в методе clipsmm assert_fact в environment.cpp, что преобразованная строка, переданная в EnvAssertString, действительна?   -  person Gary Riley    schedule 22.03.2017
comment
Да, обновил вопрос. Вроде с преобразованной строкой все в порядке.   -  person lebendig    schedule 22.03.2017
comment
Вы также хотите проверить значение factstring.c_str (), чтобы убедиться, что это преобразование работает. Если он работает со стандартным исполняемым файлом клипов, но не работает с clipsmm, возможно, есть некоторая разница в используемых параметрах компиляции.   -  person Gary Riley    schedule 23.03.2017
comment
Я проверил значение factstring.c_str (): это тоже правильно. Подскажите пожалуйста, какие варианты компиляции вы имеете в виду и где их посмотреть?   -  person lebendig    schedule 23.03.2017
comment
Снова обновил вопрос (upd2). Непонятно, что происходит с переводом из строки в число с плавающей запятой.   -  person lebendig    schedule 23.03.2017
comment
Я не могу конкретно сказать вам, что искать, потому что я не знаю конкретно, как вы создали исполняемые файлы, которые используете. Если у вас есть два исполняемых файла, один из которых работает, а другой нет, вам нужно искать, чем они отличаются. Если нет различий в коде или способе создания исполняемых файлов, вы должны пройти через код с помощью отладчика, чтобы увидеть, где они отличаются в исполнении.   -  person Gary Riley    schedule 23.03.2017
comment
Спасибо за ваши Коментарии. Пытался сравнить варианты компиляции, но результата не получил. Помогло сменить настройки локали. Если кто-то знает более изящное решение, напишите, пожалуйста, здесь.   -  person lebendig    schedule 26.03.2017


Ответы (1)


Не совсем разобрался, но помогло следующее: изменить форматирование чисел в настройках локали операционной системы. По умолчанию использовался «ru_Ru», в котором «,» используется для разделения десятичных знаков. Я изменил его на «ba_Ru» (только для «Детальных настроек-> Числа»), и значения типа float в моей экспертной системе стали правильными. Но теперь у меня проблемы с открытием файлов, в которых есть кириллица. Пришлось переименовать некоторые папки и файлы.

person lebendig    schedule 26.03.2017