Скопировать массив...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Скопировать массив...

Сообщение X-BOND » 08.08.2003 (Пт) 14:54

Народ, подскажите как можно скопировать значения одного массива в другой?

Тип данных такой:
Код: Выделить всё
Type MyType
F As Boolean
T As String
....
End Type



Вопрос наверно, примитивный, но я раньше с этим не сталкивался.

Возможно прийдется использовать CopyMemory?

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 08.08.2003 (Пт) 15:29

CopyMemory
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 08.08.2003 (Пт) 15:40

Никогда не пользовался CopyMemory
Как это реализовать?

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 08.08.2003 (Пт) 15:43

Dim arr1() As ...
Dim arr2() As ...

Copymemory arr1(0), arr2(0), UBound(arr1) - LBound(arr1) + 1

это типа
arr1 = arr2
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 08.08.2003 (Пт) 16:46

По моему это не работает, поскольку копирует только значения с адресом 0. К тому же UBound(arr1) - LBound(arr1) + 1 всегда будет 1. (я там поставил просто UBound(arr1))
Практически ничего не вышло :(

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 08.08.2003 (Пт) 16:51

Попробуй так:
Код: Выделить всё
Copymemory arr1(0), byval arr2(0), byval UBound(arr1)

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 08.08.2003 (Пт) 18:01

Aleksej писал(а):Попробуй так:
Код: Выделить всё
Copymemory arr1(0), byval arr2(0), byval UBound(arr1)


Arr2(0) - НЕ ДОЛЖНО БЫТЬ BYVAL

Код: Выделить всё
Private Sub Form_Load()
    Dim a() As Long
   
    ReDim a(4)
   
    MsgBox UBound(a) - LBound(a) + 1 '5
End Sub



А лучше


Код: Выделить всё
Dim arr1() As ...
Dim arr2() As ...

Copymemory arr1(0), arr2(0),( UBound(arr1) - LBound(arr1) + 1 ) * Lenb(arr1(0))
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 08.08.2003 (Пт) 20:09

Не работает :roll:
Кстати, размер массива фиксирован (128)
Пример реально работающий есть?

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 08.08.2003 (Пт) 21:39

X-BOND писал(а):Не работает :roll:
Кстати, размер массива фиксирован (128)
Пример реально работающий есть?

Массив надеюсь не стрингов?
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 08.08.2003 (Пт) 21:57

Код: Выделить всё
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


Private Sub Form_Load()
    Dim arr1() As Long
    Dim arr2() As Long
   
    ReDim arr1(5)
    ReDim arr2(5)
   
    arr2(2) = 3
   
    CopyMemory arr1(0), arr2(0), (UBound(arr1) - LBound(arr1) + 1) * LenB(arr1(0))
    Print arr1(2) '3
End Sub
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 11.08.2003 (Пн) 14:09

Тип данных я указал в начале
там есть и String, Integer и Flag.

Я пробовал так:

Код: Выделить всё
Dim Arr(0 to 128) as MyType
Dim Cop(0 to 128) as MyType

CopyMemory Cop(0).F, ByVal Arr(0).F, UBound(Cop().F)
CopyMemory Cop(0).V, ByVal Arr(0).V, UBound(Cop().V)
....


Флаги и числа вроде скопировало, а на строке прога вылетает без всяких предупреждений.
По-моему стринги переменной длины нельзя здесь использовать.
Или я ошибаюсь?

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 11.08.2003 (Пн) 17:36

for i=1 to 128
array2(i)=array1(i)
next

Тип массива значения не имеет, даже если он пользовательский.

Медленнее, но...
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

GoGosha
Постоялец
Постоялец
 
Сообщения: 642
Зарегистрирован: 02.08.2002 (Пт) 9:14
Откуда: Russia

Сообщение GoGosha » 11.08.2003 (Пн) 19:04

Просто если стринг, то действительно легче циклом сделать(тамж элементы массива разного размера)
http://poetry.mooo.com
http://poetry.myboard.info
«Человек есть нечто, что до́лжно превзойти» (Ф. Ницше)

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 11.08.2003 (Пн) 19:24

На всякий случай:

Код: Выделить всё

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim sSave As String, Cnt As Long, T As Long, Pos As Long, Length As Long
    Const mStr = "Hello "
    Length = Len(mStr)
    sSave = Space(5000 * Length) 'make buffer for justified comparison
    'Get the current tickcount
    T = GetTickCount
    Pos = 1
    sSave = Space(5000 * Length)
    For Cnt = 1 To 5000
      Mid(sSave, Pos, Length) = mStr
      Pos = Pos + Length
    Next Cnt
    'Show the results
    MsgBox "It took Visual basic" + Str$(GetTickCount - T) + " msecs. to add 5000 times a string to itself."
    'Get the current tickcount
    T = GetTickCount
    Pos = 0
    sSave = Space(5000 * Length)
    For Cnt = 1 To 5000
        CopyMemory ByVal StrPtr(sSave) + Pos, ByVal StrPtr(mStr), LenB(mStr)
        Pos = Pos + LenB(mStr)
    Next Cnt
    'Show the results
    MsgBox "It took CopyMemory" + Str$(GetTickCount - T) + " msecs. to add 5000 times a string to itself."
End Sub


The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.08.2003 (Вт) 6:58

Вы будете смеяться, но API в последнем примере работает медленнее VB!
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ilya Vasilyev
Постоялец
Постоялец
 
Сообщения: 820
Зарегистрирован: 06.08.2002 (Вт) 5:36
Откуда: Russia, Omsk

Сообщение Ilya Vasilyev » 12.08.2003 (Вт) 10:14

Хм... друзья, а почему нельзя объявить вторую переменную того же типа и присвоить ей значение первой

Dim A As MyType
Dim B As MyType

A = B

Или я не понял сути вопроса?
Изображение
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 12.08.2003 (Вт) 20:26

Потому что здесь массив...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 4

    TopList