Выравнивание структур. Не хочу!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Выравнивание структур. Не хочу!

Сообщение GSerg » 14.07.2004 (Ср) 9:17

Что за ерунда...

Имеется стуктура, переведённая с C++. Правильность перевода подтверждаю. В C++ используется #pragma pack(1), в дельфийском аналоге - packed record. То есть все мемберы идут впритык. Вот она:
Код: Выделить всё
Type MODULE_DESCR_E440
    TypeSize As Integer                 ' размер структуры
    SerialNumber(0 To 8) As Byte        ' серийный номер
    ModuleName(0 To 6) As Byte          ' название платы
    Revision As Byte                    ' ревизия платы
    Dsp_Type(0 To 4) As Byte            ' тип установленного DSP
    IsDacPresented As Byte              ' флажок наличия ЦАП
    QuartzFrequency As Long             ' частота кварца в Гц
    ReservedWord(0 To 12) As Byte       ' зарезервировано
    CalibrKoefAdc(0 To 7) As Integer    ' корректировочные коэф. для АЦП
    CalibrKoefDac(0 To 3) As Integer    ' корректировочные коэф. для ЦАП
End Type


Спрашивается, какого ...
Так вот, какого... до QuartzFrequency всё впритык, а сам QuartzFrequency отстоит от предыдущего мембера на 3 выравнивающих байта?

Проблема-то в том, что структура определяется на VB, а указатель на неё идёт в апишку, которая эту ботву заполняет. Апишка-то заполняет всё впритык! А VB потом читает всякую ерунду, из-за сдвига в 3 байта. Приходится все нижеследующие мемберы получать через GetMem4.
Но это же криво! К тому же, как узнать, будет ли иметь место это выравнивание в каждом конкретном случае? Не проверять же каждую новую структуру помемберно.

Вот. Какие мысли будут?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 14.07.2004 (Ср) 11:12


Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 14.07.2004 (Ср) 11:17

off: :roll:
Ничего полезного добавить не могу. У самого похожая (или та же) проблема http://bbs.vbstreets.ru/viewtopic.php?t=8718
Так что такое GetMem4? Есть ли на это описание? (Может, это мне поможет в своей задаче)

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 14.07.2004 (Ср) 12:56

Leon_ писал(а):off: :roll:
Ничего полезного добавить не могу. У самого похожая (или та же) проблема http://bbs.vbstreets.ru/viewtopic.php?t=8718
Так что такое GetMem4? Есть ли на это описание? (Может, это мне поможет в своей задаче)

http://basicproduction.nm.ru/poke.rar

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.07.2004 (Ср) 17:59

Ага, помогло.
И почему я решил, что в VB нет выравнивания? Слишком долго я, похоже, работал со структурами, исключительно лонги содержащими :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, SemrushBot и гости: 12

    TopList