![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функции и ее результат. [D7, XP]
maxon © (2008-07-07 23:07:00)I)
Например, есть такая функция:
function SomeFunc: TSomeType;
begin
// Как правильно писать
// Так:
Result:= value;
// или так:
SomeFunc:= value;
end;
Как же, все таки, правильно? Работают оба, но в чем разница?
II)
И еще, можно ли (правильно ли) использовать Result или ИМЯ_ФУНКЦИИ для работы внутри самой функции как с обычной переменной:
function SomeFunc: TSomeType;
begin
// Например
// Так:
Result:= Result * 2;
// или так:
SomeFunc:= SomeFunc * 2; // хотя, это уже рекурсия
end;
Для примера, вот функция, которая работает правильно (во всяком случаем результат верный):
function CharCount( const S: AnsiString; C: Char ): Cardinal;
var
i: Cardinal;
iLen: Cardinal;
begin
Result:= 0;
iLen:= Length( S );
if iLen < 1 then Exit;
for i:= 1 to iLen do
if S[i] = C then
Inc( Result );// <-- Разумно ли делать так или лучше создать отдельную переменную?
end;
Все это я спрашиваю еще и потому, что функции, для которых я это спрашиваю должны максимально быстро обрабатывать полученные данные, но при этом не использовать ЛИШНИХ переменных.
McSimm (2008-07-08 00:17:00) [21]тогда процедурой нельзя будет пользоваться как функцией.
> в ряде случаев лишняя переменная не нужна.
не проверял, но уверен, что когда Result не используется, она и не создается.
umbra (2008-07-08 00:17:00) [22]
> Function NewInc(value:integer = 1):integer;
> var
> Result:integer;
> begin
> Result:=Result+value;
> NewInc:=Result;
> end;
Ничего, что локальные переменные не инициализируюются?
Германн (2008-07-08 00:12:00) [23]
> Ega23 © (08.07.08 00:08) [5]
Тогда уж уместнее воспользоваться out-параметром.
Ega23 (2008-07-08 00:08:00) [24]
> ИМХО далеко не лучшая идея со стороны борланда, т.к. в ряде
> случаев лишняя переменная не нужна.
В этом ряде случаев можно воспользоваться var-параметром, ы?
maxon (2008-07-08 00:01:00) [25]Думаю ответ исчерпывающий, Спасибо всем!!!
@!!ex (2008-07-07 23:41:00) [26]> SomeFunc:= SomeFunc * 2; // хотя, это уже рекурсия
Так нельзя, потому что берется не значение, а вызывается опять функция.
> Result:= value;
Так можно. Result - это тоже самое, что если в старом паскале написать:
Function NewInc(value:integer = 1):integer;
var
Result:integer;
begin
Result:=Result+value;
NewInc:=Result;
end;
ИМХО далеко не лучшая идея со стороны борланда, т.к. в ряде случаев лишняя переменная не нужна. А ручками создать переменную Result - не проблема. Я сейчас так на сях делаю:
cVector4f cVector4f::operator* (const cMatrix4x4 &M)
{
cVector4f Result;
Result.x = x*M._11+y*M._21+z*M._31+M._41;
Result.y = x*M._12+y*M._22+z*M._32+M._42;
Result.z = x*M._13+y*M._23+z*M._33+M._43;
Result.w = x*M._14+y*M._24+z*M._34+M._44;
return Result;
};
maxon (2008-07-07 23:33:00) [27]Нашел следующий ответ:
Переменная Resultиспользуется, чтобы хранить значение результата, возвращенное функцией.
Когда функция начинается, Delphi сам автоматически создает эту переменную. Она имеет тот же самый тип, как и возвращаемый тип функции. Результат может использоваться в функции повсюду, как будто она была явно объявлена.
И еще, как дальше объясняется писать Resultвместо ИмяФункцииэто новый механизм возвращения значения.
McSimm (2008-07-07 23:11:00) [28]
> Inc( Result ); // <-- Разумно ли делать так или лучше создать
> отдельную переменную?
Разумно. Это и есть отдельная переменная, специально для этих целей.