伪数组(以列主序存储)下标访问

《C和指针》第8章编程练习第7题:

 1 /*
 2 ** 2014/12/09, by ZHM
 3 */
 4 #include <stdio.h>
 5 #include <stdarg.h>
 6 
 7 /*
 8 ** 函数功能:
 9 **     允许用户访问“伪数组”,它的下标可以任意指定,并有完整的错误检查
10 **     该伪数组以列主序存储,最左边的下标先变化。
11 ** 函数参数:
12 **     arrayinfo:一个可变长度整型数组,包含一些关于伪数组维数的信息,
13 **                arrayinfo[0] 指定伪数组的维数,1<=arrayinfo[0]<=10
14 **                arrayinfo[1]和arrayinfo[2]给出第1维的上限和下限,以此类推
15 **     ... : 可变参数列表,包含与伪数组维数相等个数的参数。
16 **           用于标识伪数组中某个特定位置的下标值
17 ** 函数返回:
18 **     返回伪数组的offset量,用于表示一个向量(一位数组)的下标
19 **     如出现以下错误情况,则返回-1
20 **         1. 维数不处于1和10之间;2. 下标小于下限值;
21 **         3. 下标大于上限值;4. 上限值小于对应的下限值。
22 */
23 int
24 array_offset2( int arrayinfo[], ... )
25 {
26     /*
27     ** 检查伪数组的维数是否在1-10之间
28     */
29     int N = arrayinfo[0]; // N表示伪数组的维数
30     if( N < 1 || N > 10 )
31         return -1;
32 
33     va_list var_arg;
34     int s;       // s表示下标参数
35     int lo, hi;  // lo表示下限,hi表示上限
36     int lo_index, hi_index; // 在arrayinfo数组中lo和hi对应的索引值
37     int loc = 0;  // 表示伪数组的目标位置
38     int j;
39     int size_mutiply = 1;
40     
41     /*
42     ** 伪数组的目标位置用一个距离伪数组起始位置的整型偏移量表示
43     ** 以下部分通过公式计算伪数组的目标位置
44     */
45     va_start( var_arg, arrayinfo[0] );
46     
47     for( j = 0, lo_index = 1, hi_index = 2; j < N; ++ j, lo_index += 2, hi_index += 2 )
48     {
49         s = va_arg( var_arg, int );  // 用va_参数宏访问可变参数列表
50         lo = arrayinfo[lo_index];
51         hi = arrayinfo[hi_index];
52         
53         // 判断是否存在错误
54         if( lo > hi || s < lo || s > hi )
55             return -1;
56             
57         // 计算目标位置
58         loc += ( s - lo ) * size_mutiply;
59         
60         size_mutiply *= ( hi - lo + 1 );
61     }
62     va_end( var_arg );
63     return loc;
64 }
65 
66 int
67 main()
68 {
69     int arrayinfo[] = { 3, 4, 6, 1, 5, -3, 3 };
70     int a, b, c;
71     scanf( "%d%d%d", &a, &b, &c );
72     int offset = array_offset2( arrayinfo, a, b, c );
73     printf( "%d", offset );
74     return 0;
75 }

 

posted on 2014-12-10 11:49  丝工木每  阅读(484)  评论(0编辑  收藏  举报

导航