Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Задачка. Какой код правильнее и почему ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
3-1102700928
Kot
2004-12-10 20:48
2005.01.16
Создание БД в InterBase


4-1101424987
GanibalLector
2004-11-26 02:23
2005.01.16
GetTextExtentPoint


3-1102939925
Aleksandr.
2004-12-13 15:12
2005.01.16
Как совместить файловые форматы ADO и ClientDataSet?


1-1104149785
markers
2004-12-27 15:16
2005.01.16
На тему ini файлов


1-1104136529
Sash
2004-12-27 11:35
2005.01.16
excel