MickD 发表于 2007-12-7 09:11:29


这是我们在BASIC成为OO Lite之前所拥有的。

Dnereb 发表于 2007-12-7 09:46:51

@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

Dnereb 发表于 2007-12-7 10:15:00

嗨,Berend。
同意,AutoCAD通常不接受UDT。
然而,我不会仅仅因为这个原因就直接拒绝它们。像许多封装的解决方案一样,隐藏在幕后的内容可能对调用者完全隐藏。
开发人员必须问他/她自己很多问题,例如...基于内在或Win32 API的技术?是否存在性能影响?是否存在潜在的迁移问题?给定技术的灵活性如何?它是否与问题域和基本数据类型保持良好一致?它是否避免变体(blech)?它是否容易映射到其他语言?等等。
我只是在为思考提供食物。这可能是也可能不是米克写出解决方案的最有效方式。我只是想通过确定一些选项来尽我的一份力量。我感谢你,因为你也在做同样的事情。

MickD 发表于 2007-12-7 10:59:21

米克的另一个例子,观察--
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

MickD 发表于 2007-12-7 12:35:34

我经常使用变体来传递双精度,虽然它有点慢,但有时它会派上用场,因为您可以使用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]
查看完整版本: acad的向量/矩阵函数