Форум: "Прочее";
Текущий архив: 2017.01.15;
Скачать: [xml.tar.bz2];
ВнизКак думаете, это ошибка в 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.078 c