MoveMemory с UDT

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

MoveMemory с UDT

Сообщение pronto » 31.10.2008 (Пт) 19:35

Здравствуйте! Назрела небольшая проблемка.
Есть массив пользовательского типа. Этот UT содержит в себе объявление динамического массива с другим пользовательским типом.
В какой-то момент происходит изменение размерности второго массива. Естественно, нужно обеспечить целостную последовательность данных но MoveMemory не работает с пользовательскими типами.
Как (чем) не в цикле можно сделать перемещение данных в пределах второго массива?

Код: Выделить всё
Type S
   sA As String * 28
   sB As Long
   sC As Integer
   sD As Integer
End Type

Type R
   rA As String * 28
   rB As Long
   rC() As S
End Type

Private ER() As R

MoveMemory ER(1).rC(456), ER(1).rC(455), 128 ' молча падает
O, sancta simplicitas!

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: MoveMemory с UDT

Сообщение ANDLL » 31.10.2008 (Пт) 19:42

pronto писал(а):Здравствуйте! Назрела небольшая проблемка.
Есть массив пользовательского типа. Этот UT содержит в себе объявление динамического массива с другим пользовательским типом.
В какой-то момент происходит изменение размерности второго массива. Естественно, нужно обеспечить целостную последовательность данных но MoveMemory не работает с пользовательскими типами.
Как (чем) не в цикле можно сделать перемещение данных в пределах второго массива?

Код: Выделить всё
Type S
   sA As String * 28
   sB As Long
   sC As Integer
   sD As Integer
End Type

Type R
   rA As String * 28
   rB As Long
   rC() As S
End Type

Private ER() As R

MoveMemory ER(1).rC(456), ER(1).rC(455), 128 ' молча падает
А MoveMemory это значит не в цикле?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: MoveMemory с UDT

Сообщение pronto » 31.10.2008 (Пт) 19:52

Э-э-э-э.
Или
Код: Выделить всё
MoveMemory ER(1).rC(456), ER(1).rC(455), 128

или в цикле
Код: Выделить всё
For i = 500 To 455 Step -1
   ER(1).rC(i) = ER(1).rC(i - 1)
Next i
O, sancta simplicitas!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: MoveMemory с UDT

Сообщение pronto » 02.11.2008 (Вс) 10:03

Посоветуйте, что в такой ситуации делать?! Может реорганизовать данные, пока это несложно?
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: MoveMemory с UDT

Сообщение Хакер » 02.11.2008 (Вс) 11:07

Я, к примеру, вообще не понял суть проблемы. Зачем нужно делать MoveMemory при изменении размера (а не размерности) массива?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: MoveMemory с UDT

Сообщение pronto » 02.11.2008 (Вс) 11:12

Размерность меняется в другом месте, с этим проблем нет. Я хочу чтобы новые данные были вставлены в середину массива, для это его нужно раздвинуть. Пока, делаю это простым циклом.
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: MoveMemory с UDT

Сообщение Хакер » 02.11.2008 (Вс) 11:47

Ты путаешь размерность и размер.
Во-вторых, обяъвление в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: MoveMemory с UDT

Сообщение pronto » 02.11.2008 (Вс) 13:14

Ты путаешь размерность и размер.

НЕпростительно! :)
Во-вторых, обяъвление в студию.

Если объявления типов и используемого массива, то в первом посте (в упрощенном виде, но суть отображает).
O, sancta simplicitas!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: MoveMemory с UDT

Сообщение Хакер » 02.11.2008 (Вс) 13:17

А если нет? Наверное, если я прошу объявление чего-то, то это что-то — то, объявление чего нет в первом посте? :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: MoveMemory с UDT

Сообщение pronto » 05.11.2008 (Ср) 10:35

Объявляю в модуле:
Код: Выделить всё
Public Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDestination As Any, pSource As Any, ByVal cbLength As Long)

Type S
   sA As String * 28
   sB As Long
   sC As Integer
   sD As Integer
End Type

Type R
   rA As String * 28
   rB As Long
   rC() As S
End Type

Public ER() As R

Функцию использую в форме.
O, sancta simplicitas!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: MoveMemory с UDT

Сообщение pronto » 26.11.2008 (Ср) 16:22

Чудеса продолжаются!..

Код: Выделить всё
Type erS
   sName As String * 28
   sL As Integer
   sM As Integer

   LS As Long     
   CL As Long     
   sG As Long
End Type

Private S() As erS

Private Sub Command1_Click()
   MoveMemory S(0), S(3), ByVal SLen
   
   Debug.Print S(0).sName
End Sub


Работает!

Код: Выделить всё
Private Sub Command1_Click()
   [i]Debug.Print S(0).sName[/i]

   MoveMemory S(0), S(3), ByVal SLen
   
   Debug.Print S(0).sName
End Sub


Не работает!
Объясните, в чем тут дело? Разница только в присутствии строки Debug.Print S(0).sName...
O, sancta simplicitas!


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

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

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

    TopList