Опять по API вопросец есть...

Kotъ-Begemotъ
Дата: 12.11.2007 02:33:31
Вот смотрю пример сохранения/восстановления иконок на десктопе... И наталкиваюсь на такую интересную штуку как вызов функции CreateRemoteBuffer из процедуры SaveDesktopItemPositions.
Там ясно написано:
rembuffer := CreateRemoteBuffer(pid, $FFF);
Замечательно. Перехожу к описанию функции CreateRemoteBuffer и что я вижу?
function CreateRemoteBuffer;
begin
   RemoteBufferAddr := nil;
   hProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
   if (hProcess = 0) then
     RaiseLastWin32Error;

   Result := VirtualAllocEx(hProcess,
                             nil,
                             Size,
                             MEM_COMMIT,
                             PAGE_EXECUTE_READWRITE);

   Win32Check(Result <> nil);
   RemoteBufferAddr := Result;
   BuffSize := Size;
end;
Функция-то как бы того... без параметров... А как же (pid, $FFF) в вызове?!? Это что, такой приём хитрый что ли? Но смотрю её объявление и вижу уже:
function CreateRemoteBuffer(Pid : DWord; Size: Dword): PByte;
То есть всё нормально... А что, разве можно так - объявить функцию как
function SomethingDoing(Digit: Integer): Boolean
а потом в разделе реализации писать
function SomethingDoing;
 begin
   ...
 end;
Это нормально? Или просто я такой тёмный, что привык к тому, что написанное в объявлении должно совпадать с собственно "телом" функции/процедуры? Или в данном случае автор просто пренебрегает нормальным написанием пользуясь тем, что компиллятор это жрёт? ИМХО как-то не хорошо? Или я не прав?
Tosh
Дата: 12.11.2007 02:44:42
Да - это нормально.
Можно было просто почитать хэлп по объявлению подпрограмм - там написано, что в разделе реализации не обязательно явно указывать параметры, объявленные в разделе объявлений
Kotъ-Begemotъ
Дата: 12.11.2007 02:49:57
Tosh
Да - это нормально.
Можно было просто почитать хэлп по объявлению подпрограмм - там написано, что в разделе реализации не обязательно явно указывать параметры, объявленные в разделе объявлений


Хм... Спасибо. Но ЭТОТ раздел я пожалуй читать НЕ БУДУ. Потому что, имхо, это неправильный стиль написания программ. Сугубое имхо, конечно, но когда читаешь чужой текст, написанный с этими "допущениями", становится не очень весело... Ведь форматирование кода тоже не является обязательным - компиллятору оно вообще пофиг... Короче "Несогласный я. С обоими!" ©
A.K.
Дата: 12.11.2007 02:55:16
Ты вот задумайся над заголовком топика... ну причем тут API?

Это нормально, см. здесь:
Forward and interface declarations
...
Ordinarily, a defining declaration does not have to repeat the routine’s parameter list or return type, but if it does repeat them, they must match those in the forward declaration exactly (except that default parameters can be omitted). If the forward declaration specifies an overloaded procedure or function (see Overloading procedures and functions), then the defining declaration must repeat the parameter list.
Procedure and function headers in the interface section, however, behave like forward declarations and must have defining declarations in the implementation section.


Но обычно этим пользуются только для external процедур - см. например windows.pas, там почти все процедуры имеют дефинициис опущенными параметрами. А для процедур с паскаль-реализацией - это imho просто неудобно.
Kotъ-Begemotъ
Дата: 12.11.2007 03:00:33
A.K.
Ты вот задумайся над заголовком топика... ну причем тут API?

А вот тут ты не прав! Это отсекает поток людей, которые видя в заголовке "API" пост даже не открывают не тратя своё время. ;)))

A.K.
Но обычно этим пользуются только для external процедур - см. например windows.pas, там почти все процедуры имеют дефинициис опущенными параметрами. А для процедур с паскаль-реализацией - это imho просто неудобно.


Да уж, действительно столкнулся и вижу что архинеудобно просто
A.K.
Дата: 12.11.2007 03:03:45
Kotъ-Begemotъ
А вот тут ты не прав! Это отсекает поток людей, которые видя в заголовке "API" пост даже не открывают не тратя своё время. ;)))

Хм, это новый подход: придумывать такой топикхедер, чтобы он отпугивал читателя. Обычно стараются сделать наоборот.
Kotъ-Begemotъ
Дата: 12.11.2007 03:07:08
A.K.
Хм, это новый подход: придумывать такой топикхедер, чтобы он отпугивал читателя. Обычно стараются сделать наоборот.


Ну, человек знакомый с API прочитает, а тем для кого это "танцы с бубном" и заходить не за чем вроде... По-моему логично... Хотя по-большому счёту API конечно тут не при чём, просто три топика уже за вечер, и они объеденены логически в общем. Но для не знающих что такое API читать данные топики просто потеря времени. Я уж не говорю отвечать что-то
Tosh
Дата: 12.11.2007 03:43:14
да ладно - так и скажи, что хочешь, чтобы можераторы закрыли твой топик, как не удовлетворяющий правилам форума (их не лишним будет почитать)
По поводу "удобно-неудобно" - это каждый решает для себя и не надо по этому поводу гундеж поднимать - иногда бывает удобнее не описывать параметры при реализации из-за того, что, в процессе разработки, их количество попросту неизвестно (например, когда подпрограмма пишется уже после того, как написан остальной код и неясно сколько и чего она будет использовать) ... хотя такой подход и является ошибкой проектирования, но он вполне применим
Гаджимурадов Рустам
Дата: 12.11.2007 09:17:32
Уговорили.