Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизЗадачка. Какой код правильнее и почему ? Найти похожие ветки
← →
Project1 (2004-12-23 01:46) [0]
SetLength(Result, n);
Read(Result[1], n);
илиSetLength(Result, n);
Read(Pointer(Result)^, n);
Или это одно и тоже ?
Result - это string.
← →
Gero © (2004-12-23 01:56) [1]
> Result[1]
Это char.
> Pointer(Result)^
А это string.
← →
GuAV © (2004-12-23 02:08) [2]Первый прваильный, т.к. работает и для коротких и для длиных строк.
← →
GuAV © (2004-12-23 02:10) [3]PS: если Read это стандартная процедура Read а не TStream.Read, то согласен с [1]
← →
Project1 (2004-12-23 02:12) [4]
> GuAV © (23.12.04 02:08) [2]
> Первый прваильный, т.к. работает и для коротких и для длиных
> строк.
А для каких не работает второй ? И что будет при n = 0 ?
← →
Project1 (2004-12-23 02:25) [5]Рид - это
procedure TBlfBlaBla.Read(var Buf; Count: Longint);
begin
FStream.Read(Buf, Count);
end;
← →
Project1 (2004-12-23 04:48) [6]Мастера ! Скажите своё веское слово !
← →
GuAV © (2004-12-23 12:36) [7]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 не делает ни чтение ни запись этой переменной.
Я рекомендую первый вариант, т.к. он не зависит от внутреннего представления строк, вто время как второй использует то, что строка - это указатель.
← →
GuAV © (2004-12-23 12:43) [8]GuAV © (23.12.04 12:36) [7]
т.к. при Count = 0 в Read не делает ни чтение ни запись этой переменной.
Конечно, зависит от реализации TStream.Read для данного наследника TStream, но не должен делать ни чтение ни запись этой переменной.
← →
Project1 (2004-12-26 04:08) [9]
> GuAV © (23.12.04 12:36) [7]
> Я рекомендую первый вариант, т.к. он не зависит от внутреннего
> представления строк, вто время как второй использует то,
> что строка - это указатель.
Проблема в том, что первый вариант даёт ошибку, при включённой в насктройках опции Рэнджь чек. Нету Result[1], когда n := 0 .
← →
Anatoly Podgoretsky © (2004-12-26 13:13) [10]Project1 (23.12.04 01:46)
Оба неправильных, должно быть
if n = 0 then Exit;
← →
GuAV © (2004-12-26 13:18) [11]Anatoly Podgoretsky © (26.12.04 13:13) [10]
А зачем ? если второй параметр TStream.Read равен 0, то в переменную должно быть записано 0 байт, т.е. вообще ничего не записано. Т.е. IMHO проверка if n = 0 then Exit излишня.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c