2017-07-07 42 views
6

Próbuję zwrócić odwołanie do plasterka tablicy, ale otrzymuję następujący błąd kompilacji (gdzie linia wykraczająca jest w sliceJak zwrócić referencję do wycinka tablicy w Chapel?

test.chpl:9: error: illegal expression to return by ref

Wracając pełna tablica działa bez zarzutu, podobnie jak . biorąc odniesienie do plasterka w programie głównym

Czy jest poprawny sposób, aby powrócić ref do plasterka góry dziękuję

record R { 
    var A : [0.. #10] int; 

    proc full() ref { 
    return A; 
    } 

    proc slice() ref { 
    return A[0.. #5]; 
    } 
} 

var r : R; 
ref x1 = r.full(); 
ref x2 = r.slice(); 
ref x3 = x1[0.. #5]; 

tylko dla kompletności:?!

chpl Version 1.16.0 pre-release (2659cc6)

Odpowiedz

2

W obecnej wersji używanego kompilatora jest to otwarte pytanie, które jest przedmiotem debaty pod numerem GitHub issue #5341. Zgadzam się z Tobą, że ref wydaje się być właściwym sposobem wskazania zamiaru zwrotu fragmentu tablicy, ale nie udało nam się jeszcze zamknąć tej dyskusji.

W międzyczasie powinieneś mieć możliwość skorzystania z poniższego rozwiązania opartego na pragmie (należy pamiętać, że pragmaty Kaplicy zasadniczo nie są przeznaczone do użytku użytkownika końcowego i że ta pragma raczej nie będzie wspierana w dłuższej perspektywie, chociaż nie spodziewałbym się nam wycofać go bez wymyślić podejścia zastępczego podobnego proponowanego ref):

record R { 
    var A : [0.. #10] int; 

    proc full() ref { 
    return A; 
    } 

    pragma "no copy return" 
    proc slice() { 
    return A[0.. #5]; 
    } 
} 

var r : R; 
ref x1 = r.full(); 
ref x2 = r.slice(); 
ref x3 = x1[0.. #5]; 
x1[0] = 1; 
x2[1] = 2; 
x3[2] = 3; 
writeln(r); 
+2

Wystarczy szybkie follow-up - wydaje się, że mogę wrócić ref do plasterka w iterator (wykorzystując zamiar powrotu "ref"). To interesująca różnica z powrotem z 'proc' .... –