吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4297|回复: 2
收起左侧

[其他转载] 一个字节数组双向链表类,主要针对串口通讯而开发的

[复制链接]
tclgb 发表于 2013-11-26 08:42
本帖最后由 tclgb 于 2013-11-26 08:44 编辑

发一个双向链表类,每一个节点,主要存储字节数组信息,主要针对串口通讯而开发的,分享给有需要的朋友。
显示为部分代码,完整代码请通过网盘下载。


[Visual Basic] 纯文本查看 复制代码
Option Explicit

Public preNode As clsUartNode    '指向前一个节点的指针
Public nextNode As clsUartNode    '指向下一个节点的指针
Public ptrSendData As Long     '发送数据的指针
Public intSendDataCount As Integer    '发送数据字节数
Public lngModbusAddr As Long    '发送数据的ModbusAddr
Public intCtlIndex As Long    '发送数据的控件索引
Public ParaType As ParaTypeTag '发送参数的类型
Public ptrRecvData As Long   '接收数据的指针
Public intRecvDataCount As Integer    '接收数据字节数



[Visual Basic] 纯文本查看 复制代码
'一个双向链表类 (StrList)
Option Explicit

'分配,清除内存
Private Declare Function GlobalAlloc Lib "KERNEL32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "KERNEL32" (ByVal hMem As Long) As Long
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
'复制内存
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)




Private headNode As clsUartNode   '头节点              <--Head->
Private curNode As clsUartNode    '当前节点            <--curNode-->
Private endNode As clsUartNode     '尾巴节点           <--endNode-->
Private mvarSize As Integer         '节点总数
Private bolFlagGetCmd As Boolean   '是否有指令被取出,true为是



'申请内存
Private Function MemAlloc(ByVal dwBytes As Long)
    MemAlloc = GlobalAlloc(GMEM_FIXED Or GMEM_ZEROINIT, dwBytes)
End Function

'**************************************************************************************************************
'Public Sub Add(bytArrSendData() As Byte)
'功能       :       增加节点,bytArrSendData(Byte) 将值加入到链表中
'参数       :       bytArrSendData() 发送指令的数组,以0为最小下标;
'                   intSendDataCount 发送数据字节数;
'                   lngModbusAddr 发送数据的modbus地址 ;
'返回       :       无
'修改历史   :
'**************************************************************************************************************

Public Sub Add(bytArrSendData() As Byte, lngModbusAddr As Long, Optional enmParaType As ParaTypeTag = PT_General, Optional intCtlIndex As Integer = -1)
    Dim node As New clsUartNode    '新增一个节点
    Dim tPtr As Long
    Dim intSendArrCount As Integer
    
    intSendArrCount = UBound(bytArrSendData) + 1
    tPtr = MemAlloc(intSendArrCount)
    If tPtr = 0 Then Err.Raise 0, , "内存不足"

    CopyMemory ByVal tPtr, bytArrSendData(0), intSendArrCount '节点赋值
    node.ptrSendData = tPtr
    node.lngModbusAddr = lngModbusAddr
    node.intCtlIndex = intCtlIndex
    node.ParaType = enmParaType
    node.intSendDataCount = intSendArrCount
  
    Set node.preNode = endNode  '新节点加入到链表尾巴                 Node-->endNode-->
    
    If headNode Is Nothing Then '加入的节点是第一个节点的处理
        Set headNode = node     '头节点就是这一个
        Set curNode = node      '当前节点是第一个节点
    Else
        Set endNode.nextNode = node '新加的话,终节点指向本节点
    End If
    
    Set endNode = node
     mvarSize = mvarSize + 1
End Sub

'**************************************************************************************************************
'Public Sub Clear()
'功能       :       清除所有节点
'参数       :
'返回       :       无
'修改历史   :
'**************************************************************************************************************

Public Sub Clear()
    Dim tPtr As Long
    Dim i As Integer
    
    If mvarSize > 0 Then
        For i = 1 To mvarSize
            'MsgBox i
            Set curNode = headNode.nextNode '头节点下移
            tPtr = headNode.ptrSendData
            Call GlobalFree(tPtr)
            tPtr = headNode.ptrRecvData
            Call GlobalFree(tPtr)
            Set headNode = curNode
            If i <> mvarSize Then
                Set headNode.preNode = Nothing  '头节点清除
            End If
        Next
    End If
    
    Set headNode = Nothing
    Set endNode = Nothing
    Set curNode = Nothing
    mvarSize = 0
    bolFlagGetCmd = False
End Sub

……


完整类的下载地址
http://pan.baidu.com/s/148Qft
密码: xgkx  





发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kklinan 发表于 2013-11-26 09:03
学习了!!赞
zb619176 发表于 2013-11-26 14:06
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 04:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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