2017-10-20 153 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'。我以后会失去效率吗? –

相关问题