![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Пишу в последнее время на Си, так что недавно мне довольно долго выедал мозг один мой косяк.
Короче, есть дефайн: CODE #define STRUCT_SIZE(z) (z * sizeof(mystruct)) mystruct - некая структура, которая в данном случае нам не интересна. Вызывается оно примерно так: CODE WriteFile(fl, pstruct, STRUCT_SIZE(count), &dw, NULL); где: pstruct - указатель на начало структуры; count - количество элементов mystruct в этой структуре. Логично, что для получения размера всего массива в байтах нужно размер одного элемента стуктуры умножить на их количество. Всё было отлично, пока я не дошёл до места, где в структуре больше элементов, чем count - есть ещё несколько зарезервированных, которые идут в конце: CODE WriteFile(fl, pstruct, STRUCT_SIZE(count + 2), &dw, NULL); В результате структура пишется в файл не целиком, а очень куцо - только самое начало. Я довольно долго тупил удивляясь "чудесам на виражах", пока до меня не дошло, что определённый мною макрос STRUCT_SIZE(), на самом деле разворачивается в: CODE (z * sizeof(mystruct)) => (count + 2 * sizeof(mystruct)) Что при приоритете операции умножить даёт: CODE count + (2 * sizeof(mystruct)) Так что не наступайте на эти грабли и, если пишите макрос, то не забывайте всунуть переменную макроса (z) в скобки: CODE #define STRUCT_SIZE(z) ((z) * sizeof(mystruct)) |
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 20:45 |