给出超过 3 维数组地址的数学函数是什么?a[x][y]
我已经知道对于二维数组是(a (x * max_second_dimension + y) * byte)
3 回答
让数组的维度为lxbxhxg
,这意味着数组已声明使用
data_type array[l][b][h][g];
如果您想要单元格的地址,array[x][y][z][a]
那么它将是
array + (x*b*h*g + y*h*g + z*g + a) * sizeof(array[x][y][z][a])
给定一个数组a[N1][N2][N3]...[Nk]
,元素的地址a[i1][i2]...[ik]
将等于:
a +
+ i1 * (N2 * N3 * ... * Nk) +
+ i2 * (N3 * N4 * ... * Nk) +
+ i3 * (N4 * N5 * ... * Nk) +
...
+ i(k - 1) * Nk +
+ ik
下面是索引i
和N
索引((k - 1)
在i(k - 1)
.
任意维度的数组访问器有一个有限公式,我将在下面解释。
但在此之前,您应该知道,形式语言通常通过访问索引上的最顶层数组乘以内部数组大小来处理语法规则中的多维数组——这反过来又是递归的结果。这可能会在另一个数组中结束,通过索引乘以内部数组大小访问,具有特定的偏移量等等,直到访问的元素不是数组。如果您想了解形式语言的工作原理,您应该看看(例如)ANTLR。
当然,如果您知道维度的数量和每个维度的大小,您总是可以找到特定的表达式。例如:设a
数组的地址、s
维数大小的数组、维d
数、c
索引数组(数组所描述的空间中的坐标)和e
元素大小。该地址将以伪代码评估为:
a + e * sum(i := 0, d - 1, c[i] * prod(j := i + 1, d - 1, s[j]))
其中i
,j
是循环变量,sum
,prod
是大和/乘积运算符,第一个参数对应下限,第二个参数对应上限。请注意,空乘积算子(最后一次迭代)结果为1。我没有测试过上面的,但原理应该很清楚。Sorra,但我似乎无法在此处以数学符号发布公式。