我正在尝试编写一个模拟简单系统的程序。用户添加修改信号的块,程序“通过块运行信号”。我想写它,因此它模拟一个真实的系统,我正在研究这个解决方案,但我真的不知道如何做到这一点: 我的信号类中有多个“块”函数,例如:
float sygnal::Wzmocnienie(float p, float q){
p=p*q;
return p;
}
这是用于放大的例子。它接受值并通过传递给函数的值放大它。现在我要做的是创建一个函数,首先将正确的函数添加到std :: list,如下所示:
list<float> OpcjeProgramu(list<float> opcje, int argc, char *argv[], sygnal syg){
double p=0;
typedef float(sygnal::*funkcja)(float,float);
funkcja f;
for(int i=0; i<argc; i++){
if(strcmp(argv[i],"-G")==0){
f=&sygnal::Potegowanie;
opcje.push_back((syg.*f)(syg.u,0));
}
然后是一个执行两个循环中所有块的函数,如下所示:(rozmiar表示必须修改的数字量)
for(int j=1; j<rozmiar; j+=2){
u=dane[j];
for(i=lista.begin(); i!=lista.end(); i++){
//function to modify signal should be here
}
}
我真的不知道如何制作一个函数列表,然后如何调用这些函数 - 我制作了一个浮点列表,并意识到它只返回值,并且在我需要它时不执行函数。
答案 0 :(得分:0)
您可能希望将块表示为类。这样,您可以轻松地将功能块的输出存储在块本身内,或者如果块的整个输入历史记录更复杂。您还可以将块的输出历史存储在您可能感兴趣的区域内,例如:检查链中途的整个信号。
它还允许您轻松地创建一个列表(或者,如下面的示例中的一个向量),指向派生类实例的基类指针。
类似的东西:
class base {
public:
struct param { float p, q; };
virtual void input(param const & p) = 0;
virtual param const & output() const = 0;
}
class amplify : public base {
public:
amplify(float const factor_) : factor(factor_) { out.p = out.q = 0.0 }
void input(param const & p) {
out.p = p.p * amp;
out.q = p.q * amp;
}
param const & output() const { return out; }
private:
param out;
float amp;
}
class system {
public:
typedef std::vector<base *> blockchain;
typedef std::vector<base::param> signal;
void add_block(base * const block) { blocks.push_back(block); }
void run(signal const & in, signal & out) {
for(size_t iidx = 0; iidx < in.size(); ++iidx) {
if(blocks.size() > 0) { blocks[0]->input(in[iidx]); }
for(size_t bidx = 1; bidx < blocks.size(); ++bidx) {
blocks[bidx]->input(blocks[bidx-1]->output());
}
if(blocks.size() > 0) { out.push_back(blocks[blocks.size()-1]->output(); }
}
}
private:
blockchain blocks;
}