Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.028 c
11-1085075514
Terminus
2004-05-20 21:51
2005.01.16
Еще о KOLTabControl


1-1104687802
NEEDHelp
2005-01-02 20:43
2005.01.16
Kak mozhno zapustit programu 4tob ona bila vidna okolo 4asov?


14-1103637175
Кудесник
2004-12-21 16:52
2005.01.16
Что тут у нас щас было... я плакаль %)))


3-1102693499
Fedor
2004-12-10 18:44
2005.01.16
Вычисляемые поля


1-1104211072
Тимур
2004-12-28 08:17
2005.01.16
Опять по ListView




   Наверх