Странное поведение метода

Я пытаюсь написать программу для моего Arduino, которая управляет роботизированной машиной, используя нечеткую логику. Но я столкнулся с проблемой в C ++ (поскольку я новичок в этом). У меня есть метод в моем классе FRule, который выглядит так:

double FRule::dof(double x1,double x2){
pi1 = ant1->getFSet(U1)->lom(x1); //ant1 is a TermSet
pi2 = ant2->getFSet(U2)->lom(x2); //ant2 is a TermSet
Serial.println(pi1);
Serial.println(pi2);
return min(pi1,pi2);;
}

Если я позвоню lom методы на FSet объекты напрямую, это дает мне правильные результаты. Но если я попытаюсь позвонить им через FRule метод dof, он возвращает неправильные результаты, и я не уверен, почему это происходит.

Любая идея?

Источник всей программы:

** Я сделал некоторые изменения в соответствии с комментариями **

Класс FSet:

FSet::FSet(double center, double delta, int inf){

this->inf = inf;
this->delta = delta;
this->a = center - delta;
this->b = center + delta;
this->center = center;
}

double FSet::lom(double crispValue) {
if(inf == 0){
if((crispValue < this->a) || (crispValue > this->b)){
return 0.0;
} else {

return 1 - abs(crispValue-center)*(1.0/delta);
}
} else {
if( ((crispValue < this->a) && (inf > 0)) ||
((crispValue > this->b) && (inf < 0))){
return 0.0;
}

if((inf > 0) && (crispValue < center)){
return 1 - abs(crispValue-center)*(1.0/delta);
} else if((inf < 0) && (crispValue > center)){
return 1 - abs(crispValue-center)*(1.0/delta);
} else {
return 1.0;
}

}
}

Класс TermSet:

TermSet::TermSet(float a, float b, float step, int setsSize){
this->a = a;
this->b = b;
this->step = step;
this->last = -1;

this->setsSize = setsSize;
this->sets = (FSet**) malloc(sizeof(FSet*) * setsSize);
this->size = (b-a)/step + 1;
}

TermSet::~TermSet(){
free(this->sets);
}

FSet* TermSet::getFSet(int index){
return this->sets[index];
}

int TermSet::addFSet(FSet* set){
sets[++last] = set;
return last;
}

double TermSet::getUODValue(int index){
return a + index*step;
}

int TermSet::UODSize(){
return size;
}

FRule класс

FRule::FRule(TermSet* ant1, int u1, TermSet* ant2, int u2, TermSet* conTermSet, int d){
this->ant1 = ant1;
this->ant2 = ant2;
this->con = conTermSet;
this->U1 = u1;
this->U2 = u2;
this->D = d;

pi1 = 0.0;
pi2 = 0.0;
cdof = 0.0;
}

double FRule::dof(double x1,double x2){
pi1 = ant1->getFSet(U1)->lom(x1); //ant1 is a TermSet
pi2 = ant2->getFSet(U2)->lom(x2); //ant2 is a TermSet
Serial.println(pi1);
Serial.println(pi2);
return min(pi1,pi2);;
}

И, наконец, код приложения

FSet errN(-2,2,-1);
FSet errZ(0,2,0);
FSet errP(2,2,1);

FSet errDtN(-0.5,0.5,-1);
FSet errDtZ(0,0.5,0);
FSet errDtP(0.5,0.5,1);

FSet cntN(-4,4,-1);
FSet cntZ(0,4,0);
FSet cntP(4,4,1);

TermSet errDt(-1,1,0.1,3);
TermSet err(-3,3,1,3);
TermSet cnt(-6,6,1,3);void loop(){

errDt.addFSet(&errDtN);
int ierrDt = errDt.addFSet(&errDtZ);
errDt.addFSet(&errDtP);

err.addFSet(&errN);
int ierr = err.addFSet(&errZ);
err.addFSet(&errP);

cnt.addFSet(&cntN);
cnt.addFSet(&cntZ);
cnt.addFSet(&cntP);

FRule rule1(&err,ierr,&errDt,ierrDt,&cnt,1);

Serial.print("UOD SIZE: ");
Serial.println(errDt.UODSize());

Serial.print("LOM1: ");
Serial.println(errZ.lom(0));

Serial.print("LOM2: ");
Serial.println(errDtZ.lom(-0.1));

Serial.print("DOF: ");
Serial.println(rule1.dof(0,-0.1));

delay(10000);

}

Заголовочные файлы:

class FSet {
public:
FSet(double center, double delta, int inf);
// Returns Level Of Matching (value of the membership function) for the given x
double lom(double crispValue);
// Start of UOD
double a;
// End of UOD
double b;
private:
double center;
ouble delta;
int inf;
};

class TermSet {

public:
TermSet(float uodA, float uodB, float step, int setsSize);
~TermSet();
FSet* getFSet(int index);
int addFSet(FSet* set);
double getUODValue(int index);
int UODSize();

FSet** sets;
int setsSize;
float a = 0;
float b = 0;
float step;
int size = 0;
private:
int last;
};

class FRule {
public:
FRule(TermSet* ant1, int u1, TermSet* ant2, int u2, TermSet* conTermSet, int d);
double dof(double x1,double x2);
double* ruleOutput(double x1, double x2);
TermSet* ant1;
TermSet* ant2;
TermSet* con;
double cdof;
double pi1;
double pi2;
private:
int U1;
int U2;
int D;

};

1

Решение

Ну вот ошибка

TermSet::TermSet(float a, float b, float step, int setsSize){
this->a = a;
this->b = b;
this->step = step;
this->last = -1;

this->setsSize = size;

С этой точки зрения size является неинициализированной переменной Ваш компилятор должен был предупредить вас об этом. Обратите внимание на предупреждения компилятора. Я думаю, ты имел в виду

this->setsSize = setsSize;

Не знаю, является ли это причиной возникшей у вас проблемы, но вы не дали нам многого, чтобы продолжить.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]