![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задачка. Какой код правильнее и почему ? [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.