0

解決した人には報奨金を提供します。解決策を投稿して金額について話し合う前に、まず私に連絡してください。

私がやりたいことは、param.result をチェックするループを持つことです。stepping_isProbablePrime に対して非同期呼び出しが行われています。これは、checkPrime 関数の戻り値で使用する close to me を返します。ただし、この関数を呼び出した後、結果にアクセスする方法がわかりません。ループ中に素数性をチェックするために保持したいと思います。結果にアクセスしようとするたびに、結果は null または不明です。

var findPrime = function(checkPrime, result)
{
    var inParam = null; 
    var prime = new BigInteger("7", 10);

    checkPrime(prime, result);
    alert(inParam);
}

var result = function(param1)
{
    inParam = param1
    return param1;
}

var checkPrime = function(p2,result)
{
    var inParam = null;
    var closure= p2.stepping_isProbablePrime(5);
    var receiver = function(scope,param,subparam) 
    {
        result( param.result );
        return BREAK;
    };
    return ( [ closure, receiver, EXIT ] ).ready().frequency(1).timeout(1).go();
};

var timerID = findPrime(checkPrime, result);
}

以下は、stepping_isProbablePrime(t) メソッド呼び出しです。

BigInteger.prototype.stepping_isProbablePrime = function (t) {
BigInteger.log( "stepping_isProbablePrime:create" );
var self = this;
var x = self.abs();
var et1 = ElapsedTime.create();
var et2 = ElapsedTime.create();
return [
    function(scope,param,subparam) {
    BigInteger.log("stepping_isProbablePrime No.1: " );

    et1.start( "stepping_isProbablePrime" );

    var i;
    if( x.t == 1 && x[0] <= lowprimes[ lowprimes.length-1 ] ) {
        for ( i = 0; i < lowprimes.length; ++i )
        if ( x[0] == lowprimes[i] ) {
            BigInteger.log( "stepping_isProbablePrime.1 EXIT" );
            //return true;
            param.result = true;
            return EXIT;
        }
        BigInteger.log( "stepping_isProbablePrime.2 EXIT" );
        // return false;
        param.result = false;
        return EXIT;
    }

    if ( x.isEven() ) {
        BigInteger.log( "stepping_isProbablePrime.3 EXIT" );
        // return false;
        param.result = false;
        return EXIT;
    }

    i = 1;
    while ( i < lowprimes.length ) {
        var m = lowprimes[i];
        var j = i+1;
        while( j < lowprimes.length && m < lplim ) {
        m *= lowprimes[j++];
        }

        m = x.modInt(m);
        while( i < j ) {
        if( m % lowprimes[i++] == 0 ) {
            BigInteger.log( "stepping_isProbablePrime:4 EXIT" );
            // return false;
            param.result = false;
            return EXIT;
        }
        }
    }

    BigInteger.log( "stepping_isProbablePrime:5 BREAK" );
    return BREAK;
    },

    // // ver1>>
    // function(scope,param,subparam) {
    //  BigInteger.log("stepping_isProbablePrime No.2:called:" + param.result );
    //  // return x.millerRabin(t);
    //  et2.start("isProbablePrime.millerRabin");
    //  var result = x.millerRabin(t);
    //  et2.stop();
    //  et1.stop();
    //  param.result = result;
    //  return BREAK;
    // },
    // // ver1<<

    // ver2>>
    function(scope,param,subparam) {
    BigInteger.log( "stepping_isProbablePrime No.2: calling millerRabin : subparam.result=" + subparam.result );
    et2.start("isProbablePrime.millerRabin");
    subparam.result=null;
    return x.stepping_millerRabin(t).BREAK();
    },
    function(scope,param,subparam) {
    BigInteger.log( "stepping_isProbablePrime No.3: returning millerRabin : subparam.result=" + subparam.result );
    et2.stop();
    et1.stop();
    param.result = subparam.result;
    BigInteger.log( "stepping_isProbablePrime No.3: param.result=" + param.result );
    return BREAK;
    },
    // ver2<<
    EXIT
].NAME("stepping_isProbablePrime");
};
4

1 に答える 1

0

私はあなたのコードに従ったと断言することはできませんが、差し迫った問題は、「inParam」という名前の 3 つの異なる変数があることだと思います: グローバル変数、findPrime のローカル変数、checkPrime のローカル変数です。結果関数が inParam の値を設定するときは、グローバルなものを設定していますが、findPrime が inParam を使用するときは、そのローカル変数を使用しています。

ただし、データフローにグローバル変数を使用することは、通常はお勧めできません。無害に見える方法で物事が重なると失敗する脆弱なコードを作成する傾向があります。戻り値を使用する方法を見つけたほうがよいでしょう。または、それを管理できない場合は、コールバックまたは出力パラメーター。

于 2013-01-17T17:04:37.457 に答える