Выравнивание на границу

Разработка программ на пес его знает на чем
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 13 Апрель 2018, 10:32

Нужно выровнять переменную на границу DWORD. В С так:
// Align cbAcl to a DWORD.
cbAcl = (cbAcl + (sizeof(DWORD) - 1)) & 0xfffffffc;
Пишу:
cbACL#=BAND(cbACL#+3,0fffffffcH)

Это правильно или нет? А как правильно?
Спасибо!

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2120
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

Выравнивание на границу

Сообщение Дед Пахом » 13 Апрель 2018, 11:28

Слова вроде все знакомые, а смысла уловить не получается. День сегодня такой, наверно.
С уважением, ДП

Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 13 Апрель 2018, 11:37

Мне нужно, чтобы значение переменной cbACL# было выровнено на границу двойного слова (DWORD). Есть пример выравнивания на С. Правильно ли я перевел на Clarion?

kreator
Ветеран
Сообщения: 3014
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

Выравнивание на границу

Сообщение kreator » 13 Апрель 2018, 13:59

Обычно вот так:

Код: Выделить всё

DWORD                   EQUATE(ULONG)
Попробуйте объявите свою переменную таким способом и ничего выравнивать не придётся. В WinAPI так работает. Но там паскалевское соглашение. Для сишного соглашения нужно в прототипе внешней функции поставить C вместо PASCAL. И то это имеет значение (судя по хелпу) только для возвращаемых из внешней функции значений (что-то там со стэком по-разному).
We are hard at work… for you. :)

Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 13 Апрель 2018, 14:27

Правильно ли я понял, что ULONG автоматически выравнивается на границу DWORD?

Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 13 Апрель 2018, 14:41

Отвечаю сам себе: да, с С перевел правильно. Это, действительно, работает так... Переменная выравнивается на границу DWORD.

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 760
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

Выравнивание на границу

Сообщение RaFaeL » 13 Апрель 2018, 22:50

Я тоже мало что понял, но если речь о передаче структур в в процедуры С, то проще всего выравнивать руками, передаешь адрес группы, а в группе переменными BYTE (или большими, если надо выравнять на несколько байт сразу) двигаешь ту, что передаешь, куда надо https://forum.clarionlife.net:443/viewt ... f=5&t=4072

Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 16 Апрель 2018, 9:03

Вспоминаем школу... :-)
Выравнивание на границу двойного слова означает, что АДРЕС первого байта данных переменной должен быть кратен четырем.
Соответственно, выравнивание на границу слова означает, что АДРЕС первого байта данных переменной должен быть кратен двум.
Меня смутили способ, которым это предлагает делать MSDN и правильность моего перевода этого безобразия на Clarion.
Однако, как ни странно, и то и другое оказалось правильным, в чем я и убедился...
Добавление байтов в группу изменит ее ДЛИНУ, а никак не АДРЕС первого байта, так что этот способ не пойдет...

PavelNK
Старожил
Сообщения: 215
Зарегистрирован: 15 Март 2011, 8:02

Выравнивание на границу

Сообщение PavelNK » 16 Апрель 2018, 10:15

Constantine писал(а):
16 Апрель 2018, 9:03
Добавление байтов в группу изменит ее ДЛИНУ, а никак не АДРЕС первого байта, так что этот способ не пойдет...
этот способ меняет адрес следующей переменной, если объявит массив байт, то в нем можно нарезать сколько угодно много переменных с любым выравниванием

Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 16 Апрель 2018, 12:41

Ну, тогда сначала нужно выровнять этот массив байт...

PavelNK
Старожил
Сообщения: 215
Зарегистрирован: 15 Март 2011, 8:02

Выравнивание на границу

Сообщение PavelNK » 16 Апрель 2018, 16:27

Constantine писал(а):
16 Апрель 2018, 12:41
Ну, тогда сначала нужно выровнять этот массив байт...
Зачем? Можно определить номер элемента массива, соответствующий требованию, и присвоить его адрес переменной с которой в дальнейшем работать

Constantine
Бывалый
Сообщения: 79
Зарегистрирован: 07 Февраль 2017, 16:58

Выравнивание на границу

Сообщение Constantine » 16 Апрель 2018, 16:50

Можно.
Для этого нужно:
1. Получить адрес массива.
2. Проверить, кратен ли он четырем.
3. Прибавить разницу до ближайшего кратного.
4. Получить требуемое.

Напоминаю, в начале речь шла о переменной LONG, а не о массиве или группе...
В итоге, все 4 действия сделаны одной строкой...

Ответить