例如,我正在寻找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;
}
答案 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