Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.046 c
3-1164873599
Литейщик
2006-11-30 10:59
2007.02.18
Подчиненные табличные формы в стиле Acсess


2-1169717730
kilonet
2007-01-25 12:35
2007.02.18
Защита данных в EXE файле


3-1164292131
Константин_
2006-11-23 17:28
2007.02.18
групировка в sql запросе


15-1169802163
Kyn66
2007-01-26 12:02
2007.02.18
Установка компонента Webbrowser


10-1128586305
DmiSb
2005-10-06 12:11
2007.02.18
Нужен алгоритм кодирования MIME





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский