Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: afhelp.in.ua
 Профиль | | #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-сайт: afhelp.in.ua
 Профиль | | #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-сайт: afhelp.in.ua
 Профиль | | #7
Добавлено: 25.05.07 08:55
честно?
ну не знаю, только что сохранил в файл
Public Type videoTypeByte:
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-сайт: afhelp.in.ua
 Профиль | | #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]
всем спасибо :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам