2017-12-08 5 views
5

또는 동적 길이의 유사한 데이터 구조. 배열에 쉽게 캐스트 할 수 있습니다. 유일한 해결 방법은 배열을 문자열로 입력하고 수동으로 파싱하는 것입니다.config로 배열을 선언 할 수 있습니까?

config var not_array: string = '[1,2,3,4,5]' ; 

proc main() { 
    // config array workaround 
    writeln("I am string. Definitely not array ", not_array) ; 

    // parse string 
    not_array = not_array.replace(' ','') ; 
    not_array = not_array.replace('[','') ; 
    not_array = not_array.replace(']','') ; 
    var still_not_array = not_array.split(',') ; 

    // prepare array 
    var dom = 0..#still_not_array.size ; 
    var array: [dom] real ; 

    // populate array 
    for (i, x) in zip(dom, still_not_array) { 
     array[i] = x:real ; 
    } 
    writeln("Ha! Tricked you, am actually array ", array) ; 
} 

이 방법은 의도 한대로 작동하지만 더 좋은 방법이 있습니까?

+0

하나는 항상 구성 파일에서 (흐르는 등의 구성, 파이프 라인 구성 계산의 일반적인 단계) 자리를 차지할 입력을 정렬 할 수 있습니다. 다른 대안의 퍼지하지만 중요한 (더 나쁜 | 더 나은 | 최상의) 정도에 대한 실제 기준을 설명해 주시겠습니까? 컴파일 후 초기 단계는 프로세스 실행의 [TIME] 및 [SPACE] 차원 모두에서 일회성 비용이므로 항상 실제 양적 비용/보상 - 메트릭 함수도 명시해야합니다. 런타임에 구성 가능한 입력의 개념을 해결하기 위해 두 가지 방법을 비교해보십시오. – user3666197

+1

이 시점에서 저는 채플의 특징을 실험하고 있습니다. 커맨드 라인 다항식 보간 스크립트를 만들기 위해 명령 행을 통해 배열을 입력하는 것이 가능한지 알아보기 위해 관심이있었습니다. Chapel의 구성 파일 기반 접근 방식은 어떻게됩니까? – uqtredd1

답변

4

config를 사용하여 배열을 선언 할 수 있습니까?

아니요,이 기능은 채플에서는 아직 채플 1.16에서 지원되지 않습니다.

즉, 설명 할 때이 문제를 해결할 수있는 방법이 있습니다.

다른 대안으로는 IO 호출을 사용하여 입력 문자열을 메모리에 쓴 다음 배열로 읽을 수 있습니다.

config type arrType = int; 
config const arrSize = 3, 
      arrString = '1 2 3'; 

var A : [1..arrSize] arrType; 

// Create a memory buffer to write in 
var f = openmem(); 

// Create a writer on the memory buffer and write the input string 
var w = f.writer(); 
w.writeln(arrString); 
w.close(); 

// Create a reader on the memory buffer and read the input string as an array 
var r = f.reader(); 
r.readln(A); 
r.close(); 

writeln(A); 

참고 배열 크기가 앞에 있어야합니다. 나는 당신이 원래의 예제와 같이 문자열 처리를해야 할 것이라고 생각합니다.

일부 자원 :

+2

Chapel은 언젠가 배열을 configs로 지원해야한다는 점에 유의할 것입니다 (필자는 배열 구현의 문제 일뿐입니다 : 문자열 캐스팅). 또한 내 예제에서는 문자열에 대해 read() 메서드를 사용하고 싶습니다. C의 경우 sscanf와 유사하므로 ~ 7 줄의 코드로 예제를 줄일 수 있습니다. – bencray