2017-07-07 21 views
6

ないとして、私は、配列のスライスへの参照を返すようにしようとしているが、問題のある行は、完全な配列が正常に動作します戻るsliceチャペルの配列のスライスへの参照を返すには?

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は配列のスライスを返す意図を示す適切な方法のように思えますが、まだ議論が終了していません。

その間に、次のプラグマベースの回避策を使用することができます(チャペルプラグマは一般にエンドユーザー向けではなく、このプラグマは長期的にはサポートされない可能性があります)私が提案した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'リターンインテントを使用)それは 'proc'からの復帰との面白い違いです.... –

関連する問題