Автор вопроса: -АлександР- | Web-сайт:sham.clan.su
двумерных массивов типа Single
Как объединить их значения без прохождения в цикле и поочередного присвоения?
может есть функция какая?
делаю так:
Public Function Stack(A() As Single, B() As Single) As Single()
Dim fStack() As Single
ReDim fStack(UBound(A, 1) + UBound(B, 1), UBound(A, 2))
fStack = A
Public Function Stack(a() As Single, b() As Single) As Single()
Dim fStack() As Single
ReDim fStack(UBound(a, 1) + UBound(b, 1), UBound(a, 2))
CopyMemory ByVal VarPtr(fStack(11, 0)), ByVal VarPtr(b(0, 0)), LenB(b(0, 0)) * UBound(b, 1)
Stack = fStack
End Function
Private Sub Form_Load()
Dim a() As Single
Dim b() As Single
ReDim a(10, 0)
ReDim b(11, 0)
b(0, 0) = 33.44
Dim ret() As Single
ret = Stack(a(), b())
Debug.Print ret(11, 0)
погоди с кодом, важен принцип.
а он таков:
адрес в памяти первого (нулевого) элемента массива
есть адрес самого массива,
скопировать один массив(SOURSE) в другой(DEST) в твоем случае это:
определить адрес элемента в DEST куда будет записан первый(нул.) элемент SOURSE, определить длину в байтах всего массива SOURSE,
ну и не выходить за пределы диапазона, иначе крах.
Option Explicit
Option Base 1' независимо
Private Declare Sub CpyAdr Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Private Sub Command1_Click()
Dim A() As Single
Dim B() As Single
Dim R() As Single
Dim lb As Long
ReDim A(3, 11)
ReDim B(3, 21)
lb = LBound
Dim x As Integer
Dim y As Integer
For x = lb To UBound(A, 1)
For y = lb To UBound(A, 2)
A(x, y) = x + (y) / 10
'  ebug.Print "A " & A(x, y)
Next
Next
For x = lb To UBound(B, 1)
For y = lb To UBound(B, 2)
B(x, y) = x + (y) / 100
' Debug.Print "B " & B(x, y)
Next
Next
'---
R() = Stack(A(), B())
'---
For y = lb To UBound(A, 2)
For x = lb To UBound(A, 1)
Debug.Print R(x, y) & " " & A(x, y)
Next
Next
For y = lb To UBound(B, 2)
For x = lb To UBound(B, 1)
Debug.Print R(x, y + UBound(A, 2) + (1 - lb)) & " " & B(x, y)
Next
Next
End Sub
Public Function Stack(A() As Single, B() As Single) As Single()
Dim fStack() As Single
Dim Au1 As Long, Au2 As Long, Bu1 As Long, Bu2 As Long
Dim lnbt1 As Long, lnbt2 As Long, adr1 As Long, adr2 As Long, adr3 As Long, adr4 As Long, optbas As Long
Au1 = UBound(A, 1): Au2 = UBound(A, 2)
Bu1 = UBound(B, 1): Bu2 = UBound(B, 2)
If (Au1 <> Bu1) Then Exit Function ' первая размерность дожна быть одинаковой !!!
adr1 = VarPtr(fStack(optbas, optbas))' адрес fStack
adr2 = VarPtr(fStack(optbas, Au2 + 1))' адрес вставки
adr3 = VarPtr(A(optbas, optbas))' адрес A
adr4 = VarPtr(B(optbas, optbas))' адрес B
1: Private Declare Sub QWERTYCpyAdrZXCVB Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
'это просто объявление синонима функции RtlMoveMemory с нужной сигнатурой.
2: Элементы массива в памяти раполагаются последовательно так:
A(0,0) A(0,1) A(0,2) ... A(1,0) A(1,1) A(1,2)...
это означает что правая размерность изменяется быстрее, если у тебя правые размерности одинаковые
тогда нужно предусмотреть постраничную запись.