На главную Наши проекты:
Журнал   ·   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.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> UDT CopyMemory
    ExpandedWrap disabled
      Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
          Destination As Any, Source As Any, ByVal Length As Long)
       
      Private Type struT1
       b1 as Byte
       b2 as Byte
      End Type
       
      Private Type struT2
       b1 as Byte
       b2 as Byte
       
       s1 as String
      End Type
       
      Dim V1 as struT1, V2 as struT2


    Почему не работает CopyMemory V2, V1, LenB(V1), если struT1 повторяет начало struT2?
      А кто сказал, что компоненты структуры обязаны располагаться именно в том порядке, в каком объявлены, и с тем же выравниванием? А CopyMemory работает, только копировать она тебе будет, мягко говоря, "что-то"...
        Цитата BlackSun @
        Почему не работает CopyMemory V2, V1, LenB(V1), если struT1 повторяет начало struT2?

        :lol:

        Когда я через memcpy делал интерфейсы, к которым кастовались структурные классы в 98 сях, так же недоумевал со скрытых механизмов) Хотя, в сях есть возможность устроить структуры правильно, в твоём же случае, ты лишь описываешь что будешь использовать внутри type, но не как ни то что там будет в реальности) Akina дело говорит.
          Впрочем, не вижу большой проблемы... можно же взять экземпляр структуры, взять байтовый массив поболе, да скопировать первое во второе с запасиком - и наслаждаться.
            ИМХО, проще не извращаться вот так на VB, а вынести уже всю эту шаманскую часть которую он вообще хочет реализовать "для того что было быстро" в динамическую библиотеку, и решить эти вопросы на низком уровне.
              VisualProg
              Не, это я к тому, что просто убедиться, что не всё так гладко на разных структурах. А по делу - так я, например, считаю, что в подавляющем большинстве случаев желание "сползти пониже" просто не оправдано.
                Цитата Akina @
                желание "сползти пониже" просто не оправдано.

                То есть, городить велосипеды из побайтного копирования структур - это лучше? Это всё будет напоминать борьбу с самим языком, нежели написание чего то на нём... Сама суть VB была в сокрытии и автоматизации этих страшных механизмов, и, естественно, при попытке в них вмешаться - борьба с языком неизбежна.
                  Цитата BlackSun @
                  Почему не работает CopyMemory V2, V1, LenB(V1), если struT1 повторяет начало struT2?

                  Работает. Ну здесь имеет место быть конверсия строки UNICODE->ANSI на входе и ANSI->UNICODE на выходе. Чтобы такого не было нужно передавать ByVal VarPtr(v1).
                  Цитата Akina @
                  А кто сказал, что компоненты структуры обязаны располагаться именно в том порядке, в каком объявлены, и с тем же выравниванием?

                  Именно в том порядке и с тем же выравниванием Byte-1байт, Integer-2, Long - 4 etc.
                    Цитата VisualProg @
                    То есть, городить велосипеды из побайтного копирования структур - это лучше?

                    А кто мешал использовать первый тип во втором?
                    ExpandedWrap disabled
                      Private Type struT1
                       b1 as Byte
                       b2 as Byte
                      End Type
                       
                      Private Type struT2
                       b as struT1
                       s1 as String
                      End Type
                       
                      Dim V1 as struT1, V2 as struT2
                      ' ...
                      V2.b = V1
                      Первый тип во втором сразу не был использован, а теперь чтобы так сделать, нужно переписать кучу кода и дай Бог, не наловить ошибок. Структура располагается в памяти именно так, как описана, иначе надо добавлять доп. служеб. данные и зачем её перекручивать??? В файл же она пишется именно как описана, хоть там и есть немного преобразования над строками переменной длины, но порядок тот же.

                      Цитата TheTrik @
                      онверсия строки UNICODE->ANSI
                      там строка лежит в хвосте приёмника и никак не должна влиять на процесс. Но, похоже, там пишутся ещё какие-то служеб. данные в её указатель от struT1 (выравнивание? здесь приведён пример с потолка - может и работать, в реал. проекте не работает). LenB даёт размер без выравнивания, как получить размер структуры с выравниванием в памяти или только вручную?
                      Сообщение отредактировано: BlackSun -
                        Цитата BlackSun @
                        там строка лежит в хвосте приёмника и никак не должна влиять на процесс.

                        Какая разница? Ты передаешь структуру в API и VB6 выполняет конверсию.
                        Цитата BlackSun @
                        В файл же она пишется именно как описана, хоть там и есть немного преобразования над строками переменной длины, но порядок тот же.

                        В файл пишется сериализованная структура, при желании можно сделать запись в массив сериализованной структуры.
                        Цитата BlackSun @
                        Но, похоже, там пишутся ещё какие-то служеб. данные в её указатель от struT1 (выравнивание? здесь приведён пример с потолка - может и работать, в реал. проекте не работает).

                        Так приведи пример структуры которая вызывает сбой.
                        Цитата BlackSun @
                        LenB даёт размер без выравнивания, как получить размер структуры с выравниванием в памяти или только вручную?

                        Как раз дает размер с выравниванием.
                          Цитата TheTrik @
                          VB6 выполняет конверсию
                          и в результате конверсии она меняет позицию, а точнее указатель на строку?
                            Цитата BlackSun @
                            и в результате конверсии она меняет позицию, а точнее указатель на строку?

                            Позицию не меняет, указатель меняет. Фиксированные строки соответственно уменьшаются в 2 раза.
                            Сообщение отредактировано: TheTrik -
                              А если указатель не меняет позицию, то как конверсия может повлиять на его изменение?
                                Цитата BlackSun @
                                А если указатель не меняет позицию, то как конверсия может повлиять на его изменение?

                                К примеру если строка содержит символы из разных кодовых страниц. Для фиксированных строк это соответственно сжимает размер структуры.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,2703 ]   [ 17 queries used ]   [ Generated: 19.03.24, 02:57 GMT ]