2011-11-11 4 views
0

나는 여기서 수영장의 끝까지 걸어갔습니다. 나는 좋은 진전을 보였지만 지금은 주변을 때리고 있습니다. 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("--"); 
    } 
} 

답변

1

그것은 귀하의 질문에 제공되는 정보를 제공 대답 기본적으로 수 없습니다. 귀하의 질문은 Bingo 클래스의 cleanup 메서드에 관한 것이지만 스택이나 힙에있는 Bingo 인스턴스는 코드 발췌 부분에 아무 것도 나타나지 않습니다. 마찬가지로 "포장 된 CPP 인스턴스"를 정리하고 있지만 다른 곳에서는 참조하지 않았다고 명시합니다. Test::SimplMamdani 방법으로 누수가있는 것으로 나타납니다. new 거기에는 적어도 공개 된 코드에는 해당하지 않는 개체 묶음이 있습니다. 해당 delete이 있습니다. 마찬가지로 FuzzyLiteIOSViewController::viewDidLoad 메서드에서 이없는 힙에 Test 인스턴스를 만듭니다.나는 C++ 코드의 후드 아래에서 자동 꾸러미가 없다고 가정하고있다.

추가 정보를 제공하도록 업데이트 : 귀하의 의견에

을 기반을, 당신은 C++의 기본 언어 구조를 검토 할 필요가있다. 기본 규칙은 당신이 new 무엇이든 delete가 필요하다는 것입니다. Bingo 클래스에 대한 정리는 소멸자 (Objective-C의 dealloc에 대한 C++ 구조)에서 수행되어야합니다.

Bingo.h :

namespace fl { 
    class Bingo { 
    public: 

     Bingo(); 
     virtual ~Bingo(); 

     void Fuzz(); 
     void setInput(float input); 

     FuzzyEngine* engine; 
     OutputLVar* health; 
     InputLVar* energy; 

    protected: 
    private: 
    }; 
} 

Bingo.cpp : 귀하의 Bingo 클래스가 더 좋아 보일 것이다

using namespace fl; 

Bingo::Bingo() { 
} 

Bingo::~Bingo() { 
    if (engine) { 
     delete engine; 
    } 
    if (health) { 
     delete health; 
    } 
    if (energy) { 
     delete energy; 
    } 
} 
당신이 delete 빙고 인스턴스 소멸자가 호출 될 것이다

Bingo ' 멤버 변수가 삭제됩니다.

아마도 회원 변수 (엔진, 건강 및 에너지)는 공개적으로 범위를 지정하고 public-scoped getter 및 setters를 통해 노출되어야합니다.

Bjarne Stroustrup의 C++ 참조 사본을 가져 와서 빠른 열람을하거나 this one과 같은 온라인 승복 가이드를 사용하십시오.

+0

답장을 보내 주셔서 감사합니다. 불완전한 코드를 보내 주셔서 감사합니다. 내가 물어 보려던 것은 Bingo 클래스의 인스턴스를 새로 작성한 다음 속성으로 다른 클래스의 인스턴스를 만든 다음 Bingo 인스턴스를 삭제하기 전에 해당 속성을 삭제하는 '정리'메소드를 정의해야합니다. (즉, ** ** ** ** ** ** 내부 Bingo 속성은 별도로 공개되지 않을 것입니다) ** 정리가 필요합니다. –

+0

제 대답에 몇 가지 가이드 라인 정보를 추가했습니다. – jstevenco

+0

다시 감사드립니다! 알 겠어. –