2016-08-26 1 views
1

저는 d를 배우려고 노력 중이므로 hello world에서 시작하여 조금 더 확장하려고했습니다.메서드 호출 순서가 뒤섞입니다.

import std.stdio; 
import core.thread; 

void main(string[] args){ 
    writeln("Hello World!"); 
    Thread.sleep(dur!("seconds")(5)); 
    writeln("Press enter key to exit..."); 
    writeln(readln()); 
} 

그래서 난 내 출력은 다음과

Hello World! 
Press enter key to exit... 
//input "abcd" 
abcd 

될 것으로 기대하지만, 대신에 나는이

//input "abcd" 
Hello World! 
Press enter key to exit.... 
abcd 

슬립 기능도 생략됩니다 얻는다. 무슨 일입니까?

+0

정상적으로 작동합니다. 어떤 버전의 컴파일러를 사용합니까? 이 코드를 빌드하고 실행하는 방법은 무엇입니까? – Kozzi11

+0

gdc --version은 버전 5.4.0 20160609라고 말합니다. 저는 x86_64 용으로 --build-mode를 별도로 컴파일합니다. – blipman17

답변

6

자주 묻는 질문입니다. 제목을 읽었을 때 IDE가 표시되고 태그가 붙을 것으로 예상되므로 예! 링크 할 오래된 답변을 찾을 수 없지만 출력이 부족하고 잠자기가 발생하면 IDE 파이프로 버퍼링되고 끝날 때까지 볼 수 없습니다.

추가하면 출력 볼 수 stdout.flush(); 바로 readln 이전 및/또는 오른쪽 첫 번째 writeln 후 - 다른 작업을 수행하기 전에 화면으로 이동하기 위해 버퍼를 강제로.

일반 콘솔 출력은 자동으로 라인에서 플러시되지만 IDE는 파이프로 간주됩니다. 프로그램은 사용자가 아닌 다른 프로그램과 대화하므로 사용자가 볼 수있는 행 대신 데이터 블록으로 버퍼링 할 수 있다고 생각합니다.

+0

나는 견과류가 될 것이라고 생각했습니다. * writeln()이라고 부르기 때문에 버퍼가 아닐 것으로 예상했다. (이 함수를 사용할 때 분명히 한 줄을 쓰고 싶다.) 나는 이것을 어떻게 놓칠 수 있을지 모른다. – blipman17

+0

예, 우리는 writeln 호출을 플러시하는 것을 고려해 봤지만, 파이프 또는 다른 파일과 정상적으로 대화 할 때 버퍼링이 큰 성능 향상을 제공하므로 대부분의 경우 올바른 작업을 수행하고 있습니다 ... IDE가 그들이 도서관에있는 것처럼 보이지 않습니다. –

+0

나는 플러시가 내장 된 버전과없는 버전의 두 가지 버전을 만들기 위해 제안했다. 내가 물어볼 수 있다면, 그렇게하지 않는 이유는 무엇이며 대신 이것을해야합니까? – blipman17