0
    System.out.println(symbol_b.symbolName + "  " + symbol_b.pointsTo.size());

    // change the fieldpointsTo set of all above symbols
    for (int i = 0; i < samePointsTo.size(); i++) 
    {
        for (int j = 0; j < samePointsTo.elementAt(i).size(); j++) 
        {
            Symbol symbol = samePointsTo.elementAt(i).elementAt(j);
            System.out.println(symbol.symbolName);

            // if field information is already present
            if (symbol.fieldPointsTo.containsKey(fieldObj)) 
            {
                symbol.fieldPointsTo.get(fieldObj).clear();
                symbol.fieldPointsTo.get(fieldObj).addAll(symbol_b.pointsTo);
            } 
            else 
            {
                // we have to create field information
                symbol.fieldPointsTo.put(fieldObj, symbol_b.pointsTo);
            }
        }
    }

    System.out.println(symbol_b.symbolName + "  " + symbol_b.pointsTo.size());

forループの前のsymbol_b.pointsToのサイズは2ですが、 forループの直後にその値が2から0に変更されます。それがどのように起こっているのか、誰でも教えてくれます。symbol_b.pointsToには何もしていません。symbol_b.pointsToはベクトルです。

4

2 に答える 2

3

おそらく、pointsTo はその変数名によって参照されるだけでなく、symbol.fieldPointsTo.get(fieldObj) によって返される値でもあるため、.clear() を呼び出すと、ベクトルのすべての要素が削除されますか?

于 2013-03-15T18:45:13.370 に答える
1

次のような場合があります。

if (symbol.fieldPointsTo.containsKey(fieldObj)) 
{
    symbol.fieldPointsTo.get(fieldObj).clear();
    symbol.fieldPointsTo.get(fieldObj).addAll(symbol_b.pointsTo);
}

シンボル変数は を指していますがsymbol_bsymbol_bにないfieldPointsToので、それを呼び出しclear()ますか?

于 2013-03-15T18:46:10.150 に答える