Функция возвращает ассоциативный массив - PullRequest
0 голосов
/ 31 октября 2018

Как получить функцию, возвращающую ассоциативный массив в часовне? Это то, что естественно, но, похоже, не работает:

type keys = domain(int);
type arr = [keys] int;

proc factor(q): arr {
...
}

Вывод ошибки, который я получаю:

error: unresolved call 'chpl__ensureDomainExpr(type DefaultAssociativeDom(int(64),true))'
$CHPL_HOME/modules/internal/ChapelArray.chpl:642: note: candidates are: chpl__ensureDomainExpr(const ref x: domain)
$CHPL_HOME/modules/internal/ChapelArray.chpl:649: note:                 chpl__ensureDomainExpr(x ...)

1 Ответ

0 голосов
/ 31 октября 2018

Вот рабочая программа, которая делает это:

proc returnsAssocArray() {
  var AssocDom:domain(int);
  var AssocArray:[AssocDom] int;
  AssocArray[1] = 100;
  return AssocArray;
}

var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
  writeln("A[", key, "] = ", value);
}

Приведенный выше шаблон используется мной и, вероятно, делает то, что вы хотите.

Обратите внимание, что массивы и домены в Chapel имеют отношение runtime , и что тип массива включает домен runtime . Поэтому, хотя код, который вы разместили, может однажды сработать, в общем случае для указания типа массива необходимо указать домен, доступный во время выполнения.

Предположим, что вы хотите использовать один домен (он же набор ключей) для всех возвращенных ассоциативных массивов, вы можете сделать это:

var AssocDom:domain(int);
AssocDom += 1; // add index 1 to the associative domain
type AssocArrayType = [AssocDom] int;

proc returnsAssocArray(): AssocArrayType {
  var AssocArray:AssocArrayType;
  AssocArray[1] = 100;
  return AssocArray;
}

var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
  writeln("A[", key, "] = ", value);
}

Но, если returnsAssocArray хочет добавить 2 в домен (скажем), все может работать не так, как вы ожидаете:

  • добавление 2 к AssocDom изменит размеры любых других массивов, созданных в этом домене
  • просто сделать AssocArray[2] = 100 добавит в домен, только если нет других массивов, разделяющих этот домен.

Вероятно, что будущие версии Chapel будут иметь тип Map, чтобы упростить такие варианты использования и представить более знакомый интерфейс для карт. Кроме того, правило о добавлении в ассоциативный домен, если никакие другие массивы не разделяют его, вполне может исчезнуть.

...