0

私はここのプールの奥深くに迷い込んだ。私はいくつかの良い進歩を遂げましたが、今はただぶらぶらしています。iOSでこのファジーロジックライブラリを使用しようとしています:http ://code.google.com/p/fuzzy-lite/

コンパイルする必要があります。プロジェクトに.cppファイルと.hファイルの両方を追加し、メインのviewControllerのサフィックスを「.mm」に変更しました。viewDidload内からfuzzyLitetest.hファイルを実行できます(以下を参照)。実行され、テストデータが表示されます。

私がする必要があるのは、fuzzyLiteの永続インスタンスを作成して、アプリで使用できるようにすることです(たとえば、それに対処して、アプリがアンロードされたときにクリーンアップできるようにします)。

私は周りを検索しましたが、ObjCプロジェクトにC++コードを含めることの議論/例を理解していません。誰かが私がこれを進める方法を教えてもらえますか?関数を呼び出して結果を取り戻すことができるようにfuzzyLiteコードをラップしますか?ありがとう!

編集:私はここに詳述された方法を使用してこれを進歩させました:http: //robnapier.net/blog/wrapping-c-take-2-1-486

私がはっきりしていないことの1つは、メモリのクリーンアップです。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();

}

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("--");
    }
}
4

1 に答える 1

1

提供された情報を考えると、基本的にあなたの質問に答えることはできません。あなたの質問はクラスのcleanupメソッドに関するものですBingoが、ビンゴのインスタンス(スタックまたはヒープのいずれか)はコードの抜粋のどこにも表示されません。同様に、「ラップされたCPPインスタンス」をクリーンアップしていると述べていますが、それは他のどこにも参照されていません。メソッドにリークがあるようです。[少なくとも明らかにされたコードでは]対応するがないオブジェクトの束があります。同様に、メソッドでは、対応する。なしでヒープ上にインスタンスを作成します。私はあなたのC++コードの内部でautoptrのものが起こっていないことを前提としています。Test::SimplMamdaninewdeleteFuzzyLiteIOSViewController::viewDidLoadTestdelete

追加情報を提供するために更新されました:

コメントに基づいて、C++の基本的な言語構造を確認する必要があります。基本的なルールは、あなたがdelete何でもする必要があるということですnewBingoクラスのクリーンアップは、デストラクタ(Objective-CのC ++構造dealloc)で実行する必要があります。クラスBingoは次のようになります。

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:

using namespace fl;

Bingo::Bingo() {
}

Bingo::~Bingo() {
    if (engine) {
        delete engine;
    }
    if (health) {
        delete health;
    }
    if (energy) {
        delete energy;
    }
}

ビンゴインスタンスをdelete作成すると、デストラクタが呼び出され、Bingoのメンバー変数が破棄されます。

おそらく、メンバー変数(エンジン、ヘルス、およびエネルギー)は、スコープがプライベートであり、パブリックスコープのゲッターおよびセッターを介して公開されている必要があります。

BjarneStroustrupのC++リファレンスのコピーを入手して、すぐに読んでもらうか、このようなオンラインの立ち上げガイドを使用してください。

于 2012-01-05T02:03:53.977 に答える