Выравнивание на границу
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Нужно выровнять переменную на границу DWORD. В С так:
// Align cbAcl to a DWORD.
cbAcl = (cbAcl + (sizeof(DWORD) - 1)) & 0xfffffffc;
Пишу:
cbACL#=BAND(cbACL#+3,0fffffffcH)
Это правильно или нет? А как правильно?
Спасибо!
// Align cbAcl to a DWORD.
cbAcl = (cbAcl + (sizeof(DWORD) - 1)) & 0xfffffffc;
Пишу:
cbACL#=BAND(cbACL#+3,0fffffffcH)
Это правильно или нет? А как правильно?
Спасибо!
- Дед Пахом
- Старичок
- Сообщения: 3133
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 10 раз
- Поблагодарили: 28 раз
- Контактная информация:
Выравнивание на границу
Слова вроде все знакомые, а смысла уловить не получается. День сегодня такой, наверно.
С уважением, ДП
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Мне нужно, чтобы значение переменной cbACL# было выровнено на границу двойного слова (DWORD). Есть пример выравнивания на С. Правильно ли я перевел на Clarion?
-
- ✯ Ветеран ✯
- Сообщения: 4984
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Выравнивание на границу
Обычно вот так:
Попробуйте объявите свою переменную таким способом и ничего выравнивать не придётся. В WinAPI так работает. Но там паскалевское соглашение. Для сишного соглашения нужно в прототипе внешней функции поставить C вместо PASCAL. И то это имеет значение (судя по хелпу) только для возвращаемых из внешней функции значений (что-то там со стэком по-разному).
Код: Выделить всё
DWORD EQUATE(ULONG)
We are hard at work… for you. ![Smile :)](./images/smilies/icon_smile.gif)
![Smile :)](./images/smilies/icon_smile.gif)
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Правильно ли я понял, что ULONG автоматически выравнивается на границу DWORD?
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Отвечаю сам себе: да, с С перевел правильно. Это, действительно, работает так... Переменная выравнивается на границу DWORD.
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1378
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Выравнивание на границу
Я тоже мало что понял, но если речь о передаче структур в в процедуры С, то проще всего выравнивать руками, передаешь адрес группы, а в группе переменными BYTE (или большими, если надо выравнять на несколько байт сразу) двигаешь ту, что передаешь, куда надо https://forum.clarionlife.net:443/viewt ... f=5&t=4072
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Вспоминаем школу... ![Smile :-)](./images/smilies/icon_smile.gif)
Выравнивание на границу двойного слова означает, что АДРЕС первого байта данных переменной должен быть кратен четырем.
Соответственно, выравнивание на границу слова означает, что АДРЕС первого байта данных переменной должен быть кратен двум.
Меня смутили способ, которым это предлагает делать MSDN и правильность моего перевода этого безобразия на Clarion.
Однако, как ни странно, и то и другое оказалось правильным, в чем я и убедился...
Добавление байтов в группу изменит ее ДЛИНУ, а никак не АДРЕС первого байта, так что этот способ не пойдет...
![Smile :-)](./images/smilies/icon_smile.gif)
Выравнивание на границу двойного слова означает, что АДРЕС первого байта данных переменной должен быть кратен четырем.
Соответственно, выравнивание на границу слова означает, что АДРЕС первого байта данных переменной должен быть кратен двум.
Меня смутили способ, которым это предлагает делать MSDN и правильность моего перевода этого безобразия на Clarion.
Однако, как ни странно, и то и другое оказалось правильным, в чем я и убедился...
Добавление байтов в группу изменит ее ДЛИНУ, а никак не АДРЕС первого байта, так что этот способ не пойдет...
Выравнивание на границу
этот способ меняет адрес следующей переменной, если объявит массив байт, то в нем можно нарезать сколько угодно много переменных с любым выравниваниемConstantine писал(а): ↑16 Апрель 2018, 9:03Добавление байтов в группу изменит ее ДЛИНУ, а никак не АДРЕС первого байта, так что этот способ не пойдет...
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Зачем? Можно определить номер элемента массива, соответствующий требованию, и присвоить его адрес переменной с которой в дальнейшем работать
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
Выравнивание на границу
Можно.
Для этого нужно:
1. Получить адрес массива.
2. Проверить, кратен ли он четырем.
3. Прибавить разницу до ближайшего кратного.
4. Получить требуемое.
Напоминаю, в начале речь шла о переменной LONG, а не о массиве или группе...
В итоге, все 4 действия сделаны одной строкой...
Для этого нужно:
1. Получить адрес массива.
2. Проверить, кратен ли он четырем.
3. Прибавить разницу до ближайшего кратного.
4. Получить требуемое.
Напоминаю, в начале речь шла о переменной LONG, а не о массиве или группе...
В итоге, все 4 действия сделаны одной строкой...