2015-01-28 3 views
3

나는 TCL에 좀 새로운 해요하지만이처럼 보이는 시저를 작성해야 :

proc TestVerb { Data Data_txt } { 
VERBATIM [format "// Data: $Data - $Data_txt"] 
if { $argc == 2} { 
    VERBATIM {// SUCCESS //} 
else { 
    exit 1 
} 

나는 호출이 같은 PROC : TestVerb Switch"This is used for..."

발동 효과 다른 파일에 있고 proc 호출이 다른 파일에 있습니다. 내가 $argc를 사용하지 않는 경우 내가 원하는 출력을 얻을 때문에 그들은 제대로 공급 보이지만 나도 $argv 또는 $argc를 사용하면 나는 다음과 같은 컴파일 오류 : 읽을 수 없습니다 $argv/$argc 이러한 변수

없는 나는이 변수를 참조하는 경우 $::argc$::argv 결과가 올바르지 않습니다. 은 비어 있고 $ argc는 0입니다.

답변

0

당신이 잘못 assumpti를 만들기 위해 나타납니다처럼 프로 시저를 선언 할 때

set allArguments [info level 0] 

당신은 일반적으로 필요하지 않은 당신은 확실히가 필요하지 않습니다 여기 기능 :

  • 을 발동 (자세한 정보를 원하시면 아래 참조)의 (고화질)에 특별 인수 args를 사용하지 않는 경우, 인수의 고정 된 숫자 — 정확히 그 정의에 사용 된 매개 변수의 수를 일치를 허용 . 각 호출은 인터프리터에 의해 검사되며, 프로 시저의 코드에 도달하기 전에 매개 변수 개수가 잘못된 모든 호출이 실패합니다.

    자신에 대한 참조 : 즉

    % proc foo {a b c} {} 
    % foo 
    wrong # args: should be "foo a b c" 
    % foo 1 
    wrong # args: should be "foo a b c" 
    % foo 1 2 3 4 
    wrong # args: should be "foo a b c" 
    % foo 1 2 3 
    % 
    

    를, 당신의 proc에 전달 된 인수의 수를 확인하려고 엉망하지 않습니다 : 그것은 이미 프로 시저가 호출되는 시간에 의해 인터프리터에 의해 확인 있어요 .

  • argcargv 전역 변수

    은 Tcl의 인터프리터 당신은 Tcl 스크립트를 실행 프로그램에 운영 체제에서 통과 무엇을 제어 할 수 있습니다.당신이

    $ tclsh myscript.tcl foo bar 
    

    같은 전화입니다

    , argc라는 이름의 변수는 2를 포함하고 argv 두 문자열 — "foo는"과 "바"를 포함하는 목록으로 설정됩니다.

    즉, 이러한 변수는 개별 절차와 아무 관련이 없습니다.


args 특별한 인수와 관련하여 : 절차가 에 대한 인수의 마지막을 단어 "인수"를 사용하거나 단독 인수로가있는 경우,이 인수는 목록으로 전환되는 실제 인수의 수 (0 포함)를 소비합니다. 모두 foo 1 2foo 1 2 3 4 5 6을 좋아하지만합니다 (b 형식 인수에 대한 값이 없기 때문에) foo x을 좋아하지로

그래서 당신은

proc foo {a b args} {} 

다음 foo 프로 시저를 호출 할 수 있습니다 할 수 있습니다.

이러한 프로 시저에서는 args에 들어있는 내용을 검사하기 위해 일반 목록 명령 (llengthlindex과 같은)을 사용합니다. 예를 들어, foo 1 2 3 4 5 6으로 전화하면 args[list 3 4 5 6]으로 전화 할 때와 동일한 값으로 설정됩니다.

1

argcargv 변수는 (특별한 의미가있을 경우) 전역 변수입니다.

global argc argv 

또는 완전한 버전을 사용 : 당신이 말을하지 않는 프로 시저 내부에서, 그들은 모두에서 특별한 아니에요.

올바른 수의 인수를 전달하지 않으면 프로 시저 호출시 오류 메시지 (프로 시저 호출 기계에서 생성)가 표시됩니다. 정규 매개 변수 끝에 정규 매개 변수 (args 변수 - 맞춤법 참고)를 사용하지 않는 한 직접 확인하지 않아도됩니다.

프로 시저에 전달 된 인수의 정확한 목록을 가져 오려면 다음을 사용합니다.

proc TestVerb { Data Data_txt } { 
    ... 
} 
+0

안녕하세요, 빠른 답변 감사드립니다. 요점은 proc이 다른 사람들에 의해 사용될 것이고, 나는 그것들에 부여한 인자의 수를 체크 할 필요가있다. 이미 사용하려고 시도했습니다. global argv argc 그러나 여전히 잘못된 출력이 표시됩니다. argv argc 0 – Flaxter