Главная страница
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.48 MB
Время: 0.029 c
2-1419009922
AlexeyTG
2014-12-19 20:25
2017.01.15
Заново переписал Просьба оценить "корявость кода" v2


15-1449675538
Rouse_
2015-12-09 18:38
2017.01.15
Акция от VMProt


2-1430858757
Zheksonz
2015-05-05 23:45
2017.01.15
Почему некоторые контролы не отображаются?


3-1311683275
Patrick1968
2011-07-26 16:27
2017.01.15
Интересная вещь в ADO


4-1278387805
Rassamaha78
2010-07-06 07:43
2017.01.15
Запрет закрытия чужого приложения через WinAPI