【8-6,8-7】如你所知,C编译器为数组分配下标时总是从0开始,而且当程序使用下标访问数组元素时,它并不检查下标的有效性,在这个项目中,你将要编写一个函数,允许用户访问“伪数组”,它的下标范围可以任意指定,并伴以完整的错误检查。下面是你将要编写的这个函数的原型:
int array_offset(int arrayinfo[],...);
这个函数接受一些用于描述伪数组的维数信息以及一组下标值,使用这个函数,用户既可以以向量的形式分配内存空间,也可以使用mallco分配空间,但按照多维数组的形式访问这些空间,这个数组之所以被称为“伪数组”是因为编译器以为它是个向量,尽管这个函数允许它按照多维数组的形式进行访问。
这个函数的参数如下:
参数 | 含义 |
arrayinfo | 一个可变长度的整型数组,包含一些关于伪数组的信息。 arrayinfo[0]指定伪数组具有的维数,它的值必须在1和10之间。
arrayinfo[1]和arrayinfo[2]给出第一维的下限和上限, arrayinfo[3]和arrayinfo[4]给出第2维的下限和上限, 依次类推。 |
... | 参数列表的可变部分可能包含多达10个的整数,用于标识伪数组中某个特定位置的下标值。你必须使用va_参数访问它们,当函数被调用时,arrayinfo[0]参数将会被传递。 |
公式根据下面给出的下标值计算一个数组的位置。变量s1,s2等代表下标参数s1,s2等。变量lo1和hi1代表下标s1的下限和上限,它们来源于arrayinfo参数,其余各维以此类推。变量loc表示伪数组的目标位置,它用一个距离伪数组起始位置的整型偏移量表示。
对于一维数组:
loc = s1 - lo1
对于二维伪数组:
loc = (s1 - lo1) × (hi2 - lo2 + 1) + s2 - lo2
对于三维伪数组:
loc = [(s1 - lo1) × (hi2 - lo2 + 1) + s2 - lo2] × (hi3 - lo3 + 1) + s3 - lo3
对于四维伪数组:
loc = [[(s1 - lo1) × (hi2 - lo2 + 1) + s2 - lo2] × (hi3 - lo3 + 1) + s3 - lo3] × (hi4 - lo4 + 1) + s4 - lo4
一直到第十维为止,都可以类似的使用这种方法推导出loc的值。你可以假定arrayinfo是个有效的指针,传递给array_offset的下标参数也是正确的。对于其他情况你必须进行错误检查,可能出现的一些错误有: