Конференция "Прочее" » Как думаете, это ошибка в TPointerStream в VCL?
 
  • DVM © (09.03.16 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 © (09.03.16 22:08) [1]
    замысел
    > Pos := Self.Position;
    позиция из Self сохраняется

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

    видимо где то (в Move) она меняется, а после функции нужна в том же состоянии что было.
  • sniknik © (09.03.16 22:10) [2]
    > видимо где то (в Move) она меняется
    ну или раньше был код со сдвигом, тогда сохранение-восстановление атавизм.
  • Германн © (10.03.16 00:54) [3]
    Судя по использованию процедуры Exit (ака goto) там, где можно было легко обойтись без неё - код писал троешник.
  • Kilkennycat © (10.03.16 02:48) [4]

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

    ну, мож он мыслил, что raise выкинет из текущего блока и функция вернет 0;
  • Pavia © (10.03.16 06:29) [5]
    Как по мне тут несколько ошибок.
 
Конференция "Прочее" » Как думаете, это ошибка в TPointerStream в VCL?
Есть новые Нет новых   [134434   +27][b:0][p:0.001]