2

(chpl 版本 1.16.0.e43acc7)

我开始学习DSI 接口,并且在从 Distribution 类中的 dsiNewRectangularDom 函数构造 Domain 类时遇到了一个令人困惑的问题:

class MyDist : BaseDist {

  proc MyDist( fold_dimensions ...?dims ){ }

  proc dsiNewRectangularDom(param rank: int, type idxType, param stridable: bool, inds) {
    var dom = new MyDom( rank=rank, idxType=idxType, stridable=stridable, dist=this);
    return dom;
  }
}

class MyDom : BaseRectangularDom { }

class MyArr : BaseArr { }

config const n = 4;
config const m = 8;
const base_domain = {1..#n,1..#m};
const mapped_domain = base_domain dmapped MyDist( 1 );

(这是非常基本的代码,我不希望它完全编译,但我被困在这部分。)

这会产生编译错误:

file.chpl:5: In function 'dsiNewRectangularDom':
file.chpl:6: error: unresolved call 'MyDom.init(rank=2, idxType=type int(64), stridable=0, dist=MyDist)'
file.chpl:11: note: candidates are: MyDom.init(_arrs, _arrs_containing_dom: int(64), _arrsLock: atomicbool, _free_when_no_arrs: bool, pid: int(64), param rank: int(64), type idxType, param stridable: bool)

(请参阅此 TIO 实例

我对这个 init 函数的来源有点困惑。我正在关注 Block、BlockDist 和 BlockDom 的行为(特别是BlockDist.chpl:533 ,其中 Block.dsiNewRectangularDom 调用 BlockDom 的构造函数。由于 MyDom 继承自 BaseRectangularDom,因此我(1)不需要声明等级 idxType,等成员变量,以及 (2) 不需要定义 MyDom( rank, idxType, ... ) 构造函数。我也没有看到可以从中学习的 BlockDom.init 函数。

我错过了什么?

4

1 回答 1

1

您最直接的问题是BaseRectangularDom(因此MyDom)没有名为“dist”的字段。像BlockDom,你会想要添加一个“dist”字段,可能像:

var dist : MyDist;

解决此问题后,您将进入下一个错误(未实现 dsiAssignDomain)。

错误消息可能提到 'init' 作为从 constructors 到initializers的持续转换的副作用。

于 2017-12-20T20:49:28.893 回答