조직 모드 바벨-대화식 코드 블록 평가


12

"cin"명령어를 포함하는 C ++의 조직 모드 소스 코드 블록을 평가하고 싶지만 평가하는 동안 대화 형 평가 (사용자 입력 포함)를 수행 할 수있는 방법을 찾을 수 없습니다. 코드 예 :

#+BEGIN_SRC C++  :results output :export code :tangle myfile.cpp 
#include <iostream>
using namespace std;

int main()
{
int a;
cin>>a;
cout<<a+1;
}
#+END_SRC

그러한 대화식 평가를하거나 시뮬레이션 할 수 있습니까 (소스 코드에 가짜 입력을 제공함으로써)?


실제로 대화 형이어야합니까, 아니면이 코드 블록이 아닌 이미 미리 알고있을 수있는 입력을 제공해야합니까? 두 번째 경우가 더 쉽습니다. :var varname=value헤더에서 사용할 수 있습니다 . 두 번째 경우에는 여전히을 사용할 수 :var있지만 가치 대신 입력을 요청하는 ELisp 함수가있는 다른 코드 블록을 사용하십시오.
wvxvw

귀하의 답변에 감사드립니다 @wvxvw; 내가하고 싶은 것은 학생들을위한 몇 가지 프로그램 예제가 포함 된 문서를 만드는 것이므로 소스 코드 블록을 "있는 그대로"유지하고 싶습니다. 그래서 제가 선호하는 것은 당신이 언급 한 두 번째 경우입니다. 귀하의 제안을 따르려고 노력할 것입니다 (: var 및 elisp 코드를 사용하여 입력 요청).
Lgen

죄송합니다. 약간의 오해가있었습니다. 두 번째 예제는 Emacs를 사용하여 입력을 읽지 만 Babel은 상호 작용을 허용하는 방식으로 C ++ 프로그램을 호출하지 않습니다. 내가 생각할 수있는 유일한 것은 코드에 "다형성 (polymorphic)"함수를 추가하면 두 가지 구현이 있습니다. 하나는 대화식으로 입력을 읽고 다른 하나는 파일에서 읽거나 코드 블록을 평가하는 동안 제공하는 것입니다 .
wvxvw

답변:


8

이처럼 :

#+begin_src C++ :results output :cmdline < in.txt
#include <iostream>
int main(int argc, char *argv[]) {
  int a;
  std::cin >> a;
  std::cout << a + 1;
  return 0;
}

#+end_src

#+RESULTS:
: 11

in.txtOrg 파일과 동일한 디렉토리에 contents를 사용 하여 파일 을 작성하십시오 10.


7

명명 된 elisp블록을 사용하는 대신 Emacs에 대화식 입력을 받도록 요청할 수 있습니다 . 그런 다음 수집 된 값을 다음 :var c-variable=block-name구문을 사용하여 C ++ souce 블록에 전달하십시오 .

#+name: input_block
#+BEGIN_SRC elisp :export none :results none
(completing-read "a=" nil)

#+END_SRC

#+BEGIN_SRC C++  :results output :export code :tangle myfile.cpp :var input=input_block
  #include <stdlib.h>
  #include <iostream>
  using namespace std;

  int main()
  {
  int a = atoi(input);
  cout<<a+1;
  }
#+END_SRC 

소스 블록의 출력은 문자열로 전달되므로 정수로 변환해야하므로 atoi및과를 추가해야 #include합니다.


1
당신이 원하는대로하십시오. 그러나 코드는 조직 모드에 바인딩되어 있으며 광산은 그대로 복사하여 붙여 넣고 쉽게 컴파일 할 수 있습니다.
abo-abo

1
이 기여에 대해 @erikstrokes에게 감사드립니다. 비슷한 아이디어가 있었으며 (외부 블록 사용) abo-abo 솔루션과 혼합되었습니다. 결과를 답변으로 게시했습니다.
Lgen

4

도움을 주신 @ abo-abo에게 감사드립니다. 나는 옳은 제안을 따랐으며 내 조직 파일 만 편집하고 자동으로 외부 입력 파일을 만들도록 조금 개선했습니다. 아이디어는 외부 코드 블록 (여기서 build_input_file이라는 bash 스크립트)을 작성하여 데이터 파일을 작성하고로 인해 다른 블록을 평가하기 전에 자동으로 호출하는 것 :var tmp=build_input_file입니다.

#+name: build_input_file
#+BEGIN_SRC bash  :results none :exports none 
echo "10 12" > in.txt
#+END_SRC

#+name: my_function_with_cin
#+BEGIN_SRC C++  :results output :exports both  :var tmp=build_input_file :cmdline < in.txt
#include <iostream>
using namespace std;

int main()
{
 int a,b;
 cin>>a>>b;
 cout<<a<<" "<<b;
}
#+END_SRC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.