Я забрел в глубокий конец бассейна здесь.Я добился хороших успехов, но сейчас просто бегаю.Я пытаюсь использовать эту библиотеку нечеткой логики в iOS: http://code.google.com/p/fuzzy-lite/
У меня есть ее для компиляции - я просто добавил .cpp и .h файлы в свой проект и изменилсуффикс на моем главном viewController к ".mm".Я могу запустить файл fuzzyLite test.h из viewDidload (см. Ниже).Он запускается и отображаются тестовые данные.
Что мне нужно сделать, это создать постоянный экземпляр fuzzyLite, чтобы я мог использовать его в своем приложении (например, иметь возможность обратиться к нему, а затем очистить при выгрузке приложения)).
Я искал вокруг, но не понял обсуждения / примеры включения кода C ++ в проект ObjC.Может кто-нибудь показать мне, как я могу продвинуться вперед с этим - упаковав код fuzzyLite, чтобы я мог вызывать функции и получать результаты обратно?Спасибо!
РЕДАКТИРОВАТЬ: Я добился прогресса в этом, используя метод, подробно описанный здесь: http://robnapier.net/blog/wrapping-c-take-2-1-486
Одна вещь, которая мне неясна, это очистка памяти.Функция dealloc очищает экземпляр обернутого экземпляра CPP - но как насчет памяти, выделенной в экземпляре CCP?Похоже, мне нужно вызвать метод, чтобы освободить его до удаления экземпляра.
ex: у обернутого класса есть несколько экземпляров переменных подклассов - достаточно ли моей функции cleanup для правильного управления памятью?
void Bingo::cleanup(){
delete engine;
engine = NULL;
delete health;
health = NULL;
delete energy;
energy = NULL;
}
-header дляобернутый класс CPP
#include "fuzzylite/FuzzyLite.h"
namespace fl {
class Bingo {
public:
FuzzyEngine* engine;
OutputLVar* health;
InputLVar* energy;
Bingo();
void Fuzz();
void setInput(float input);
};
}
из оболочки ObjC:
- (void)dealloc
{
delete _cpp;
_cpp = NULL;
[super dealloc];
}
FuzzyLiteIOSViewController.mm
#include "FuzzyLiteIOSViewController.h"
#include "FuzzyLite.h"
#include "test.h"
#include <limits>
#include "fuzzylite/FunctionTerm.h"
//stuff not shown
- (void)viewDidLoad
{
[super viewDidLoad];
fl::Test* test = new fl::Test();
test->SimpleMamdani();
}
test.h
#ifndef FL_TEST_H
#define FL_TEST_H
namespace fl {
class Test {
public:
static void SimpleMamdani();
};
}
#endif /* FL_TEST_H */
test.cpp
#include "fuzzylite/test.h"
#include "fuzzylite/FuzzyLite.h"
#include <limits>
#include "fuzzylite/FunctionTerm.h"
namespace fl {
void Test::SimpleMamdani() {
FuzzyOperator& op = FuzzyOperator::DefaultFuzzyOperator();
FuzzyEngine engine("simple-mamdani", op);
engine.hedgeSet().add(new fl::HedgeNot);
engine.hedgeSet().add(new fl::HedgeSomewhat);
engine.hedgeSet().add(new fl::HedgeVery);
fl::InputLVar* energy = new fl::InputLVar("Energy");
energy->addTerm(new fl::ShoulderTerm("LOW", 0.25, 0.5, true));
energy->addTerm(new fl::TriangularTerm("MEDIUM", 0.25, 0.75));
energy->addTerm(new fl::ShoulderTerm("HIGH", 0.50, 0.75, false));
engine.addInputLVar(energy);
fl::OutputLVar* health = new fl::OutputLVar("Health");
health->addTerm(new fl::TriangularTerm("BAD", 0.0, 0.50));
health->addTerm(new fl::TriangularTerm("REGULAR", 0.25, 0.75));
health->addTerm(new fl::TriangularTerm("GOOD", 0.50, 1.00));
engine.addOutputLVar(health);
fl::RuleBlock* block = new fl::RuleBlock();
block->addRule(new fl::MamdaniRule("if Energy is LOW then Health is BAD", engine));
block->addRule(new fl::MamdaniRule("if Energy is MEDIUM then Health is REGULAR", engine));
block->addRule(new fl::MamdaniRule("if Energy is HIGH then Health is GOOD", engine));
engine.addRuleBlock(block);
for (fl::flScalar in = 0.0; in < 1.1; in += 0.1) {
energy->setInput(in);
engine.process();
fl::flScalar out = health->output().defuzzify();
(void)out; //Just to avoid warning when building
FL_LOG("Energy=" << in);
FL_LOG("Energy is " << energy->fuzzify(in));
FL_LOG("Health=" << out);
FL_LOG("Health is " << health->fuzzify(out));
FL_LOG("--");
}
}