나는 여기서 수영장의 끝까지 걸어갔습니다. 나는 좋은 진전을 보였지만 지금은 주변을 때리고 있습니다. iOS에서이 퍼지 논리 라이브러리를 사용하려고합니다. http://code.google.com/p/fuzzy-lite/iOS (퍼지 논리)에서 C++ fuzzylite lib와 ObjC로 작업하기
컴파일해야합니다. .cpp & .h 파일을 프로젝트에 추가하고 내 서 픽스를 변경했습니다. main viewController를 ".mm"으로 설정하십시오. viewDidload (아래 참조) 내에서 fuzzyLite test.h 파일을 실행할 수 있습니다. 실행되고 테스트 데이터가 표시됩니다.
퍼지 라이트의 영구 인스턴스를 만들어 앱에서 사용할 수 있도록해야합니다 (예 : 앱을 언로드 할 때 정리하고 정리할 수 있어야 함).
ObjC 프로젝트에서 C++ 코드를 포함하는 토론/예제를 검색했지만 이해하지 못했습니다. 누군가가 내가 앞으로 나아갈 수있는 방법을 보여줄 수 있습니까? 함수를 호출하고 결과를 얻을 수 있도록 fuzzyLite 코드를 래핑 하시겠습니까? 감사!
편집 : 내가 여기에 설명 된 방법을 사용하여이 진전을 만들었어요 : I가 불분명 오전 http://robnapier.net/blog/wrapping-c-take-2-1-486
한 가지는 메모리 정리입니다. dealloc 함수는 래핑 된 CPP 인스턴스의 인스턴스를 정리하지만 CCP 인스턴스 내에서 메모리 allocalled는 어떻게됩니까? 인스턴스를 삭제하기 전에 메소드를 호출해야하는 것처럼 보입니다.
예 : 래핑 된 클래스에는 서브 클래스의 일부 인스턴스가 있습니다. 내 클린업은 메모리를 적절하게 관리하는 데 충분한 기능입니까?
- (void)dealloc
{
delete _cpp;
_cpp = NULL;
[super dealloc];
}
FuzzyLiteIOSViewController.mm
다음 ObjC 래퍼의 랩 CPP 클래스#include "fuzzylite/FuzzyLite.h"
namespace fl {
class Bingo {
public:
FuzzyEngine* engine;
OutputLVar* health;
InputLVar* energy;
Bingo();
void Fuzz();
void setInput(float input);
};
}
에 대한
void Bingo::cleanup(){
delete engine;
engine = NULL;
delete health;
health = NULL;
delete energy;
energy = NULL;
}
-header
#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("--");
}
}
답장을 보내 주셔서 감사합니다. 불완전한 코드를 보내 주셔서 감사합니다. 내가 물어 보려던 것은 Bingo 클래스의 인스턴스를 새로 작성한 다음 속성으로 다른 클래스의 인스턴스를 만든 다음 Bingo 인스턴스를 삭제하기 전에 해당 속성을 삭제하는 '정리'메소드를 정의해야합니다. (즉, ** ** ** ** ** ** 내부 Bingo 속성은 별도로 공개되지 않을 것입니다) ** 정리가 필요합니다. –
제 대답에 몇 가지 가이드 라인 정보를 추가했습니다. – jstevenco
다시 감사드립니다! 알 겠어. –