2017-10-16 169 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到編譯時的方法嗎?沒有永久詢問國旗?

對此問題存在一個更好的「關鍵字」/「描述」?

感謝您的幫助

//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使用類

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

與其他算法的呼叫爲例:

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 
} 

我的問題: 我喜歡以相同的方式處理每個算法。首先調用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; 
};