2017-10-20 154 views
3

這是一個我需要在Chapel中重新創建的類似Python的模式。將一個數組分配給Chapel類中的一個屬性

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在你的程序中被有效地解釋爲:'for(ln,n)in zip(KennyRogers.luckyNumbers,nums)do ln = n「並且由於luckyNumbers的大小爲0,'nums'大概沒有,所以這是一個拉鍊不同的大小/長度 – Brad

回答

4

這是array.push_back方法的一個很好的應用。要插入一次幸運號碼一個,你可以這樣做:

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

您還可以插入單一push_back操作的整個陣列:

KennyRogers.luckyNumbers.push_back(nums); 

也有push_frontinsert方法的情況下,你需要將元素放在陣列的前面或任意位置。

我不認爲我可以幫助他們何時舉行或何時摺疊他們。

+0

只是很高興我沒有跑 –

2

解決這個問題的一種方法是,從一開始就將事物尺寸設置爲合適的大小,並避免調整大小/重寫數組的方法是在初始化程序中爲Gambler建立luckyNumbers。爲了做到這一點不調整,你需要聲明數組的域,並設置它的初始化以及:

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'。我以後會失去效率嗎? –

相關問題