2

コードのブロックを何度も実行する必要があるJavaメソッドがあります。

            // Obtengo los 7 bits de direccion
            clockStateIndex = dataStateIndex;
            for(int bit = 7; bit > 0; --bit){           
                clockStateIndex = clockSource.nextClearBit(clockStateIndex);                    // Siguiente bit en SCL
                clockStateIndex = clockSource.nextSetBit(clockStateIndex);
                testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    // Busco la mitad del bit clock
                bitSet(direccion, data.get(testIndex), bit);                // Compruebo SDA en la mitad del bit SCL
            }
            // Obttengo el bit R/W
            clockStateIndex = clockSource.nextClearBit(clockStateIndex);    // Siguiente bit en SCL
            clockStateIndex = clockSource.nextSetBit(clockStateIndex);
            testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    // Busco la mitad del bit clock
            rwBit = data.get(testIndex);        // Obtengo el estado del bit R/W en el medio del bit SCL

            // Obtengo el bit de ACK
            clockStateIndex = clockSource.nextClearBit(clockStateIndex);    // Siguiente bit en SCL
            clockStateIndex = clockSource.nextSetBit(clockStateIndex);
            testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    // Busco la mitad del bit clock
            ackBit = data.get(testIndex);       // Obtengo el estado del bit R/W en el medio del bit SCL

            // Si tengo un ACK obtengo los 8 bits de dato
            if(ackBit == false){
                for(int bit = 8; bit > 0; --bit){           
                    clockStateIndex = clockSource.nextClearBit(clockStateIndex);    
                    clockStateIndex = clockSource.nextSetBit(clockStateIndex);
                    testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    
                    bitSet(i2cData, data.get(testIndex), bit);      
                }
            }

あなたがコードを見ることができるように:

clockStateIndex = clockSource.nextClearBit(clockStateIndex);    
clockStateIndex = clockSource.nextSetBit(clockStateIndex);
testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    

何度も繰り返されます。nextBit();のようなコードを単純化するために#definesを作成することはできません。そのコードを置き換えます。それを単純化する他の方法はありますか?メソッドを作成する場合、サイズが約200要素の2つのBitSetを渡し、2つのint要素を返す必要があります(Cのようなポインターがないため、Javaでそれを行うのがホットかどうかはわかりません)

あなたが私を助けることができることを願っています:)

4

2 に答える 2

3

私はそれを関数でラップします:

// Instance based (inside classes)
{SCOPE MODIFIER} void ClockWork()
{
    clockStateIndex = clockSource.nextClearBit(clockStateIndex);    
    clockStateIndex = clockSource.nextSetBit(clockStateIndex);
    testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex) / 2;  
}

静的ベースのメソッドに関しては、コードを実装する場所によって異なります。

于 2012-06-01T03:30:54.413 に答える
-1

最も簡単な解決策は、この操作のためのオブジェクトを作成することです:

class ClockState {
    private int clearBit;
    private int setBit;
    private int testIndex;

    public ClockState( int clearBit, int setBit, int testIndex ) {
        this.clearBit = clearBit;
        this.setBit = setBit;
        this.testIndex = testIndex;
    }

    public int getClearBit() { return this.clearBit; }
    public int getSetBit() { return this.setBit; }
    public int getTestIndex { return this.textIndex; }

    public static ClockState create( ClockSource clockSource, int clockStateIndex ) {
      int clearBit = clockSource.nextClearBit(clockStateIndex);    
      int setBit = clockSource.nextSetBit(clearBit);
      int testIndex = (clockSource.nextClearBit(setBit) - setBit)/2; 
      return new ClockState( clearBit, setBit, testIndex );
    }

}

コードは次のようになります。

        clockStateIndex = dataStateIndex;
        for(int bit = 7; bit > 0; --bit){           
            ClockState state = ClockState.create( clockSource, clockStateIndex );
            clockStateIndex = state.getSetBit();
            bitSet(direccion, data.get(state.getTestIndex()), bit);
        }

他のすべての呼び出しについても同様です。

于 2012-06-01T03:39:03.530 に答える