php 数组 双向链表,一个字节数组双向链表类,主要针对串口通讯而开发的
[Visual Basic] 純文本查看 復(fù)制代碼'一個雙向鏈表類 (StrList)
Option Explicit
'分配,清除內(nèi)存
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
'復(fù)制內(nèi)存
Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private headNode As clsUartNode '頭節(jié)點
Private curNode As clsUartNode '當(dāng)前節(jié)點
Private endNode As clsUartNode '尾巴節(jié)點
Private mvarSize As Integer '節(jié)點總數(shù)
Private bolFlagGetCmd As Boolean '是否有指令被取出,true為是
'申請內(nèi)存
Private Function MemAlloc(ByVal dwBytes As Long)
MemAlloc = GlobalAlloc(GMEM_FIXED Or GMEM_ZEROINIT, dwBytes)
End Function
'**************************************************************************************************************
'Public Sub Add(bytArrSendData() As Byte)
'功能 : 增加節(jié)點,bytArrSendData(Byte) 將值加入到鏈表中
'參數(shù) : bytArrSendData() 發(fā)送指令的數(shù)組,以0為最小下標(biāo);
' intSendDataCount 發(fā)送數(shù)據(jù)字節(jié)數(shù);
' lngModbusAddr 發(fā)送數(shù)據(jù)的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 '新增一個節(jié)點
Dim tPtr As Long
Dim intSendArrCount As Integer
intSendArrCount = UBound(bytArrSendData) + 1
tPtr = MemAlloc(intSendArrCount)
If tPtr = 0 Then Err.Raise 0, , "內(nèi)存不足"
CopyMemory ByVal tPtr, bytArrSendData(0), intSendArrCount '節(jié)點賦值
node.ptrSendData = tPtr
node.lngModbusAddr = lngModbusAddr
node.intCtlIndex = intCtlIndex
node.ParaType = enmParaType
node.intSendDataCount = intSendArrCount
Set node.preNode = endNode '新節(jié)點加入到鏈表尾巴 Node-->endNode-->
If headNode Is Nothing Then '加入的節(jié)點是第一個節(jié)點的處理
Set headNode = node '頭節(jié)點就是這一個
Set curNode = node '當(dāng)前節(jié)點是第一個節(jié)點
Else
Set endNode.nextNode = node '新加的話,終節(jié)點指向本節(jié)點
End If
Set endNode = node
mvarSize = mvarSize + 1
End Sub
'**************************************************************************************************************
'Public Sub Clear()
'功能 : 清除所有節(jié)點
'參數(shù) :
'返回 : 無
'修改歷史 :
'**************************************************************************************************************
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 '頭節(jié)點下移
tPtr = headNode.ptrSendData
Call GlobalFree(tPtr)
tPtr = headNode.ptrRecvData
Call GlobalFree(tPtr)
Set headNode = curNode
If i <> mvarSize Then
Set headNode.preNode = Nothing '頭節(jié)點清除
End If
Next
End If
Set headNode = Nothing
Set endNode = Nothing
Set curNode = Nothing
mvarSize = 0
bolFlagGetCmd = False
End Sub
……
總結(jié)
以上是生活随笔為你收集整理的php 数组 双向链表,一个字节数组双向链表类,主要针对串口通讯而开发的的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle 批量修改表结构,关于Ora
- 下一篇: 医院病案档案管理系统php_医疗产品经理