或任何具有动态长度的类似数据结构,可以轻松地将其转换为数组。我发现的唯一解决方法是将数组作为字符串输入并手动解析。
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) ;
}
这可以按预期工作,但是有更好的方法吗?
最佳答案
不,从教堂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);
请注意,这需要预先设置阵列大小。我认为您必须像原始示例一样进行一些字符串处理,才能即时计算出该值。
一些资源:
IO.openmem()
IO.channel.readln()
关于chapel - 是否可以使用config声明数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47712619/