Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.18;
Скачать: CL | DM;

Вниз

Использование Result - как переменной в функции.   Найти похожие ветки 

 
Riply ©   (2007-01-29 22:08) [0]

Здравствуйте!
Не могу понять, как "правилнее" делать.
Например у нас есть две функции поиска (ну в очень большом PByte :):
function Byte_Pos(const FindByte: Byte; const pData, pExit: PByte): PByte;
begin
Result := pData;
while (Result <> pExit) and (Result^ <> FindByte) do inc(Result);
if Result = pExit then Result:= nil;
end;

function Byte_PosTmp(const FindByte: Byte; const pData, pExit: PByte): PByte;
var
pTmp: PByte;
begin
pTmp := pData;
while (pTmp <> pExit) and (pTmp^ <> FindByte) do inc(pTmp);
if pTmp = pExit then Result:= nil else Result := pTmp;
end;

Какую из них лучше использовать и ,главное, почему ?


 
Palladin ©   (2007-01-29 23:13) [1]

на практике - монопенисуально
но первая, мне лично, больше нравится


 
tesseract ©   (2007-01-29 23:23) [2]


> Palladin ©   (29.01.07 23:13) [1]


Это если Pbyte не указатель. А так - вроде должен разрушиться при выходе из функции.


 
Palladin ©   (2007-01-30 00:27) [3]

кто должен разрушиться?
result? указатель?
как это он разрушиться?
разорвет под давлением что ли?
с какой стати вдруг?
по какой такой причине?
где это написано?

глупость, ничто никуда не разрушается...


 
Германн ©   (2007-01-30 02:27) [4]


> Riply ©   (29.01.07 22:08)
>
> Здравствуйте!
> Не могу понять, как "правилнее" делать.
> Например у нас есть две функции поиска (ну в очень большом
> PByte :):
> function Byte_Pos(const FindByte: Byte; const pData, pExit:
>  PByte): PByte;
> begin
> Result := pData;
> while (Result <> pExit) and (Result^ <> FindByte) do inc(Result);
>
> if Result = pExit then Result:= nil;
> end;
>
> function Byte_PosTmp(const FindByte: Byte; const pData,
> pExit: PByte): PByte;
> var
> pTmp: PByte;
> begin
> pTmp := pData;
> while (pTmp <> pExit) and (pTmp^ <> FindByte) do inc(pTmp);
>
> if pTmp = pExit then Result:= nil else Result := pTmp;
> end;
> Какую из них лучше использовать и ,главное, почему ?
>

In my, ну очень хамбл опиньен, заводить лишнюю переменную будь то в стэке или где ещё - не рационально.


 
Riply ©   (2007-01-30 04:55) [5]

Я полностью согласна и с [1] Palladin ©   (29.01.07 23:13)
и с "очень хамбл опиньен" от Германна :)
Но, изучая чужие исходники, снова и снова натыкаюсь на второй вариант.
Вот и стали закрадываться сомнения...


 
Сергей М. ©   (2007-01-30 08:55) [6]


> Какую из них лучше использовать и ,главное, почему ?


Оба нехороши.

Если указана область поиска в 1 байт (pData = pExit) и искомый байт находится в этой области, он не будет найден.

function Byte_Pos(const FindByte: Byte; const pData, pExit: PByte): PByte;
begin
Result := pData;
while (Result <= pExit) do
 if Result^ = FindByte then
   Exit
 else
   Inc(Result);
 Result:= nil;
end;


 
tesseract ©   (2007-01-30 10:49) [7]


> Palladin ©   (30.01.07 00:27) [3]


Не так  - Нельзя возвращать через result локальные указатели.


 
Плохиш ©   (2007-01-30 10:54) [8]


> tesseract ©   (30.01.07 10:49) [7]
> Не так  - Нельзя возвращать через result локальные указатели.

Ой, а что такое "локальные указатели"? И где они в [0]?


 
Sha ©   (2007-01-30 11:04) [9]

Вообще возможны 2 подхода:
1. Добиться экономности кода и минимума локальных переменных.
2. Оставить компилятору максимум возможности по оптимизации кода. При
 этом вводятся локальные переменные, используемые на коротких участках
 кода, а присваивание результата откладывается как можно дальше. Как
 правило, такой код получается быстрее и часто требует меньше памяти на стеке.


 
Riply ©   (2007-01-30 11:17) [10]

>[6] Сергей М. ©   (30.01.07 08:55)
Это разве скомпилируется "while (Result <= pExit) do" ?
У меня, сейчас нет возможности проверить :(
>[9] Sha ©   (30.01.07 11:04)
Т.е. при обработке большого количества данных, лучше использовать второй способ ?


 
Sha ©   (2007-01-30 11:22) [11]

> Riply ©   (30.01.07 11:17) [10]

Все зависит от поставленной цели.
Если функция длиннее 5 строк и вызывается миллионы раз, а сама никого не вызывает, я предпочту второй способ.


 
Сергей М. ©   (2007-01-30 11:23) [12]


> Riply ©   (30.01.07 11:17) [10]


Ну выполни приведение типов, вот проблема-то)

while Cardinal(Result) <= Cardinal(pExit)



Страницы: 1 вся ветка

Текущий архив: 2007.02.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.064 c
2-1170165325
Arm79
2007-01-30 16:55
2007.02.18
Каким способом лучше всего собрать из байтов Integer?


2-1170331492
Кевларвестов Семен
2007-02-01 15:04
2007.02.18
Получить эл-т многмоерного массива не зная его размерность


15-1169969602
Gydvin
2007-01-28 10:33
2007.02.18
DVD меню


1-1166712459
Чапаев
2006-12-21 17:47
2007.02.18
Constant expression violates subrange bounds


15-1169853003
eRoR_rrr
2007-01-27 02:10
2007.02.18
mIRC скрипт в Delphi код