2013-02-02 3 views
1

FORTH를 사용 해본 사람이라면 누구나 쉽게 알 수 있습니다. 그러나이 언어를 코딩하는 방법을 배우려는 초보자입니다. C++과 많이 다릅니다.변수에 대한 사용자 입력 허용

어쨌든 "높이"라는 FORTH 변수를 만들려고하고 있는데 특정 단어 "setHeight"가 호출 될 때마다 사용자가 "높이"값을 입력 할 수있게하려고합니다. 그러나 변수를 설정하는 방법이나 사용자 입력을 가져 와서 변수에 넣는 방법을 모르기 때문에 내가 시도하는 모든 것이 실패하는 것으로 보입니다.

VARIABLE Height 5 ALLOT 
    : setHeight 5 ACCEPT ATOI CR ; 

이 문제가 쉽게 해결되어 도움이 되었기를 바랍니다. 미리 감사드립니다.

답변

2

string or number input in FORTH에 대한 Rosettacode 입력/출력 예제를 살펴 보자 :

문자열 입력

: INPUT$ (n -- addr n) 
    PAD SWAP ACCEPT 
    PAD SWAP ; 

번호 입력

: INPUT# (-- u true | false) 
    0. 16 INPUT$ DUP >R 
    >NUMBER NIP NIP 
    R> <> DUP 0= IF NIP THEN ; 
0

큰 점을 자기에 대한 기억 - 정교화 - C++는 많이 타입 변환되어 있으며, Forth는 공동 맞은 편의 mplete. Height를 문자열, 정수 또는 부동 소수로 지정하고 서명되었거나 서명되지 않았습니까? 각각은 자체 유스 케이스를 가지고 있습니다. 선택한 값에 상관없이 Height 변수를 마음에두고 선택한 유형으로 상호 작용해야합니다. 귀하의 비트가 매번 의미하는 바를 생각하십시오.

ATOI 호출로 판단 할 때 높이 값을 정수로 가정한다고 가정합니다. 하지만 5 바이트 정수는 이상한 일이 아니므로 여전히 확실하지 않습니다. 그러나 여기에 가정하에 진행됩니다 세포가 전화

VARIABLE Height 1 CELLS ALLOT 
VARIABLE StrBuffer 7 ALLOT 

: setHeight (--) 
    StrBuffer 8 ACCEPT 
    DECIMAL ATOI Height ! ; 

당신이 당신의 CPU가 선호하는 비트 수의 변수를 만들 확인합니다. DECIMAL 호출은 ATOI 이전의 길을 따라 어딘가에서 16 진수로 변경하지 않았는지 확인합니다.

StrBuffer 변수를 만드는 것은 문자열에 스크래치 공간을 확보하는 여러 가지 방법 중 하나입니다. CELL이 16 비트라고 가정하면 영숫자 16 비트 부호있는 정수 (예 : "-32767 \ 0")의 경우 최대 7자를 필요로합니다. 일부 구현에는 자체 버퍼를 만드는 대신 PAD가 사용될 수 있습니다. 또 다른 일반적인 단어는 SCRATCH이지만, 나는 그것이 우리가 원하는 방식으로 작동한다고 생각하지 않습니다.

개인적으로 얼마나 많은 공간을 확보했는지 알고 있기 때문에 개인적으로 좋아하는 자신의 문자열 버퍼 공간을 고수한다면 모든 단어의 문자열 처리 요구에 대해 하나의 큰 버퍼를 만드는 것을 고려하십시오. 예를 들어 :이 또한 200 개 문자로, 16 비트 CELL의 가정을 할 필요에서 당신을 유지

VARIABLE StrBuffer 201 ALLOT 

쉽게 구현의 CELL의 현재 크기 나까지 날 경우, 64 비트 정수를 수용 도로.

+0

PAD는 CORE 단어 세트의 표준 단어이므로 모든 표준 Forth는 PAD가 필요합니다. PAD는 이런 종류의 임시 버퍼로 사용되기 때문에이 것을위한 자체 버퍼를 만들지는 모르겠다. –

+0

@MichaelMorris 컴파일 된 응용 프로그램으로 실행되도록 설계된 임베디드 응용 프로그램에서는 PAD가있을 수 있지만 작동하지 않을 수 있습니다. 예를 들어, 컴파일 된 사전은 장치가 제공 될 때 플래시 메모리에 하드 디스크에 기록되며 사용자에게는 결코 대화 형이 아닙니다.PAD는 종종 사전 상단을 사용하여 구현되지만 플래시에 쓸 수있는 지원이 없으면 PAD에 쓰기가 실패합니다. 또한 FWIW는 CORE가 아니라 CORE EXT의 일부입니다. – CivFan

관련 문제