如何在ATS中构建二维数组?

时间:2016-11-02 05:14:24

标签: ats

例如,我正在寻找ATS中的一个示例,该示例或多或少地执行以下C代码:

int *theMultable[10][10];

void
theMultable_initialize()
{
  int i, j;
  for (i = 0; i < 10; i++)
  {
    for (j = 0; j < 10; j++) theMultable[i][j] := i * j;
  }
  return;
}

1 个答案:

答案 0 :(得分:1)

一种可能的方法是尝试直接翻译为C.但是,我现在认为我应该使用内置matrix类型。这段代码依赖于相当多的高级功能(我甚至为练习留下了一个未经证实的引理:它显示了N*sizeof(T) == sizeof(@[T][N])

初始化二维数组的循环在函数中实现:

extern
fun
multable_init (
  mat: &(@[@[int][10]][10])? >> _
): void // end of [multable_init]

这个函数反过来使用两个函数(基本上都是初始化一个元素数组)。此外,全局变量multable已分配,然后使用multable_init初始化(我认为它不会起作用,但确实如此!)。

这是全局变量的初始化代码:

var multable : @[int?][100]
val p_multable = addr@multable
prval pf_multable = array_v_group (view@multable)
val () = multable_init (!p_multable)
prval pf_multable = array_v_ungroup (pf_multable)
prval pf_multable = array2matrix_v (pf_multable)
val theMultable = ref_make_viewptr {matrix (int, 10, 10)} (pf_multable | p_multable)

在堆栈上分配一个可变数组,然后我们取其地址(第2行),将其对应的at-proof从@[int?][100]转换为@[@[int?][10]][10](通过第3行的分组),并初始化它。然后,我们将分组数组视图转换为矩阵视图,最后将其放入ref-cell。

完整代码位于Glot.io