在Pascal语言下实现动态数组和大数组的讨论(二)

访问元素的基本原理
Segment := Seg(Buffer^);
Offset := Ofs(Buffer^);
......
_Temp := Ptr(Segment, Offset + (_Index - 1) * AtomSize);
Move(_Temp^, _Val, AtomSize);
Get := @_Val;
......
而Segment和Offset的作用除了可以减少调用函数的时间之外,
还有一个作用就是判断类有没有调用构造函数。
在构造的时候,可以把分配好的空间的段地址和偏移地址,
赋值给Segment和Offset。用这个可以判断构造函数是否被运行。
Function    TDynamicArray.Ready : Boolean;
Begin
     Ready := (Segment = Seg(Buffer^)) and (Offset = Ofs(Buffer^));
End;

这是我编写的一个类,实现了动态数组,而可分配空间最大只有65535个字节。
但是至少实现了一种访问指针的较为基本的方法。
这个方法十分的不直接,程序代码的可读性非常的差。

Unit DynmcArr;
{Dynamic Array Unit Release Beta 1}
Interface
Uses Base;
Type
TDynamicArray = Object
    Public
    Constructor TDynamicArray(_AtomSize, _AtomCount : Word; Debug : Boolean);
    Function    Get(_Index : Word; Var _Val) : Pointer;
    Function    Put(_Index : Word; Var _Val) : Pointer;
    Function    Index : Word;
    Function    GetCurrent(Var _Val) : Pointer;
    Function    SetCurrent(Var _Val) : Pointer;
    Function    Prior(Var _Val) : Pointer;
    Function    Next (Var _Val) : Pointer;
    Destructor Free;
    Function    Ready : Boolean;
    Private
    Buffer      :^Char;
    __Index     : Word;
    AtomSize    : Word;
    AtomCount   : Word;
    _Temp       :^Char;
    Segment     : Word;
    Offset      : Word;
    End;
Implementation
Constructor TDynamicArray.TDynamicArray(_AtomSize, _AtomCount : Word; Debug : Boolean);
            Var L : Longint;
Begin
     AtomSize   := _AtomSize;
     AtomCount := _AtomCount;
     L          := _AtomSize;
     L          := L * _AtomCount;
     If (L > $FFFF) then
        Begin
        Writeln('Dynamic Class Interval Error #001 Memory Overflow!');
        Halt(0);
        End
     else
        If (MaxAvail < AtomSize * AtomCount) then
           Writeln('Dynamic Class Interval Error #003 Not Enough Memory!')
        else
           Begin
           GetMem(Buffer, AtomSize * AtomCount);
           FillChar(Buffer^, AtomSize * AtomCount, 0);
           Segment := Seg(Buffer^);
           Offset := Ofs(Buffer^);
           __Index := 1;
           If Debug then
              Begin
              Writeln('Dynamic Avail Information :');
              Writeln('Segment       Address :', WordToHex(Segment) : 6, 'H');
              Writeln('Offset        Address :', WordToHex(Offset) : 6, 'H');
              Writeln('Class Avail   (Bytes) :', L                  : 7);
              Writeln('Current Index Locate At', __Index:7);
              End;
           End;
End;
Function    TDynamicArray.Get(_Index : Word; Var _Val) : Pointer;
Begin
     If Not Ready then
        Begin
        Writeln('Dynamic Class Interval Error #004 Class Not Initialized!');
        Halt(0);
        End;
     If (_Index > AtomCount) then
        Begin
        Writeln('Dynamic Class Interval Error #002 Baunds Out Of Index!');
        Get := Nil;
        Halt(0);
        End
     else
        Begin
        _Temp := Ptr(Segment, Offset + (_Index - 1) * AtomSize);
        Move(_Temp^, _Val, AtomSize);
        Get := @_Val;
        End;
End;
Function    TDynamicArray.Put(_Index : Word; Var _Val) : Pointer;
Begin
     If Not Ready then
        Begin
        Writeln('Dynamic Class Interval Error #004 Class Not Initialized!');
        Halt(0);
        End;
     If (_Index > AtomCount) then
        Begin
        Writeln('Dynamic Class Interval Error #002 Baunds Out Of Index!');
        Put := Nil;
        Halt(0);
        End
     else
        Begin
        _Temp := Ptr(Segment, Offset + (_Index - 1) * AtomSize);
        Move(_Val, _Temp^, AtomSize);
        Put := @_Val;
        End;
End;
Function    TDynamicArray.Index : Word;
Begin
     If Not Ready then
        Begin
        Writeln('Dynamic Class Interval Error #004 Class Not Initialized!');
        Halt(0);
        End;
     Index := __Index;
End;
Function    TDynamicArray.GetCurrent(Var _Val) : Pointer;
Begin
     GetCurrent := Get(__Index, _Val);
End;
Function    TDynamicArray.SetCurrent(Var _Val) : Pointer;
Begin
     SetCurrent := Put(__Index, _Val);
End;
Function    TDynamicArray.Prior(Var _Val) : Pointer;
Begin
     If (__Index > 1) then Dec(__Index);
     Prior := Get(__Index, _Val);
End;
Function    TDynamicArray.Next(Var _Val) : Pointer;
Begin
     If (__Index < AtomCount) then Inc(__Index);
     Next := Get(__Index, _Val);
End;
Destructor TDynamicArray.Free;
Begin
     If Not Ready then
        Begin
        Writeln('Dynamic Class Interval Error #004 Class Not Initialized!');
        Halt(0);
        End;
     FreeMem(Buffer, AtomSize * AtomCount);
End;
Function    TDynamicArray.Ready : Boolean;
Begin
     Ready := (Segment = Seg(Buffer^)) and (Offset = Ofs(Buffer^));
End;
Begin
End.

 
CCF大数据与计算智能大赛-面向电信行业存量用户的智能套餐个性化匹配模型联通赛-复赛第名-【多分类,embedding】.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值