LINUX.ORG.RU

Re: pascal - копирование участков памяти

Можно и так, только не учитывается то, что куски памяти могут накладываться, а Move в таком случае правильно копирует

procedure CopyMem(const Source: Pointer; Dest: Pointer; Size: Integer);
var
   I: Integer;
begin
   for I := 0 to Size do
    PChar(Dest)[I] = PChar(Source)[I];
end;

anonymous ()
Ответ на: Re: pascal - копирование участков памяти от kss

Re: pascal - копирование участков памяти

(const Source; var Dest; Size: Integer);

Почему этот вариант лучше? С точки зрения семантики языка мне не понятно, почему тип не указан.

anonymous ()
Ответ на: Re: pascal - копирование участков памяти от anonymous

Re: pascal - копирование участков памяти

Да разницы в общем-то и нет, но const Source удобнее

procedure y(const source:pointer);
procedure x(const source);
var
   a: //если тут массив, запись или что-нибудь еще кроме указателя

begin
        y(a); //то тут надо будет писать так y(@a)
        x(a);
end.

anonymous ()
Ответ на: Re: pascal - копирование участков памяти от anonymous

Re: pascal - копирование участков памяти

>С точки зрения семантики языка мне не понятно, почему тип не указан.

Потому, что язык допускает при создании процедур и функций описывать нетипизированные параметры. При вызове такой подпрограммы ей вместо данных параметров можно передавать переменные любого типа (они всё равно будут переданы по ссылке, а не по значению). Именно этим такой синтаксис и лучше будет, можно будет при вызове писать не CopyMem(@Source, @Dest, Size), а сразу CopyMem(Source, Dest, Size), что читаемее, на мой взгляд. Ну и выглядит красивее :)

Правда, внутри подпрограммы всё равно придётся использовать либо приведение типа (как в примере выше, с PChar(Source)), либо объявление вспомогательных переменных с директивой absolute:

var S: array [0..High(Cardinal)] of byte absolute Source; D: array [0..High(Cardinal)] of byte absolute Dest;

for i := 0 to Size - 1 do D[i]:= S[i];

Но в любом случае, лучше использовать Move. Оно банально быстрее должно быть.

kss ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.