Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.221.146] |
|
Сообщ.
#1
,
|
|
|
Строка находится в UDT и имеет макс. длину 10 символов. При копировании данных из байтового массива в UDT падает прога, хотя буфер под строку выделен достаточный. Что не так?
Private Type struDatUs ... s1 as String End Type Dim DatUs as struDatUs, bDat() as byte 'копирование UDT в байтовый массив iRet = LenB(DatUs) ReDim bDat(1 to iRet) CopyMemory bDat(1), DatUs, iRet 'обратное копирование DatUs.s1 = String(10*2 + 2, Chr(0)) 'выделим буфер CopyMemory DatUs, bDat(1), iRet 'тут падаем |
Сообщ.
#2
,
|
|
|
Возможно, то не так, что вы перераспределили поле под строку внутри структуры, а функция копирования никак не осведомлена/не интересуется таковыми делами и производит копирование на некое заранее подготовленное место, размер коего внезапно вырос/изменился. Т.е. при копировании в DatUs.s1 всё должно быть хорошо.
|
Сообщ.
#3
,
|
|
|
Цитата BlackSun @ Строка находится в UDT и имеет макс. длину 10 символов. При копировании данных из байтового массива в UDT падает прога, хотя буфер под строку выделен достаточный. Размер буфера под строку в данном случае никакой роли не играет, т.к. поле\член структуры s1 As String это не сама строка\буфер (размером 10*2+2), а указатель на эту строку\буфер (размером 4 байта). Почему прога падает при втором вызове CopyMemory - вопрос отдельный, но его можно обойти стороной, т.к. этот вызов вообще не к селу, т.к. он совершенно не соответствует поставленной задаче - "копирование строки переменной длины" (копируется не сама строка, а какой-то левый или null указатель на строку) |
Сообщ.
#4
,
|
|
|
Цитата BlackSun @ При копировании данных из байтового массива в UDT падает прога Ты тут копируешь из строки в байтовый массив. Для строк используй ByVal StrPtr(s): Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Sub Form_Load() Dim s As String Dim b() As Byte Dim i As Long s = "rytyerey" ReDim b(1 To LenB(s)) CopyMemory b(1), ByVal StrPtr(s), LenB(s) For i = 1 To LenB(s) Step 2 Debug.Print Chr(b(i)); Next i End Sub |
Сообщ.
#5
,
|
|
|
Попробовали? Как результат?
|
Сообщ.
#6
,
|
|
|
Цитата BlackSun @ Что не так? Как правильно сказали, в структуре лежит не строка, а указатель на неё. Сама строка лежит в другом месте. У тебя есть структура и где-то ещё строка от неё, и ты копируешь в массив структуру. Но ты не копируешь саму строку, а только её адрес. Просто полюбопытствуй, что же там попало в твой байтовый массив... |
Сообщ.
#7
,
|
|
|
Чтобы скопировать любой UDT в бинарный поток нужно юзать пайпы и стандартный Open/Put/Close.
|