iCAx开思工具箱

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 25429|回复: 4
打印 上一主题 下一主题

ProArray 对象理解

[复制链接]
跳转到指定楼层
楼主
发表于 2009-3-7 18:41:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册登录,享用更多网站功能!

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

x
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;
}
运行结果如下:

resault.jpg (60.75 KB, 下载次数: 9)

resault.jpg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 支持支持
沙发
发表于 2009-9-6 14:14:55 | 只看该作者

马上注册登录,享用更多网站功能!

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

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

马上注册登录,享用更多网站功能!

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

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

马上注册登录,享用更多网站功能!

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

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

马上注册登录,享用更多网站功能!

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

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

本版积分规则

手板模型制作,在线3D打印服务

QQ|小黑屋|手机版|开思工具箱 CAD工具箱_CAM工具箱  

GMT+8, 2024-12-22 23:34 , Processed in 0.015891 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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