Как вернуть ссылку на фрагмент массива в часовне?
Я пытаюсь вернуть ссылку на фрагмент массива, но получаю следующую ошибку во время компиляции (где находится строка с ошибкой slice
test.chpl:9: ошибка: недопустимое выражение для возврата по ссылке
Возврат полного массива работает нормально, также как и получение ссылки на фрагмент в основной программе.
Есть ли правильный способ вернуть ссылку на срез? Заранее спасибо!
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 версии 1.16.0 (2659cc6)
1 ответ
Что касается текущей версии компилятора, который вы используете, это открытый вопрос, который обсуждается по вопросу № 5341 GitHub. Я согласен с вами, что ref
кажется подходящим способом указать намерение вернуть часть массива, но мы еще не достигли завершения обсуждения.
В то же время вы должны иметь возможность использовать следующий обходной путь на основе прагмы (обратите внимание, что прагмы Chapel, как правило, не предназначены для использования конечным пользователем, и что эта прагма вряд ли будет поддерживаться в долгосрочной перспективе, хотя я бы не стал ' не ожидайте, что мы уйдем на пенсию, не придумав подход замены, как предложено 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);