Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизИспользование 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.044 c