5

または、配列に簡単にキャストできる、動的な長さの同様のデータ構造。私が見つけた唯一の回避策は、配列を文字列として入力し、手動で解析することです。

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) ;
}

これは意図したとおりに機能しますが、より良い方法はありますか?

4

1 に答える 1

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);

これには、前もって配列サイズが必要であることに注意してください。その場で計算するには、元の例のような文字列処理を行う必要があると思います。

いくつかのリソース:

于 2017-12-08T15:44:25.077 に答える