2017-10-20 7 views
3

다음은 채플에서 다시 작성해야하는 파이썬 계열 패턴입니다.채플 클래스의 속성에 배열 할당

class Gambler { 
    var luckyNumbers: [1..0] int; 
} 

var nums = [13,17,23,71]; 

var KennyRogers = new Gambler(); 
KennyRogers.luckyNumbers = for n in nums do n; 

writeln(KennyRogers); 

는 런타임 오류가 나는 케니 사전에해야합니다 내가 그 시간에 케니을 인스턴스화 할 수 없습니다 얼마나 많은 운이 번호를 모르는

Kenny.chpl:8: error: zippered iterations have non-equal lengths 

를 생성합니다. 즉, 나중에 할당해야합니다. 또한 언제 그들을 붙들고, 언제 접을 지 알 필요가 있습니다.

+1

것은 해석하기 위해 : 크기를 조정하지 않고이 작업을 수행하기 위해, 당신은 배열의 도메인을 선언하고뿐만 아니라 초기화에서 설정해야이 오류를 얻고있는 이유는 그 luckyNumbers에 할당 프로그램에서 효과적으로 해석된다 :'(ln, n) zip (KennyRogers.luckyNumbers, nums) do ln = n "이고 luckyNumbers는 크기가 0이고'nums '는 아마도 그렇지 않다는 것 때문에, 다른 크기/길이 – Brad

답변

4

이 방법은 array.push_back 방법을 사용하는 것이 좋습니다. 당신이 필요로하는 경우에 push_frontinsert 방법도 있습니다

KennyRogers.luckyNumbers.push_back(nums); 

:

for n in nums do 
    KennyRogers.luckyNumbers.push_back(n); 

당신은 또한 하나의 push_back 작업의 전체 배열을 삽입 할 수 있습니다 : 당신이 할 수있는 한 번에 행운 번호를 삽입하려면 배열의 앞이나 임의의 위치에 요소를 넣을 수 있습니다.

나는 그 (것)들을 붙들 때 또는 그들을 접을 때를 도울 수 있다고 생각하지 않는다.

+0

도울 필요가 없어서 다행이다 –

2

간단한 방법으로 시작부터 올바른 크기를 만들고 배열의 크기를 조정하거나 다시 쓰지 않으려면 을 Gambler의 초기화 프로그램에 설정해야합니다.

class Gambler { 
    const D: domain(1);   // a 1D domain field representing the array's size 
    var luckyNumbers: [D] int; // declare lucky numbers in terms of that domain 

    proc init(nums: [?numsD] int) { 
    D = numsD;     // make D a copy of nums's domain; allocates luckyNumbers to the appropriate size 
    luckyNumbers = nums;  // initialize luckyNumbers with nums 
    super.init();    // mark the initialization of fields as being done 
    } 
} 

var nums = [13,17,23,71]; 

var KennyRogers = new Gambler(nums); 

writeln(KennyRogers); 
+1

@ david-iten이 이니셜 라이저 자체에서 push_back()을 사용하는 방법을 취할 수도있다 (2 단계에서 또는'super.init)'단순히 배열을 초기화하는 것이 아니라 어레이에서 작동하기 때문에). 기본적으로 push_back() - base d 접근법은 점진적으로 배열을 점차적으로 구축하여 (상각 된) 재 할당을 필요로하는 반면 여기 제안 된 접근법은 단순히 "처음부터 올바르게"수행합니다. – Brad

+0

초기 구성시에만 메모리 비용이 발생합니까? 아니면 문제가 발생합니까? 줄을 내려? 예를 들어, 나는'luckyNumbers'에 다시 추가하지 않을 것입니다. 나는 나중에 어떤 효과를 잃어 버리는가? –