Главная страница
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.033 c
4-1158174928
Teenager
2006-09-13 23:15
2007.02.18
Изменение цвета фона чужого окна


15-1170157396
Janniy
2007-01-30 14:43
2007.02.18
Вакансия программист Delphi+ MsSQL + ASP.NET


15-1169382005
ChainikDenis
2007-01-21 15:20
2007.02.18
Как затормозить основной поток?


15-1169798133
leonidus
2007-01-26 10:55
2007.02.18
Помогите установить в D7 компонент EmbeddedWB


15-1169667249
FIL-23
2007-01-24 22:34
2007.02.18
Коды Хемминга