【问题标题】:Mccluskey algorithm, javascriptMccluskey 算法,javascript
【发布时间】:2012-05-07 23:30:24
【问题描述】:
<html>
<body>

<script type="text/javascript">
start();

function start() {

    var val = "0,1";

    var n = 5;

    var chars = ['a', 'b', 'c', 'd', 'e'];

    gVars = chars.slice(0, n);

    for (var i = 0; i < gVars.length; i++)

    document.write(gVars[i] + "<br />");

    var termsStr = val.split(',');

    for (var i = 0; i < termsStr.length; i++)

    document.write(termsStr[i] + "<br />");

    var gOrigTerms = [];

    var maxterm = Math.pow(2, termsStr.length) - 1;

    document.write("maxterm: " + maxterm + "<br />");

    for (var i = 0; i < termsStr.length; i++) {
        gOrigTerms[i] = parseInt(termsStr[i]);
        document.write(gOrigTerms[i] + "<br />");
        if (gOrigTerms[i] > maxterm) document.write("Invalid term in term list." + "<br />");
    }

    gFormula = new Formula(gVars, gOrigTerms);

    document.write(gFormula);

    gFormula.toString();

    gFormula.reduceToPrimeImplicants(); //here the breakpoint is inserted
}


function Formula(vars, terms)

{

    this.vars = vars;

    this.termList = [];

    for (var i = 0; i < terms.length; i++) {
        this.termList[i] = new Term(Dec2Bin(terms[i], vars.length));
        document.write("this.termList" + this.termList[i] + "<br />");
    }
    this.orginalTermList = [];
    document.write("this.orginalTermList" + this.orginalTermList + "<br />");
}

function Dec2Bin(dec, size) {
    var bits = [];

    for (var bit = 0; bit < size; bit++)

    {
        bits[bit] = 0;
    }

    var i = 0;

    while (dec > 0)

    {
        if (dec % 2 == 0)

        {
            bits[i] = 0;
        } else

        {
            bits[i] = 1;
        }


        i++;

        dec = (dec / 2) | 0;

        // Or with zero casts result to int (who knows why...) 
    }

    bits.reverse();
    return bits;

}


function Term(varVals)

{
    this.varVals = varVals;
    document.write("this.varVals: " + this.varVals);

}

function reduceToPrimeImplicants() //there is some problem with this function
{

    this.originalTermList = this.termList.slice(0);

    var numVars = this.termList[0].getNumVars();

    var table = [];

    for (var dontKnows = 0; dontKnows <= numVars; dontKnows++) {
        table[dontKnows] = [];
        for (var ones = 0; ones <= numVars; ones++) {
            table[dontKnows][ones] = [];
        }
        table[dontKnows][numVars + 1] = [];
    }


    table[numVars + 1] = [];

    table[numVars + 1][numVars + 1] = [];

    for (var i = 0; i < this.termList.length; i++) {
        var dontCares = this.termList[i].countValues(DontCare);
        var ones = this.termList[i].countValues(1);
        var len = table[dontCares][ones].length;
        table[dontCares][ones][len] = this.termList[i];
    }



    for (var dontKnows = 0; dontKnows <= numVars - 1; dontKnows++) {
        for (var ones = 0; ones <= numVars - 1; ones++) {
            var left = table[dontKnows][ones];
            var right = table[dontKnows][ones + 1];
            var out = table[dontKnows + 1][ones];

            for (var leftIdx = 0; leftIdx < left.length; leftIdx++) {
                for (var rightIdx = 0; rightIdx < right.length; rightIdx++) {
                    var combined = left[leftIdx].combine(right[rightIdx]);

                    if (combined != null) {
                        if (out.indexOf(combined) < 0) {
                            var len = out.length;
                            out[len] = combined;
                        }
                        if (this.termList.indexOf(left[leftIdx]) >= 0) {
                            this.termList.splice(this.termList.indexOf(left[leftIdx]), 1);
                        }
                        if (this.termList.indexOf(right[rightIdx]) >= 0) {
                            this.termList.splice(this.termList.indexOf(right[rightIdx]), 1);
                        }
                        if (this.termList.indexOf(combined) < 0) {

                            var len = this.termList.length;
                            this.termList[len] = combined;
                        }
                    }
                }
            }
        }
    }
}

function getNumVars()

{
    return this.varVals.length;
}


function countValues(value)

{
    result = 0;
    for (var i = 0; i < this.varVals.length; i++) {
        if (this.varVals[i] == value) {
            result++;
        }
    }

    return result;
}


function combine(term)

{
    var diffVarNum = -1; // The position where they differ 
    for (var i = 0; i < this.varVals.length; i++) {
        {
            if (this.varVals[i] != term.varVals[i])

            if (diffVarNum == -1) {
                diffVarNum = i;
            } else { // They're different in at least two places return null; } 
            }
        }

        if (diffVarNum == -1)

        {
            // They're identical return null; 
        }

        resultVars = this.varVals.slice(0);

        resultVars[diffVarNum] = DontCare;

        return new Term(resultVars);

    }
</script>

</body>
</html>

在上面的代码中,这并不完整,但它实现了quine Mccluskey算法。调试时出现问题。

如果在gFormula.reducetoPrimeImplicants(); 处插入断点,则调试器不会进入该函数。这是到目前为止代码中调用的最后一个函数。但是,它确实转到start(),这是第一个函数。

reducetoPrimeImplicants(); 函数存在一些问题,因为它在 Internet Explorer 中也会出现错误。

我无法找出错误。如果我从代码中删除 reducetoPrimeImplicants(); 函数,则工作正常。

请有人告诉我为什么调试器没有输入reducetoPrimeImplicants();

我正在使用 Firebug 调试器。

提前致谢。

【问题讨论】:

  • 一堵代码墙不是一个好的问候。请将代码最小化到相关部分。
  • IE返回的错误是什么?哪条线路和消息?
  • 您也可以尝试通过 jslint 运行它。那里有一些非常严重的语法错误......

标签: javascript debugging


【解决方案1】:

您页面中的最后一个函数combine() 缺少右大括号。

如果您不介意,给个建议:请使用http://jsbeautifier.org/ 或其他类似工具更好地缩进您的代码。

【讨论】:

    【解决方案2】:

    您的For loop 有两个起始大括号。

     for (var i = 0; i < this.varVals.length; i++) {
            {
    

    所以删除一个。这应该可以解决您的问题。

    【讨论】:

    • 我尝试了所有建议,但它们不起作用。问题在于调用 reducetoprimeimplicant 函数或函数的开头,因为如果我从该函数中删除除第一行之外的所有代码,this.originalTermList = this.termList.slice(0);调试器仍然没有进入 reducetoprimeimplicant()
    • 一些代码。 . . . . . . gFormula.reduceToPrimeImplicants(); //此处插入断点。 . . . . . . . function reduceToPrimeImplicants() // 为什么它甚至不能只在其中一行工作? { //var j=10; this.orginalTermList = this.termList.slice(0);我尝试了很多,但它仍然无法正常工作,即使代码中只有一行。我是否以错误的方式调用函数???对不起,我不得不这样写,因为我无法回答我自己的帖子
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 2013-09-19
    • 2012-07-30
    • 1970-01-01
    • 2012-02-29
    相关资源
    最近更新 更多