2017-07-07 56 views
6

我試圖返回數組的一個片段的引用,但正在以下編譯時錯誤(其中違規行爲slice如何在Chapel中返回對數組切片的引用?

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

返回全陣列工作正常,一樣。在主程序中採取參照切片

是否有一個正確的方式提前返回裁判切片感謝

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]; 
只是爲了完整性

:?!

chpl Version 1.16.0 pre-release (2659cc6)

回答

2

從當前使用的編譯器版本開始,這是一個尚未解決的問題,正在討論GitHub issue #5341。我同意你的意見,ref似乎是一個合適的方式來表示返回數組的切片的意圖,但我們還沒有達到討論的目的。

與此同時,您應該能夠使用以下基於附註的解決方法(請注意Chapel pragmas通常不適合最終用戶使用,並且該附註不可能在長期支持,雖然我不希望我們退役,而不必拿出像提出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

只是一個快速跟進 - 看來我可以返回一個裁判片一個迭代器(使用'ref' return intent)。這與從'proc'返回有趣的區別.... –