2014-04-09 2 views
1

나는 아래와 같은 테이블을 가지고 있으며이를 Tcl에서 코딩해야합니다. 나는 if-else 코드를 시도했지만 매우 길고 반복적 인 문장이되었다. 내가 그렇게 나는를 저장하는 모드 기능을 사용하고 표준 알려진 값에 대해 확인하고 그Tcl에서 If-Else 대신에 더 나은 대안

Table 

Number Condition Width Height 
2   True  1x 1y 
3   True  1x 1y 
4   True  1x 2y 
5   True  2x 2y 
6   True  2x 4y 
7   True  3x 4y 
2   False 0.2x 1y 
3   False 0.2x 1y 
4   False 0.2x 1y 
5   False 0.2x 1y 
6   False 0.2x 1y 
7   False 0.2x 1y 

기본적으로,이 폭과 높이가 같은 배열 또는 스위치 케이스 문 또는 무언가를 사용하여 구현하는 더 나은 대안 솔루션이 있습니까 값을 변수에 넣고 같은 조건을 적용합니다.

예 : 알려진 값이 100이고 1x = 10 및 1y = 20이라고 생각해 봅시다. 10과 20 모두 100으로 나눌 수 있으므로 mod 함수는 분명히 0을 반환합니다.

if {condition == true} { 
    if {(number ==2 || number ==3) && ($offset_x != 0)} { 
    puts "Error" 
    } 
    if {number ==4 && ($offset_x !=0 || $offset_2y != 0)} { 
    puts "Error"         
    } 
    ..... complete till number ==7 
} else { 
    if {(number ==2 || number ==3 || number ==4 ... number ==7) && (offset_0.2x !=0 ||   $offset_1y !=0)} { 
    puts "Error" 
} 
: 위 변경됩니다 따라서 나는 다음과 같은 코드 기술을 사용하고 표시된 테이블의 실제 생활에서

set knownvalue 100 
set 1x 10 
set 1y 20 
set offset_x [expr ($knownvalue % $1x)] 
$> 0        # (return 0) 
set offset_y [expr ($knownvalue % $1y)] 
$> 0        #(returns 0)` 

# (Note as per chart for number 2, Height becomes 2y so that needs to be accounted for when calculating $offset_2y) 

이 1 배 1 Y :

그래서,이 같은 것을 확인합니다

이 기능은 구현하기에 최적의 솔루션이 아니지만 작동합니다. 그래서, 더 나은 것을 제안하십시오.

미리 감사드립니다.

답변

1

특정 카테고리의 회원 확인이 동등성 검사의 집합 인 테이블을 구조화 할 수있는 경우이를 연관 배열 조회로 변환 할 수 있습니다. 연관 배열의 변수 내용을 스크립트로 만들면 평가할 코드를 계산하여 사용할 수 있습니다. 당신이 정확한 문자열 조회를 수행되도록

set action(2,true,0,0) {error "Something went wrong"} 
#... 

eval $action($number,$condition,[expr {$offset_x % 10}],[expr {$offset_y % 42}]) 

그러나,이 작품은 사물을 구성 할 수 있습니다. 특히, 위의 당신이하고있는 같은 수 있습니다 : 그 실패

if {($number eq "2") && ($condition eq "true") && ($offset_x % 10 eq "0") && ($offset_y % 42 eq "0")} { 
    error "Something went wrong" 
} else ... 

switch 명령을보십시오. 즉 최소 지원 기본 케이스와 글로브 패턴 할 수 있습니다 if`와`switch`와 배열 조회`와

switch -- $number,$condition,[expr {$offset_x % 10}],[expr {$offset_y % 42}] { 
    2,true,0,0 - 7,false,1,19 { 
     error "Something went wrong" 
    } 
    default { 
     puts "nothing else applicable" 
    } 
} 
switch -glob -- $number,$condition,[expr {$offset_x % 10}],[expr {$offset_y % 42}] { 
    2,true,0,* - 7,false,*,19 { 
     error "Something went wrong" 
    } 
    default { 
     puts "nothing else applicable" 
    } 
} 
+0

또한 믹스 앤 매치 할 수 것은에 따라하는 것은 당신을 위해 가장 좋습니다. –