Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Функции и ее результат. [D7, XP]


Страницы:   1 2

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 ); // <-- Разумно ли делать так или лучше создать
> отдельную переменную?

Разумно. Это и есть отдельная переменная, специально для этих целей.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо