Главная страница
    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.042 c
2-1170271927
Monty
2007-01-31 22:32
2007.02.18
Помогите с шифратором(запись и чтение из файла)


2-1170397954
Lera
2007-02-02 09:32
2007.02.18
Запись в текстовый файл


2-1169820865
Destroyer
2007-01-26 17:14
2007.02.18
Утечка памяти при использовании TStrings


15-1170108239
hmmm
2007-01-30 01:03
2007.02.18
CSS


2-1170070143
Квэнди
2007-01-29 14:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский