psa1974
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Odysseos Цитата: Кроме того - я бы в функциях MagGetXXX var-параметры заменил на const. На уровне скомпилированного кода разницы не будет - но вот с точки зрения логики программ на Pascal/Delphi оно будет явно точней. | Позволю себе не согласиться. использование const-параметра подразумевает возможность передачи вместо указателя nil. При использовании var-параметра передача nil в качестве указателя невозможна. Пример. Берем ф-цию BOOL WINAPI MagGetWindowSource(HWND hwnd, RECT *pRect); ее можно абсолютно точно описать двумя способами: а) function MagGetWindowSource(hwnd: HWND; const pRect: PRect): Boolean; или б) function MagGetWindowSource(hwnd: HWND; var pRect: TRect): Boolean; Исходя из смысла, ф-ция должна что-то вернуть в параметре pRect. Оба описания работоспособны, однако вариант А допускает как вызов: MagGetWindowSource(fhwnd, @fRect); так и вызов: MagGetWindowSource(fhwnd, nil); и вот в таком случае у нас случится AV, когда ф-ция MagGetWindowSource попытается что-то в nil записать. Однако бывают случаи, и часто, когда, согласно документации, ф-ция может принимать в качестве буфера не только указатель на выделенную память, но и nil (например, в схеме, когда первый раз ф-ция вызывается с nil и возвращает реально необходимую длину буфера, после чего мы выделяем нужную память и вызываем ф-цию второй раз, передав ей уже указатель на эту память). Обычно такой подход используется, когда буфер - строка символов. В таком случае параметр необходимо описывать именно как const-параметр. Поэтому надо тщательно подходить к вопросу, какой тип выходного параметра использовать. Насчет Цитата: а в функциях MagSetXXX - var-параметры заменил на out | - без проблем, out - это тот же var, только не инициализированный на входе в ф-цию, хотя разницу между var и out знает только компилятор Дельфи. Для вызываемой внешней ф-ции между var и out разницы нет. Да и компилятор Дельфи такие параметры по-разному воспринимает только при передаче в качестве параметров динамических переменных - строк, массивов и при вызове методов интерфейсов. В остальных случаях разница между ними чисто эстетическая | Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 00:23 14-03-2010 | Исправлено: psa1974, 02:45 14-03-2010 |
|