Как вернуть ссылку на фрагмент массива в часовне?

Я пытаюсь вернуть ссылку на фрагмент массива, но получаю следующую ошибку во время компиляции (где находится строка с ошибкой 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);
Другие вопросы по тегам