Главная страница
    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.48 MB
Время: 0.063 c
3-1163414839
john81
2006-11-13 13:47
2007.02.18
Fast Reports и Crystal Reports


2-1170270761
ice321i
2007-01-31 22:12
2007.02.18
Кодировка


15-1169626096
Empleado
2007-01-24 11:08
2007.02.18
Вот где красотища-то!


2-1170091537
_newman_
2007-01-29 20:25
2007.02.18
Как узнать путь к директории из которой запущена программа.


15-1170063252
sniknik
2007-01-29 12:34
2007.02.18
Подработка.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский