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

Вниз

Как думаете, это ошибка в TPointerStream в VCL?   Найти похожие ветки 

 
DVM ©   (2016-03-09 18:15) [0]

Есть в недрах VCL такой класс TPointerStream. Правда он приватный, но тем не менее.
В старых версиях он находился в файле EncdDecd в новых переехал в System.NetEncoding.


function TPointerStream.Write(const Buffer; Count: LongInt): LongInt;
var
 Pos, EndPos, Size: LongInt;
 Mem: Pointer;
begin
 Pos := Self.Position;
 if (Pos >= 0) and (Count > 0) then
 begin
   EndPos := Pos + Count;
   Size := Self.Size;
   if EndPos > Size then
     raise EStreamError.CreateRes(@SMemoryStreamError);
   Mem := Self.Memory;
   System.Move(Buffer, Pointer(Longint(Mem) + Pos)^, Count);
   Self.Position := Pos;
   Result := Count;
   Exit;
 end;
 Result := 0;
end;


Как мне кажется строка Self.Position := Pos должна быть записана как Self.Position := EndPos;

В противном случае два последовательных Write будут писать в одно и то же место памяти.

Та же ошибка скопипастена у http://www.gunsmoker.ru/2011/11/blog-post_12.html

Как думаете это ошибка или такой замысел?


 
sniknik ©   (2016-03-09 22:08) [1]

замысел
> Pos := Self.Position;
позиция из Self сохраняется

> Self.Position := Pos;
восстанавливается...

видимо где то (в Move) она меняется, а после функции нужна в том же состоянии что было.


 
sniknik ©   (2016-03-09 22:10) [2]

> видимо где то (в Move) она меняется
ну или раньше был код со сдвигом, тогда сохранение-восстановление атавизм.


 
Германн ©   (2016-03-10 00:54) [3]

Судя по использованию процедуры Exit (ака goto) там, где можно было легко обойтись без неё - код писал троешник.


 
Kilkennycat ©   (2016-03-10 02:48) [4]


> Германн ©   (10.03.16 00:54) [3]

ну, мож он мыслил, что raise выкинет из текущего блока и функция вернет 0;


 
Pavia ©   (2016-03-10 06:29) [5]

Как по мне тут несколько ошибок.



Страницы: 1 вся ветка

Текущий архив: 2017.01.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
2-1422528000
Алексей_П
2015-01-29 13:40
2017.01.15
Размер TForm


2-1424681725
Эрнест
2015-02-23 11:55
2017.01.15
URLEncodeReservedChars


15-1452503308
Копир
2016-01-11 12:08
2017.01.15
Убить программиста.


15-1449783004
Юрий
2015-12-11 00:30
2017.01.15
С днем рождения ! 11 декабря 2015 пятница


8-1238746691
igor666
2009-04-03 12:18
2017.01.15
Карта города.