2015-05-26 77 views
-4

我正在使用Java作爲國際象棋的前端AI我正在寫。 Java處理所有圖形,然後使用幾個命令行參數執行一些C語言。有時C將永遠不會完成,並且不會回到Java。我找到了發生這種情況的案例,並用.exe和java來測試它們。當我拿出java時,這些情況每次都有效。我不確定該從哪裏出發。下面是一些代碼,我認爲是初步認識,以及整個項目作爲https://github.com/AndyGrant/JChess從Java執行C奇怪的錯誤

try{ 
    Process engine = Runtime.getRuntime().exec(buildCommandLineExecuteString(lastMove)); 
    engine.waitFor(); 
    int AImoveIndex = engine.exitValue(); 

    String line; 
    BufferedReader input = new BufferedReader(new InputStreamReader(engine.getInputStream())); 
    while ((line = input.readLine()) != null) 
     System.out.println(line); 
    input.close(); 

    if (AImoveIndex == -1){ 
     activeGame = false; 
     System.out.println("Fatal Error"); 
     while (true){ 

     } 
    } 

    else{ 
     JMove AIMove = JChessEngine.getAllValid(types,colors,moved,lastMove,!gameTurn).get(AImoveIndex); 
     AIMove.makeMove(types,colors,moved); 
     lastMove = AIMove; 
     validMoves = JChessEngine.getAllValid(types,colors,moved,lastMove,gameTurn); 
    } 

    waitingOnComputer = false; 
    parent.repaint(); 
} 

catch(Exception e){ 
    e.printStackTrace(); 
} 
+1

無法分辨您發佈的內容。不願意通讀該項目。 – duffymo

+0

我在使用java的RunTime執行C程序時正在尋找可能的錯誤。 – AndrewGrant

+0

如果「C永遠不會完成」,你能證明你的C代碼不會陷入某個無限循環嗎?如果你在C程序返回的'main'函數之前放置'print'語句,是否打印?僅僅因爲你手動給C程序提供了正確的輸入並且它終止了並不意味着C程序應該在與Java程序集成時終止。例如,您的Java程序可能會錯誤地格式化輸入。我不會馬上說,你在使用Runtime時會出現一些奇怪的錯誤。 – user2570465

回答

2

有時,外部進程會卡在IO上,試圖寫入控制檯。如果控制檯緩衝區已滿,則下一個printf將被阻止。

它向控制檯寫入多少文本?

嘗試移動你的engine.waitFor()之後的部分,你閱讀它的所有輸入。

另一種方法是將外部進程寫入臨時文件,然後讀取臨時文件。

+0

這是正確的答案,對於遲到的回覆感到抱歉。 – AndrewGrant

0

也許去除

while (true){ 

} 

如果您AImoveIndex == -1,你的程序將在永無止境的循環進入。

+0

我在該無限循環之前有一個打印語句表示問題。 – AndrewGrant