2017-12-08 107 views
5

Lub dowolnej podobnej struktury danych o dynamicznej długości, która może być łatwo przeniesiona do tablicy. Jedyne obejście, które znalazłem, to wpisanie tablicy jako ciągu znaków i ręczne przeanalizowanie go.Czy można zadeklarować tablicę z konfiguracją?

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

Działa to zgodnie z przeznaczeniem, ale czy jest lepszy sposób?

+0

One zawsze może zorganizować wejść nastąpić z pliku konfiguracyjnego (wspólny krok w taki konfigurowalnym, rurociąg zorganizowany obliczeń płynie). Czy mógłbyś wyjaśnić swoje faktyczne kryteria dla niewyraźnego, ale ważnego (gorszego, lepszego, lepszego) podejścia alternatywnego? Początkowy krok po kompilacji jest (i zawsze będzie) jednorazowym kosztem w obu wymiarach [TIME] i [SPACE] w realizacji procesu, więc czy chciałbyś wyraźnie podać także faktyczną ilościową funkcję kosztu/nagrody-metryczki, aby porównać dwa podejścia, aby rozwiązać już działającą koncepcję konfigurowalnego wejścia w czasie wykonywania? – user3666197

+1

W tym momencie po prostu eksperymentuję z rysami Kaplicy. Interesowało mnie tylko to, czy możliwe było wprowadzanie tablic za pomocą wiersza poleceń, na przykład, skrypt interpolacji wielomianowej linii poleceń. Jak wyglądałoby podejście oparte na pliku konfiguracyjnym dla Chapel? – uqtredd1

Odpowiedz

4

Czy można zadeklarować tablicę z konfiguracją?

Nie, nie jest to jeszcze obsługiwane w Kaplicy od Kaplicy 1.16.

To powiedziawszy, istnieją sposoby obejścia tego, jak wykazujesz.

Jako alternatywę obejść można wykorzystać wywołania IO, aby zapisać ciąg wejściowy w pamięci, a następnie odczytać go jako tablicę, np.

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

Uwaga: to wymaga rozmiaru tablicy z przodu. Myślę, że musielibyśmy wykonać trochę przetwarzania ciągów, jak na przykład, aby obliczyć to w locie.

Niektóre zasoby:

+2

Zauważyłem, że Kaplica powinna pewnego dnia wspierać tablice jako konfiguracje (uważam, że to tylko kwestia wdrożenia tablicy: odlewania ciągów). Również mój przykład sprawia, że ​​chciałbym mieć metodę read() na łańcuchach, podobną do sscanf dla C. Zmniejszyłoby to przykład o ~ 7 linii kodu. – bencray