Delphi, Asm, C, WinAPI, PHP, ..., FAQ |
Добро пожаловать, гость ( Вход | Регистрация )
Delphi, Asm, C, WinAPI, PHP, ..., FAQ |
-=CHE@TER=- |
Jan 5 2007, 00:35
Сообщение
#1
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
-=CHE@TER=- |
Nov 23 2013, 17:38
Сообщение
#2
|
Walter Sullivan Группа: Root Admin Сообщений: 1,361 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 314 раз(а) |
Пишу в последнее время на Си, так что недавно мне довольно долго выедал мозг один мой косяк.
Короче, есть дефайн: 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)) |
Упрощённая версия | Сейчас: 6th October 2024 - 03:50 |