На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Копирование строки переменной длины в
    Строка находится в UDT и имеет макс. длину 10 символов. При копировании данных из байтового массива в UDT падает прога, хотя буфер под строку выделен достаточный. Что не так?
    ExpandedWrap disabled
      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 'тут падаем
      Возможно, то не так, что вы перераспределили поле под строку внутри структуры, а функция копирования никак не осведомлена/не интересуется таковыми делами и производит копирование на некое заранее подготовленное место, размер коего внезапно вырос/изменился. Т.е. при копировании в DatUs.s1 всё должно быть хорошо.
        Цитата BlackSun @
        Строка находится в UDT и имеет макс. длину 10 символов. При копировании данных из байтового массива в UDT падает прога, хотя буфер под строку выделен достаточный.

        Размер буфера под строку в данном случае никакой роли не играет, т.к. поле\член структуры s1 As String это не сама строка\буфер (размером 10*2+2), а указатель на эту строку\буфер (размером 4 байта).
        Почему прога падает при втором вызове CopyMemory - вопрос отдельный, но его можно обойти стороной, т.к. этот вызов вообще не к селу, т.к. он совершенно не соответствует поставленной задаче - "копирование строки переменной длины" (копируется не сама строка, а какой-то левый или null указатель на строку)
        Сообщение отредактировано: leo -
          Цитата BlackSun @
          При копировании данных из байтового массива в UDT падает прога

          Ты тут копируешь из строки в байтовый массив.
          Для строк используй ByVal StrPtr(s):
          ExpandedWrap disabled
            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
          Сообщение отредактировано: Mikle -
            Попробовали? Как результат?
              Цитата BlackSun @
              Что не так?

              Как правильно сказали, в структуре лежит не строка, а указатель на неё. Сама строка лежит в другом месте.
              У тебя есть структура и где-то ещё строка от неё, и ты копируешь в массив структуру. Но ты не копируешь саму строку, а только её адрес.
              Просто полюбопытствуй, что же там попало в твой байтовый массив...
              Сообщение отредактировано: Akina -
                Чтобы скопировать любой UDT в бинарный поток нужно юзать пайпы и стандартный Open/Put/Close.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0399 ]   [ 16 queries used ]   [ Generated: 18.04.24, 23:13 GMT ]