2015-10-18 86 views
0

我在課堂上發現了這個奇怪的錯誤。我有這個IRNode類,我有3個字符串:op1,op2和op3。當我將它們打印出來之前,將它們分配給不同的字符串,然後將它們打印出來給出不同的值。它將它們存儲爲null。返回錯誤值的方法

輸出的打印語句是這樣的:

OP1: 20, OP2: a, OP3: null 

;STOREI 

,而應該是:

OP1: 20, OP2: a, OP3: null 

;STOREI 20 a 

我的代碼:

public IRNode (String op, String o1, String o2, String o3) { 

    opcode = op; 
    op1 = o1; 
    op2 = o2; 
    op3 = o3; 
    //IRNodeNext = null; 

} 

public void printIR() { 
    System.out.format("OP1: %s, OP2: %s, OP3: %s\n",op1, op2,op3); 
    String o1 = this.op1; 
    String o2 = this.op2; 
    String o3 = this.op3; 
    System.out.print(";"+opcode); 
    if (o1 != null) System.out.format(" ",o1); 
    if (o2 != null) System.out.format(" ",o2); 
    if (o3 != null) System.out.format(" ",o3); 
    System.out.format("\n"); 
} 

PS。這是我的編譯器項目。這是在創建AST和IRNode列表之後。

*****編輯****** 實際上發現這是一個愚蠢的錯誤。但我現在正面臨另一個奇怪的錯誤。

op1 = thisNode.returnOP1(); 
op2 = thisNode.returnOP2(); 
op3 = thisNode.returnOP3(); 

在這裏,我得到OP1,OP2和OP3像前面。在返回時,我檢查了一下,我返回了正確的值。 例如, 對於STOREI 20 我返回OP1 = 20和OP2 =一個

但是當我只是那些3行代碼之後接收它,我收到錯誤的值。我得到op1 = 20,op2 = $ s,op3 = a

爲什麼會發生這種情況?

+0

這是什麼意思,「在將它們分配給不同的字符串之前,然後將它們打印出來給出不同的值,並將它們存儲爲空。」?我在這裏可以看到的唯一問題是你有''''''%s'''應該可能在哪裏。也許? – nihilon

+0

編輯應該是一個新問題,因爲原來的問題得到了回答。老實說,考慮你的第一個問題是什麼,如果這個問題是另一個類似的錯誤,我不會感到驚訝。我不會把它稱爲你做的,只是爲了禮貌。什麼是'returnOP'方法的代碼?它看起來不像'returnOP2()'或'returnOP3()'返回你期望它們返回的內容。 – nihilon

+0

嘿你是對的。這是一個類似的錯誤,由於打印聲明,我得到了錯誤的值。在我的returnOP函數中,我只是返回相應的OP字符串。 – Aditya

回答

3

我在這個例子中看到的唯一問題是:

if (o1 != null) System.out.format(" ",o1); 

每條這樣的線應該有一個空字符串%s

if (o1 != null) System.out.format(" %s",o1); 
if (o2 != null) System.out.format(" %s",o2); 
if (o3 != null) System.out.format(" %s",o3); 

沒有它,你不會打印任何東西。

輸出:

OP1: 20, OP2: a, OP3: null 
;STOREI 20 a 

您可能還需要考慮這一點:

System.out.format("%n"); 

而不是使用\n,用%n在您的格式化的字符串換行。它是平臺不可知的。

*****編輯******其實發現這是一個愚蠢的錯誤。但我現在正面臨另一個奇怪的錯誤。

op1 = thisNode.returnOP1(); op2 = thisNode.returnOP2(); op3 = thisNode.returnOP3();在這裏,我得到op1,op2和op3像早些時候。當 返回時,我檢查了,我正在返回正確的值。例如, 對於STOREI 20 a,我正在返回op1 = 20和op2 = a

但是當我在這3行代碼後面接收它時,我 出現錯誤的值。我得到op1 = 20,op2 = $ s,op3 = a

爲什麼會發生這種情況?

沒有你的returnOP方法的代碼,很難說,但基於前面的問題,我敢打賭,問題是相似的。

鑑於此:

public String returnOP1() { return op1; } 
public String returnOP2() { return op2; } 
public String returnOP3() { return op3; } 

而且這樣的:

System.out.println(irNode.returnOP1()); 
    System.out.println(irNode.returnOP2()); 
    System.out.println(irNode.returnOP3()); 

我得到這個:

20 
a 
null 

這告訴我,對於你,returnOP2()寫入返回$s代替的op2op2正被設置爲$sreturnOP3()被寫爲返回op2

但沒有代碼,就沒有辦法確定。