2017-10-16 5 views
-1

아이디어가 있으십니까?초기 상태를 한 번만 반환하십시오.

이산 시간 함수 "실행"을 호출하려고합니다. 첫 번째 호출 : "execute"는 초기화 상태를 반환합니다. 다음 호출 때마다 : "execute"는 계산 된 값을 반환합니다. 는 "Initflag"(런타임)와

내 생각 :

while(true){ 
    myValue = myObj.execute(); 
    doSomethingWith(myValue); 
} 

//Anywhere in a Class 
public: 
    float execute(){ 
    if(InitFlag){ 
     InitFlag = false; //now permanent set to false 
     return 42; 
    } 
    else{ 
     return value = value + 42; 
    } 
} 
private: 
    bool InitFlag = true; 
    float value = 0; 
} 

내 질문 : 에 "NormalExecution"컴파일 타임에 -switchin은 "초기화"를 구현하는 방법이 있나요? 영구히 깃발을 묻지 않고?

이 문제에 대해 더 나은 "키워드"/ "설명"이 있습니까?

std::cout << "Class Statespace"; //Ausgabe 
for(int t = 1; t <= 50; ++t){ 
    DCMotor.Input(Matrix<float, 1, 1>(u)); 
    DCMotor.Execute(); 
    y = DCMotor.Output(); 
    std::cout << "t = " << t << " y = " << y; //Ausgabe 
} 

내 질문 : 내가 좋아 당신의 도움이 클래스

1.Init 
2. Loop calls any algorithmen in the same way 
2.1 Input 
2.2 Execute 
2.3 Output 

다른 알고리즘을 호출의 예의

//Bigger view 

// One of my algorithm (dont take it, it´s not tested) 

/// Integrator Euler-Backward 1/s Z-Transf. K*Ts*z/(z - 1) with K := slope, Ts := SampleTime 
template<class T> 
class IntegratorEB{//Euler Backward 
public: 
///CTOR 
/// @brief Constructor 
IntegratorEB(const T& K) 
: Ts_(1.0), u_(0.0), y_(0.0), h_(K*Ts_), InitFlag_(true) {} 
///END_CTOR 

///ACCESS 
    /// @brief copy and save input u 
    void Input(const T& u){ 
     u_ = u; 
    } 

    //TODO First call should not change y_ 
    /// @brief calculate new output y 
    void Execute(){ 
     if(InitFlag){ 
      y_ = y_; //or do nothing... 
      InitFlag = false; 
     } 
     else 
      y_ = y_ + h_ * u_; // y[k] = y[k-1] + h * u[k]; 
    } 

    /// @brief read output, return copy 
    T Output() const{ 
     return y_; 
    } 
    /// @brief read output, return reference 
    const T& Output() const{ 
     return y_; 
    } 
///END_ACCESS 
private: 
    T Ts_; //SampleTime 
    T u_; //Input u[k] 
    T y_; //Output y[k] 
    T h_; //Stepsize 

    bool InitFlag_; 

}; 

Whished 사용

감사합니다 동일한 방식으로 각 알고리즘을 처리하십시오. execute의 첫 번째 호출은 Initstate를 제공합니다. 위에있는 예제는 작동합니다 (알고리즘 구조에 따라 다름). 내 수업 "IntegratorEB"가 아닙니다. (또는 단지 런타임 플래그를 묻는 질문과 함께!)

희망이 명확 할 것입니다.

+0

"NormalExecution"이란 무엇입니까? – wally

+1

"컴파일 시간"이 무슨 뜻인지 알지 못하는 경우, 첫 번째 호출이 무엇인지 알았다면'init'과'execute' 두 가지 방법을 사용하거나 생성자에서 초기화하고 init 플래그를 잊어 버리십시오. 냄새는 [xy 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 같습니다. 왜 이걸 필요하다고 생각하니? 호출 코드는 어떻게 생겼을까요? – user463035818

+0

"NormalExecution": = else 브랜치 – Oliver

답변

0
// All instances share the same "value" 
class foo { 
public: 
    float execute(){ 
     static float value = 0; 
     return value = value + 42; 
    } 
}; 


// Each instance has a separate "value" 
class bar { 
public: 
    bar() : value(0) {} 
    float execute(){ 
     return value = value + 42; 
    } 
private: 
    float value; 
};