是否可以使用config声明一个数组?

时间:2017-12-08 10:40:28

标签: chapel

或任何类似的动态长度数据结构,可以很容易地转换为数组。我发现的唯一解决方法是将数组作为字符串输入并手动解析它。

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 个答案:

答案 0 :(得分:4)

  

是否可以使用config声明一个数组?

不,Chapel 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);

请注意,这需要预先确定数组大小。我认为您必须像原始示例那样进行一些字符串处理,以便即时计算。

一些资源: