鱼C论坛

 找回密码
 立即注册
查看: 5522|回复: 8

数组算法有几处不能理解

[复制链接]
发表于 2012-2-4 15:18:08 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 番茄 于 2012-6-1 23:12 编辑

已经一天了也没有弄明白。解答能不用初高中数学公式就不要用了,:dizzy: 没读过初高中,你写了我也看不懂
表达能力不好(*^__^*) 嘻嘻……。设置了红色字体的部分,就是我想不明白的地方,想不明白它为什么要这样做。[i][i][i][/i][/i][/i] “数组存储映像常量基地址” 的原理 是什么??

#define MaxArraySize 2
typedef struct
{
    DataType *base;         /*数组元素的基地址*/
    int dim;                         /*数组的维数*/
int *bounds;                /*数组的每一维之间的界限的地址*/
int *constants;                /*数组存储映像常量基地址*/  
                                                                              
}Array;

int InitArray(Array *A,int dim,...)
/*数组的初始化操作*/
{
    int elemtotal=1,i;                                         /*elemtotal是数组元素总数,初值为1*/
    va_list ap;
    if(dim<1||dim>MaxArraySize)                        /*如果维数不合法,返回0*/
        return 0;
    A->dim=dim;
    A->bounds=(int *)malloc(dim*sizeof(int));         /*分配一个dim大小的内存单元*/
    if(!A->bounds)
        exit(-1);
    va_start(ap,dim);                                         /*dim是一个固定参数,即可变参数的前一个参数*/
    for(i=0;i<dim;++i)
    {
        A->bounds[i]=va_arg(ap,int);                 /*依次取得可变参数,即各维的长度*/
        if(A->bounds[i]<0)
            return -1; // 在math.h中定义为4
        elemtotal*=A->bounds[i];                         /*得到数组中元素总的个数*/
    }
    va_end(ap);
    A->base=(DataType *)malloc(elemtotal*sizeof(DataType));        /*为数组分配所有元素分配内存空间*/
    if(!A->base)
        exit(-1);
    A->constants=(int *)malloc(dim*sizeof(int));         /*为数组的常量基址分配内存单元*/
    if(!A->constants)
        exit(-1);
    A->constants[dim-1]=1;
    for(i=dim-2;i>=0;--i)
       A->constants=A->bounds[i+1]*A->constants[i+1]; //求[/i][/i][/i] “数组存储映像常量基地址” 的原理[i][i][i][i]
    return 1;
}
void DestroyArray(Array *A)
/*销毁数组。将动态申请的内存单元释放*/
{
    if(A->base)
        free(A->base);
    if(A->bounds)
        free(A->bounds);
    if(A->constants)
        free(A->constants);
    A->base=A->bounds=A->constants=NULL;                /*将各个指针指向空*/
    A->dim=0;
}
int GetValue(DataType *e,Array A,...)
/*返回数组中指定的元素,将指定的数组的下标的元素赋值给e*/
{
    va_list ap;
    int offset;
    va_start(ap,A);
    if(LocateArray(A,ap,&offset)==0)         /*找到元素在数组中的相对位置*/
        return 0;
        va_end(ap);
    *e=*(A.base+offset);                         /*将元素值赋值给e*/
    return 1;
}
int AssignValue(Array A,DataType e,...)
/*数组的赋值操作。将e的值赋给的指定的数组元素*/
{
    va_list ap;
    int offset;
    va_start(ap,e);
    if(LocateArray(A,ap,&offset)==0)         /*找到元素在数组中的相对位置*/
        return 0;
        va_end(ap);
    *(A.base+offset)=e;                         /*将e赋值给该元素*/
    return 1;
}
int LocateArray(Array A,va_list ap,int *offset)
/*根据数组中元素的下标,求出该元素在A中的相对地址offset*/
{
    int i,instand;
    *offset=0;
    for(i=0;i<A.dim;i++)
    {
        instand=va_arg(ap,int);
        if(instand<0||instand>=A.bounds[i])
            return 0;
        *offset+=A.constants * instand; [/i][/i][/i][/i][/i][i][i][i][i][i]
    }
    return 1;
}


[/i][/i][/i][/i][/i]

最佳答案

查看完整内容

dim是用户指定数组大小, 按这个大小动态分配空间 , 把申请空间基地址,大小等信息,Init给Araay 使用Araay Init Ok data, 对数组地址偏移进行操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-4 15:18:09 | 显示全部楼层
dim是用户指定数组大小, 按这个大小动态分配空间 , 把申请空间基地址,大小等信息,Init给Araay
使用Araay  Init Ok data, 对数组地址偏移进行操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-14 09:14:59 | 显示全部楼层
:P我看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-16 23:51:06 | 显示全部楼层
建议楼主自学点数学知识,没你想像的那么难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-17 18:42:53 | 显示全部楼层
你这样的版式看着很头晕哎。。看两行就看不下去了。。
而且楼主你没有定义DataType
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-18 14:40:01 | 显示全部楼层
哎,学好数理化,数组我不怕:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-7-28 23:55:38 | 显示全部楼层
regergerher
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-26 15:59:16 | 显示全部楼层

学习,支持一下!加油:loveliness:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-2 23:40:51 | 显示全部楼层
慢慢来吧,只能这样了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 23:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表