Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Задачка. Какой код правильнее и почему ? [D7]


Project1 ©   (2004-12-23 01:46:00) 

 SetLength(Result, n);
 Read(Result[1], n);

или
 SetLength(Result, n);
  Read(Pointer(Result)^, n);

Или это одно и тоже ?
Result - это string.


GuAV   (2004-12-26 13:18:00) [1]

Anatoly Podgoretsky ©   (26.12.04 13:13) [10]

А зачем ? если второй параметр TStream.Read равен 0, то в переменную должно быть записано 0 байт, т.е. вообще ничего не записано. Т.е.  IMHO проверка if n = 0 then Exit излишня.


Anatoly Podgoretsky   (2004-12-26 13:13:00) [2]

Project1   (23.12.04 01:46)  
Оба неправильных, должно быть
if n = 0 then Exit;


Project1   (2004-12-26 04:08:00) [3]


> GuAV ©   (23.12.04 12:36) [7]



> Я рекомендую первый вариант, т.к. он не зависит от внутреннего
> представления строк, вто время как второй использует то,
> что строка - это указатель.

Проблема в том, что первый вариант даёт ошибку, при включённой в насктройках опции Рэнджь чек. Нету Result[1], когда n := 0 .


GuAV   (2004-12-23 12:43:00) [4]

GuAV ©   (23.12.04 12:36) [7]
т.к. при Count = 0 в Read не делает ни чтение ни запись этой переменной.


Конечно, зависит от реализации TStream.Read для данного наследника TStream, но не должен делать ни чтение ни запись этой переменной.


GuAV   (2004-12-23 12:36:00) [5]

Project1   (23.12.04 2:12) [4]
А для каких не работает второй ? И что будет при n = 0 ?


Второй не работает, если строки ShortString, например если включиь {$H-}.

подробнее по string + F1

Project1   (23.12.04 2:12) [4]
И что будет при n = 0 ?


в случае shortstring - страшного ничего, Buf будет корректным.

в случае long string - передача nil^ как var параметра. Любые попытки обращения к значению этого параметра (чтение или запись) приведут к AV. Тем не менее ничего плохого не будет, т.к. при Count = 0 в Read не делает ни чтение ни запись этой переменной.

Я рекомендую первый вариант, т.к. он не зависит от внутреннего представления строк, вто время как второй использует то, что строка - это указатель.


Project1   (2004-12-23 04:48:00) [6]

Мастера ! Скажите своё веское слово !


Project1   (2004-12-23 02:25:00) [7]

Рид - это

procedure TBlfBlaBla.Read(var Buf; Count: Longint);
begin
  FStream.Read(Buf, Count);
end;


Project1   (2004-12-23 02:12:00) [8]


> GuAV ©   (23.12.04 02:08) [2]
> Первый прваильный, т.к. работает и для коротких и для длиных
> строк.

А для каких не работает второй ? И что будет при n = 0 ?


GuAV   (2004-12-23 02:10:00) [9]

PS: если Read это стандартная процедура Read а не TStream.Read, то согласен с [1]


GuAV   (2004-12-23 02:08:00) [10]

Первый прваильный, т.к. работает и для коротких и для длиных строк.


Gero   (2004-12-23 01:56:00) [11]


> Result[1]

Это char.

> Pointer(Result)^

А это string.


Наверх

Титульная страница Поиск, карта сайта Написать письмо