这是我们在BASIC成为OO Lite之前所拥有的。
@MP,
mytwocents
我认为你的解决方案有一个反面。大多数Acad函数不接受UDT函数。
例如,将WCS中的点转换为UCS坐标时可能会出现问题,反之亦然。
使用Doublearrays和variants不会有这个问题。
哦,还有一个复制初始化的索引数组的附加功能...艰难的方式。避免不了就用这个。
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (dest As Any, Source As Any, ByVal numBytes As Long)
Sub Test()
Dim P1(2) As Double
Dim P2(2) As Double
'P1(0) = 1: P1(1) = 2: P1(2) = 3
CopyArray P1, P2
MsgBox (P2(2))
End Sub
Sub CopyArray(Source() As Double, Target() As Double)
Dim NumOfBytes As Long
On Error GoTo NoElements
NumOfBytes = (UBound(Source) + 1) * LenB(Source(0))
ReDim Target(UBound(Source)) 'no need for a diffrent number of items to be a
'true copy and save checking if the target is large enough...
CopyMemory Target(0), Source(0), NumOfBytes
NoElements:
MsgBox "Empty Source array in Sub CopySourceArray() at " & Format$(Now(), "hh:nn ss"), vbCritical + vbOKOnly + vbMsgBoxSetForeground, "Void Array."
On Error GoTo 0
Exit Sub
End Sub
嗨,Berend。
同意,AutoCAD通常不接受UDT。
然而,我不会仅仅因为这个原因就直接拒绝它们。像许多封装的解决方案一样,隐藏在幕后的内容可能对调用者完全隐藏。
开发人员必须问他/她自己很多问题,例如...基于内在或Win32 API的技术?是否存在性能影响?是否存在潜在的迁移问题?给定技术的灵活性如何?它是否与问题域和基本数据类型保持良好一致?它是否避免变体(blech)?它是否容易映射到其他语言?等等。
我只是在为思考提供食物。这可能是也可能不是米克写出解决方案的最有效方式。我只是想通过确定一些选项来尽我的一份力量。我感谢你,因为你也在做同样的事情。
米克的另一个例子,观察--
Option Explicit
Type TPoint
Coord(0 To 2) As Double
End Type
Sub AnotherDemo ( )
Dim P1 As TPoint
P1.Coord(0) = 10
P1.Coord(1) = 20
Dim P2 As TPoint
P2 = P1
Debug.Print P2.Coord(0)
Debug.Print P2.Coord(1)
End Sub
我经常使用变体来传递双精度,虽然它有点慢,但有时它会派上用场,因为您可以使用ismissing来检测它是否通过。
下面的子显示变体的速度是两倍,尽管
Sub PassTheDoubly()
Dim P1(2) As Double
Dim P2(2) As Double
Dim V As Variant
Dim i As Long, j As Integer
Dim T As Single
T = Timer
P1(0) = 23: P1(1) = 23: P1(2) = 23
For i = 0 To 1000000
For j = 0 To 2
P2(j) = P1(j)
Next j
Next i
Debug.Print "double time=" & Timer - T
T = Timer
For i = 0 To 1000000
V = P1
Next i
Debug.Print "Var time=" & Timer - T
End Sub
double time=0.375
Var time=0.875
页:
1
[2]