| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5586 人关注过本帖
标题:数组维界基址和数组映象函数常量基址 理解问题 ,谢谢
取消只看楼主 加入收藏
折翼
Rank: 2
来 自:广东广州
等 级:论坛游民
帖 子:105
专家分:77
注 册:2010-10-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
数组维界基址和数组映象函数常量基址 理解问题 ,谢谢

程序代码:
#include<stdarg.h>         
#define MAX_ARRAY_DIM 8     //假设数组维数的最大值为8 
typedef struct {
    ElemType *base;         //数组元素基址,由InitArray分配
    int dim;                //数组维数
    int *bounds;            //数组维界基址,由InitArray分配
    int *constants;         //数组映象函数常量基址,由InitArray分配
}Array;

Status InitArray(Array &A,int dim,...){
//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK。
if (dim<1 ||dim>MAX_ARRAY_DIM) return ERROR;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if (!A.bounds) exit(OVERFLOW);
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal。
elemtotal=1;
va_start(ap,dim);    //ap为va_list类型,是存放变长参数表信息的数组。
for (i=0;i<dim;++i){
    A.bounds[i]=va_arg(ap,int);
    if (A.bounds[i]<0) return UNDERFLOW;
    elemtotal * = A.bounds[i];
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType));
if (!A.base) exit (OVERFLOW):
//求映象函数的常数ci(i为下标),并存入A.constants[i-1],i=1,...dim。
A.constants=(int *)malloc(dim *sizeof(int));
if (!A.constants)exit (OVERFLOW);
A.constants[dim-1]=1;
for (i=dim-2;i>=0;--i)
  A.constants[i]=A.bounds[i+1] * A.constants[i+1];
return OK;
}

status Locate(Array A,va_list ap,int &off){
//若ap指示的各下标值合法,则求出该元素在A中相对地址off。
   off=0;
   for (i=0;i<A.dim;++i){
        ind=va_arg(ap,int);
        if (ind<0 || ind>=A.bounds[i]) return OVERFLOW;
        off + = A.constants[i] * ind;
   }
   return OK;
请问各位前辈,数组维界基址,即代码中的A.bounds,是用来储存什么的?而A.constants又是用来储存什么的?查询过相关资料,还是不明白。尤其是代码中的
A.constants[dim-1]为什么要把1,赋给它?
希望各位前辈帮忙解答一下,谢谢。

搜索更多相关主题的帖子: 函数 
2011-02-21 13:34
折翼
Rank: 2
来 自:广东广州
等 级:论坛游民
帖 子:105
专家分:77
注 册:2010-10-22
收藏
得分:0 
以下是引用犬虫门心在2011-2-21 15:00:12的发言:

我只把我看懂了的部分说出来,若有不周,请多指教。

#include         
#define MAX_ARRAY_DIM 8     //假设数组维数的最大值为8
typedef struct {
    ElemType *base;         //数组元素基址,由InitArray分配
    int dim;                //数组维数
    int *bounds;            //数组维界基址,由InitArray分配
    int *constants;         //数组映象函数常量基址,由InitArray分配
}Array;

Status InitArray(Array &A,int dim,...){//这里用的是“可变参”形参方式。它主要解决维数不定的问题。
//举例:设有4维数组,各维分别是:4,5,6,7(这些数字是随意给的),那么,调用方式:
//InitArray(ar, 4, 4, 5, 6, 7);
//ar其中,ar也是假设的变量名称, 4表示数组有4维, 4, 5, 6, 7这4个数是各维大小
//如果是5维的,那么就这样:
//InitArray(ar, 5, 第一维数,第二维数,第三维数,第四维数,第五维数);
//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK。
if (dim<1 ||dim>MAX_ARRAY_DIM) return ERROR;
A.dim=dim;
A.bounds=(int *)malloc(dim*sizeof(int));
if (!A.bounds) exit(OVERFLOW);
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal。
elemtotal=1;
va_start(ap,dim);    //ap为va_list类型,是存放变长参数表信息的数组。
for (i=0;i<DIM;++I){
    A.bounds=va_arg(ap,int);//从这里可以看出,A.bounds数组中,存放的是各维的大小
    if (A.bounds<0) return UNDERFLOW;
    elemtotal * = A.bounds;//各维数之积,自然是数组中元素的总个数
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType));//这个就是“多维数组”的存储本质:一维数组!
//用一维方式表示多维数组后(其实,从管理和使用的角度看,内存就只有一维这么一种形式),存在如何按“多维”的逻辑角度定位元素的问题。再说清楚些:假设前面所讲的4维数组,其元素用下标形式表示,范围为:(0,0,0,0)到(3,4,5,6)。对于任意下标(在有效范围内)(i1, i2, i3, i4)所对应的元素,转换到“一维”空间后,其下标应该是什么?这就是这个程序后面要处理的主要问题。
if (!A.base) exit (OVERFLOW):
//求映象函数的常数ci(i为下标),并存入A.constants,i=1,...dim。
A.constants=(int *)malloc(dim *sizeof(int));
if (!A.constants)exit (OVERFLOW);
//以前面的4维数组为例子,其中A.bounds[0]=4,A.bounds[1]=5,A.bounds[2]=6,A.bounds[3]=7。
//跟踪下面的程序:
A.constants[dim-1]=1;//A.constants[3] = 1
for (i=dim-2;i>=0;--i)//A.constants[2] = 7,A.constants[1] = 6*7,A.constants[0] = 5*6*7
  A.constants=A.bounds * A.constants;
//说到这里,这个问题就清晰了:A.constants中的元素,是帮助定位用的。比如说:对于(2,0,0,0)这个下标的元素,应该越过前面的(0,0,0,0)~(0,4,5,6)和(1,0,0,0)~(1,4,5,6)这两大块,而这两大块中的每一块都有5*6*7个元素,这正好就是A.constants[0]中所存放的数据啊!
//现在应该明白了吧!
return OK;
}

status Locate(Array A,va_list ap,int &off){
//若ap指示的各下标值合法,则求出该元素在A中相对地址off。
   off=0;
   for (i=0;i<A.DIM;++I){
        ind=va_arg(ap,int);
        if (ind<0 || ind>=A.bounds) return OVERFLOW;
        off + = A.constants * ind;
   }
   return OK;

非常感谢啊。。。
但是,还有一点我仍然不明白。就是为什么A.constants[dim-1]永远都等于1呢?
2011-02-21 19:13
快速回复:数组维界基址和数组映象函数常量基址 理解问题 ,谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022861 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved