2017-12-08 4 views
5

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

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

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

+0

一つは、常に設定ファイル(例えば、構成、パイプラインの整理の計算フローの一般的なステップ)から場所を取るために入力を手配することがあります。どのような代替アプローチでも、あいまいだが重要な{悪い|良い|ベスト}というあなたの実際の基準について説明してもらえますか?最初のコンパイル後のステップは、プロセス実行の[TIME]と[SPACE]ディメンションの両方で1回限りのコストであるため、実際の量的なコスト/報酬メトリック関数も明示的に明示してください。すでに実行可能な構成可能な入力の概念を解決するための2つのアプローチを比較してください。 – user3666197

+1

この時点で私はChapelの機能を実験しています。コマンドラインを使って配列を入力して、コマンドラインの多項式補間スクリプトなどを作ることができるかどうかを知りたいだけでした。 Chapelの設定ファイルベースのアプローチはどのように見えるでしょうか? – uqtredd1

答えて

4

configを使用して配列を宣言できますか?

いいえ、これはまだチャペル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); 

注意しなければならないのは、配列のサイズが最前面にあることです。その場で計算するために元の例のような文字列処理をしなければならないと思います。

一部のリソース:

+2

私はChapelがいつもアレイをconfigsとしてサポートしてくれることに注意しましょう(私はそれが単に配列実装の問題です:文字列キャスト)。 また、私の例では、Cのsscanfに似た文字列のread()メソッドが必要になります。これはコードの7行分を減らしてしまいます。 – bencray

関連する問題