Страница: 1 |
Страница: 1 |
Вопрос: Помогите с CopyMemory. Глючит.
Добавлено: 25.05.07 08:18
Автор вопроса: NRG_r | ICQ: 550854
два приложения "общаются" по TCP.
сервер передает следующее:
Type FI
Folder As Long
Name As String * 250
ServerPath As String * 250
Level As Long
Parent As Long
End Type
Public TreeAr() As FI
Public bt() as Byte
'...
'...
Redim bt(1011) as Byte
CopyMemory bt(0), TreeAr(i), 1012
Sock(index).WriteBytes bt, 1012
клиент принимает:
Type FI
Folder As Long
Name As String * 250
ServerPath As String * 250
Level As Long
Parent As Long
End Type
Public TreeAr() As FI
Public bt() as Byte
'...
'...
Redim bt(1011) as Byte
Sock.Readbytes bt, 1012
CopyMemory TreeAr(i), bt(0), 1012 'здесь вылетает VB IDE
причем если сделать вот так:
CopyMemory TreeAr(i), bt(0), 1
CopyMemory TreeAr(i), bt(0), 1012
то проходит несколько раз проходит, а потом все равно вылетает...массив bt доходит по TCP без искажений...для проверки делаю CopyMemory в другой такой же массив как и bt, например bt1
CopyMemory bt1(0), bt(0), 1012
проходит стабильно нормально...т.е. глюк именно с записью в массив польз.типа данных...
Можно конечно передавать всё это дело строками, но так то красивее...
Помогите победить этот CopyMemory, плиз...
Ответы
Всего ответов: 10
Номер ответа: 1
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #1
Добавлено: 25.05.07 08:36
Тяжело... третий параметр CopyMemory содержит количество копируемых байт, а не количество элементов массива
Номер ответа: 2
Автор ответа:
Champion
ICQ: 461506481
Вопросов: 38
Ответов: 88
Web-сайт:
Профиль | | #2
Добавлено: 25.05.07 08:38
насколько я знаю, копимемори, работает только с одномерными массивами
была такая же проблема, при чём у меня был массив с более 20ти пользовательскими данными)
обходился тем, что записывал массив во временный файл, потом считывал его в одномерный массив и передавал клиенту
на стороне клиенте обратная процедура, принял\сохранил\считал в массив
как-то кажется слышал, что можно это дело делать и прямым путём)
Номер ответа: 3
Автор ответа:
NRG_r
ICQ: 550854
Вопросов: 3
Ответов: 6
Профиль | | #3
Добавлено: 25.05.07 08:40
так то я знаю элемент массива польз.тип данных FI как раз занимает 1012 байт...и при выполнении для проверки в серверной части кода
CopyMemory bt(0), TreeAr(i), 1012
CopyMemory TreeAr(i), bt(0), 1012
элемент TreeAr(i) получается такой же как и исходный...т.е. с этим всё нормуль как раз...
Номер ответа: 4
Автор ответа:
NRG_r
ICQ: 550854
Вопросов: 3
Ответов: 6
Профиль | | #4
Добавлено: 25.05.07 08:41
дык это и так одномерный массив...вы чего парни...
Номер ответа: 5
Автор ответа:
Champion
ICQ: 461506481
Вопросов: 38
Ответов: 88
Web-сайт:
Профиль | | #5
Добавлено: 25.05.07 08:45
забыл уточнить, у меня пользовательский тип, был не с string * x, а просто string
кстати у тебя структура FI - занимает 512 байт, почему ты перелаёшь 1012
Номер ответа: 6
Автор ответа:
NRG_r
ICQ: 550854
Вопросов: 3
Ответов: 6
Профиль | | #6
Добавлено: 25.05.07 08:48
to champion:
не забываем что это unicode...символ в строке занимает 2 байта...можете проверить, выполнив следующий код:
LenB(TreeAr(i))
итого получается 250*2*2+3*4=1012
Номер ответа: 7
Автор ответа:
Champion
ICQ: 461506481
Вопросов: 38
Ответов: 88
Web-сайт:
Профиль | | #7
Добавлено: 25.05.07 08:55
честно?
ну не знаю, только что сохранил в файл
Filename As String * 115:
ID As Integer:
Size As Single:
genre(4) As Byte:
country(4) As Byte:
Year As Byte:
PlaceIn As Byte:
Director As String * 230:
InRoles As String * 470:
Manufacture As String * 132:
Description As String * 1024:
End Type
файл занимает ровно 1989 байт
может мы говорим о разных вещах?
Номер ответа: 8
Автор ответа:
NRG_r
ICQ: 550854
Вопросов: 3
Ответов: 6
Профиль | | #8
Добавлено: 25.05.07 08:58
to champion
в памяти string занимает 2 байта...ты измеряй не файлом...а именно функцией LenB() сам увидишь...
Номер ответа: 9
Автор ответа:
Champion
ICQ: 461506481
Вопросов: 38
Ответов: 88
Web-сайт:
Профиль | | #9
Добавлено: 25.05.07 09:05
ыыыыы) ...просто не было надобности измерять, сколько в памяти занимает)
проверил .. lenb(BaseByte.DataB(1)) = 3960
Номер ответа: 10
Автор ответа:
NRG_r
ICQ: 550854
Вопросов: 3
Ответов: 6
Профиль | | #10
Добавлено: 25.05.07 09:34
всё вылечил...тупость полная...
[CODE
Type FI
Folder As Long
Name As String * 250
ServerPath As String * 250
Level As Long
Parent As Long
End Type
Public TreeAr() As FI
Public bt() as Byte
'...
'...
Redim bt(1011) as Byte
Sock.Readbytes bt, 1012
TreeAr(i).Folder = 0 'без этого вылетало
TreeAr(i).Name = "" 'без этого вылетало
TreeAr(i).ServerPath = "" 'без этого вылетало
TreeAr(i).Level = 0 'без этого вылетало
TreeAr(i).Parent = 0 'без этого вылетало
CopyMemory TreeAr(i), bt(0), 1012
[/CODE]
всем спасибо