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

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

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

Сообщение Constantine »

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

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

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

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

Сообщение Дед Пахом »

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

Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine »

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

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

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

Сообщение kreator »

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

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

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

Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine »

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

Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine »

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

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

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

Сообщение RaFaeL »

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

Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine »

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

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

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

Сообщение PavelNK »

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

Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine »

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

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

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

Сообщение PavelNK »

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

Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

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

Сообщение Constantine »

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

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

Ответить