找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 17338|回复: 4
打印 上一主题 下一主题

[讨论] ProArray 对象理解

[复制链接]
跳转到指定楼层
1
发表于 2009-3-7 18:41:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Pro/Toolkit 中的ProArray是个基础的东西。
今天花了些时间,用C++模拟了它的实现。
验证一下对象的实现。
希望大家指点。

源码 test.cpp
#include "stdafx.h"
#include <malloc.h>
#include <stdlib.h>
#include <memory.h>

class ProArray{
public:
    ProArray();
    ~ProArray();
   
public:
    int Alloc(int n_objs,int obj_size,int rellocation_size);
    int Free();
    int MaxCountGet(int obj_size);
    int ObjectAdd(int index,int n_objects,void *pobject);
    int ObjectRemove(int index,int n_objects);
    int SizeGet();
    int SizeSet(int size);
    void * operator [](int index);
private:
    char *p;
    int count;
    int size;
    int resize;
};

void * ProArray:perator [](int index)
{
    if(index >count )
        return NULL;
    return (p+index*size);
}

ProArray:roArray()
{
    p=NULL;
    count=0;
    size=0;
    resize=0;
}

ProArray::~ProArray()
{
    Free();
}


int ProArray::Alloc(int n_objs,int obj_size,int re_size)
{
    p=(char*)realloc(p,obj_size*n_objs);
    if(!p)
        return -1;
    count=n_objs;
    size=obj_size;
    resize=re_size;
    return 0;
}

int ProArray::Free()
{
    if(p)
        free((void *)p);
    p=NULL;
    return 0;
}

int ProArray::MaxCountGet(int obj_size)
{
    return (SizeGet()/obj_size);
}

int ProArray::ObjectAdd(int index,int n_objects,void *pobject)
{
    char *start=NULL;
    char *end=NULL;
   
    start=p+index*size;
    end=start+n_objects*size;
    if(end > p+SizeGet())
        return -1;
    memcpy(start,pobject,n_objects*size);
    return 0;
}

int ProArray::ObjectRemove(int index,int n_objects)
{
    char *start=p+index*size;
    char *end=start+n_objects*size;
   
    if(end > p+SizeGet())
        return -1;
    while (start <= end)
    {
        *start='\0';
        ++start;
    }
    return 0;
}

int ProArray::SizeGet()
{
    return (size*count);
}

int ProArray::SizeSet(int size)
{
    p=(char *)realloc(p,size);
   
    if(!p)
        return -1;
    return 0;
}

int main(int argc, char* argv[])
{
    char test[6][5]={"abcd","efgh","ijkl","mnop","qr","stu"};   
    ProArray array;
    int i;
   
    array.Alloc(6,5,1);
    array.ObjectAdd(0,6,test);
   
    for(i=0;i<array.MaxCountGet(5);i++)
        printf("array[%d] is %s.\n",i,array[i]);
   
    array.ObjectRemove(3,3);
   
    for(i=0;i<array.MaxCountGet(5);i++)
        printf("array[%d] is %s.\n",i,array[i]);
   
    return 0;
}
运行结果如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2009-9-6 14:14:55 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
3
发表于 2009-9-11 17:41:09 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
4
发表于 2009-11-9 16:29:16 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
5
发表于 2009-12-11 20:46:12 | 只看该作者

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-11-14 02:00 , Processed in 0.050120 second(s), 13 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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