我已经走进了游泳池的深处。我已经取得了一些不错的进步,但现在却步履蹒跚。我正在尝试在iOS中使用此模糊逻辑库:http://code.google.com/p/fuzzy-lite/
我已经编译好了-我要做的是将.cpp和.h文件都添加到我的项目中,并将主viewController的后缀更改为“ .mm”。我可以从viewDidload(如下所示)中运行FuzzyLite test.h文件。它运行并显示测试数据。
我需要做的是创建一个FuzzyLite的持久实例,以便可以在我的应用程序中使用它(例如,能够解决它,然后在应用程序卸载时清理它)。
我到处搜索,但不了解在ObjC项目中包含C ++代码的讨论/示例。有人可以告诉我一种前进的方式-包装FuzzyLite代码,以便我可以调用函数并返回结果吗?谢谢!
编辑:我已经使用这里详细介绍的方法在此方面取得了进展:
http://robnapier.net/blog/wrapping-c-take-2-1-486
我不清楚的一件事是内存清理。 dealloc函数清除包装的CPP实例的实例-但是在CCP实例中分配的内存又如何呢?似乎我需要在删除实例之前调用方法来释放该方法。
例如:包装的类具有一些子类的实例变量-我的清理函数是否足以正确管理内存?
void Bingo::cleanup(){
delete engine;
engine = NULL;
delete health;
health = NULL;
delete energy;
energy = NULL;
}
包装的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();
}
测试
#ifndef FL_TEST_H
#define FL_TEST_H
namespace fl {
class Test {
public:
static void SimpleMamdani();
};
}
#endif /* FL_TEST_H */
测试文件
#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("--");
}
}
最佳答案
鉴于所提供的信息,基本上不可能回答您的问题。您的问题与cleanup
类的Bingo
方法有关,但是Bingo实例(在堆栈或堆上)在代码摘录中无处可见。同样,您声明要清除“包装的CPP实例”,但在其他地方均未引用该实例。看来您的Test::SimplMamdani
方法中存在泄漏-您在new
一堆对象中[至少在显示的代码中]没有任何相应的delete
。同样,在您的FuzzyLiteIOSViewController::viewDidLoad
方法中,您在堆上创建一个Test
实例,而没有相应的delete
。我假设您的C ++代码中没有任何autoptr内容。
更新以提供其他信息:
根据您的评论,您需要查看C ++的基本语言结构。基本规则是您需要delete
new
的任何内容。 Bingo
类的清理应在析构函数(Objective-C的dealloc
的C ++构造)中执行。您的Bingo
类应类似于:
宾果游戏:
namespace fl {
class Bingo {
public:
Bingo();
virtual ~Bingo();
void Fuzz();
void setInput(float input);
FuzzyEngine* engine;
OutputLVar* health;
InputLVar* energy;
protected:
private:
};
}
Bingo.cpp:
using namespace fl;
Bingo::Bingo() {
}
Bingo::~Bingo() {
if (engine) {
delete engine;
}
if (health) {
delete health;
}
if (energy) {
delete energy;
}
}
当您
delete
一个Bingo实例时,析构函数将被调用,而Bingo
的成员变量将被处置。可以说,您的成员变量(引擎,健康状况和能源)应该在范围上是私有的,并通过公共范围的getter和setter公开。
可以获取Bjarne Stroustrup的C ++参考副本,并快速阅读,或使用this one之类的在线起步指南。