首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#动态逻辑门

C#动态逻辑门
EN

Stack Overflow用户
提问于 2012-11-23 08:41:45
回答 3查看 3.2K关注 0票数 1

我正在做一个程序,将允许用户从虚拟逻辑门建立数字电路。每个gate都是一个代表特定gate类型的类的实例,例如,下面是和类的外观:

代码语言:javascript
复制
public class andgate
{
    public andgate()
    {
        inputs = new bool[7];
        for (int i = 0; i < 7; i++) inputs[i] = true;
        output = (inputs[0] && inputs[1] && inputs[2] && inputs[3] && inputs[4] && inputs[5] && inputs[6]);
    }
    public bool[] inputs;
    public bool output;
}

每个门都有七个输入端,但并不是所有的输入端都要用到(也就是说,对于一个有三个输入端的门,剩下的四个输入端就是"1“,这是AND的中性元素)。每个输入是对另一个门的输出或对布尔数组(其存储输入向量)的元素的引用,以便由一个门自动生成的信号被发送到下一个门。问题是,我还需要信号在门内动态传输,即,如果AND门中的一个输入信号设置为0,则输出自动为0。因此,当您将一个二进制向量馈送到电路的输入时,它会改变电路的输出值。或者,也许有一种比从单个门构建电路更简单的方法来模拟电路?我需要它来生成测试模式。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-23 08:55:16

output属性设为只读:

代码语言:javascript
复制
public bool output
{
    get
    {
        return inputs.All(i => i);
    }
}

不需要ANDing所有的输入,只需检查是否有任何输入是假的。

当然,您必须在构造函数中删除对output的赋值。这应该使您的output属性“动态”。

您可能还希望将输入更改为bool?[],以便null值表示没有信号。然后,您必须将输入数组的初始化删除为all true,并将输出返回更改为:

代码语言:javascript
复制
return inputs.All(i => i.GetValueOrDefault(true));

在评论中使用Tim S的建议进行编辑

票数 4
EN

Stack Overflow用户

发布于 2012-11-23 09:00:38

为此,您应该使用属性来设置/获取输入,因为您可以在属性中执行额外的计算。你持有的状态变量应该是私有的。

代码语言:javascript
复制
public bool[] Inputs {
    set {
        inputs = value;
    }
}

public bool Output {
    get {
        return inputs[0] && inputs[1] ...
    }
}

对于Inputs属性,我会避免这样做,因为公开数组实际上暴露了有关类如何存储内容的信息,为了更好的OOP,应该尽可能避免这样做。例如,ReadOnlyCollection可能更适合。

然而,我会在总体上重新考虑设计,并避免一些随意的#输入,7.你是从哪里得到这个值的?

一种更简单的方法是假设一个门有两个值-A和B,您可以在构造函数或单个属性中为其设置值。

然后,你可以利用二进制逻辑门上的操作是关联的,所以一个AND门接受a,b,c,等同于一个接受a,b的门,将它的输出提供给另一个同样接受c的门。这就是你在实践中构建电路的方式-尽管你需要考虑的是门的延迟。

票数 0
EN

Stack Overflow用户

发布于 2012-11-23 09:03:47

听起来你应该将事件添加到门中,这样当它们的状态改变时,它们就能够通知依赖对象;类似这样:

代码语言:javascript
复制
public class AndGate
{

    private bool[] inputs;
    private bool output;

    public bool[] Inputs 
    {
        get
        {
            return this.inputs;
        }
        set
        {
            this.inputs = value; 
            UpdateOutput();     
        }
    }
    public bool Output
    {
        get
        {
            return this.output;
        }
    }

    public AndGate()
    {
        inputs = new bool[7];
        for (int i = 0; i < 7; i++) inputs[i] = true;
        UpdateOutput();
    }

    private void UpdateOutput()
    {
        bool original = output;
        output = true;
        for(int i=0; i<inputs.Length; i++)
        {
            output = output && inputs[i];
        }
        if (original != output)
        {
            OnChanged(EventArgs.Empty);
        }
    }

    public event GateStateChangedEventHandler StateChanged;  
    protected virtual void OnChanged(EventArgs e) 
    {
        if (StateChanged != null) 
        {
            StateChanged(this, e);
        }
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13521837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档