2017-07-07 36 views
6

yaptığı gibi ben, bir dizinin bir dilim bir başvuru döndürmek için çalışıyorum, ancak kusurlu hattı tam dizi çalışıyor dönen sliceChapel'deki bir dizinin bir dilimine nasıl başvuru yapılır?

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

olduğunu aşağıdaki derleme zamanı hatası (alıyorum . ana programda bir dilim bir başvuru alarak

mi var doğru yolu bir dilime bir ref dönmek için peşin Sadece şeyiyle

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)

cevap

2

Kullandığınız derleyicinin şu anki sürümünden itibaren, bu, GitHub issue #5341 üzerinde tartışılan açık bir sorudur. ref'un bir dizi bir dilim döndürme niyetini belirtmek için uygun bir yol gibi göründüğüne katılıyorum, ancak henüz tartışmaya henüz son vermedik. Bu arada, aşağıdaki pragma tabanlı geçici çözümü kullanabilmeniz gerekir (lütfen Chapel pragmalarının genellikle son kullanıcı kullanımı için tasarlanmadığını ve bu pragmanın uzun vadede desteklenmesinin olası olmadığını unutmayın.) Önerdiğim ref gibi bir yedek yaklaşımı) ile gelip sahip olmadan emekli olmamızı beklerler olmaz gerçi:

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

Sadece hızlı takip - ben bir dilime bir ref dönebilmek görünür Bir yineleyici (bir 'ref' iade niyetini kullanarak). Bu 'proc 'dönüşü ile ilginç bir fark var .... –