Здравствуйте, решил перенести свой код с Delphi на Lazarus (FPC)
интересуют альтернативы функциям WinApi
MoveMemory (я так понял тут можно применить System.Move ?)
CopyMemory
ZeroMemory
Модератор: Модераторы
coyot.rush писал(а):Пора добавить в ссылки вот это
...
Int8S = Shortint;
IntU = Cardinal;
...
procedure MoveMemory(Dest, Src: Pointer; Len: PtrUInt);
var D, S: PtrUInt;
E1, E2, C: PtrUInt;
Inc: Int8S;
begin
if (PtrUInt(Dest) <> PtrUInt(Src)) and (Len > 0)
then
begin
E1 := (Len) div (SizeOf(IntU)); // Будем копировать по несколько байт
// но так можно будет сделать только E1 раз,
E2 := (Len) mod (SizeOf(IntU));// остальное придется копировать
// по-байтно E2 раз
// Далее реализуем схему копирования которая исправно работает
// даже с перекрывающимися областями
if PtrUInt(Dest) > PtrUInt(Src)
then
begin
Inc := -1; // Инкремент - направление выборки байт
S := PtrUInt(Src) + Len; // Начальный адрес в источнике
D := PtrUInt(Dest) + Len; // Начальный адрес в приемнике
end
else
begin
Inc := 1; // Инкремент - направление выборки байт
S := PtrUInt(Src); // Начальный адрес в источнике
D := PtrUInt(Dest); // Начальный адрес в приемнике
end;
C := 0; // Счетчик
while C < E1 do // Копирование по несколько байт
begin
if Inc = -1
then
begin
D := D - SizeOf(IntU);
S := S - SizeOf(IntU);
IntU(Pointer(D)^) := IntU(Pointer(S)^);
end
else
begin
IntU(Pointer(D)^) := IntU(Pointer(S)^);
D := D + SizeOf(IntU);
S := S + SizeOf(IntU);
end;
C := C + 1;
end;
C := 0; // Счетчик
while C < E2 do // Копирование по-байтно
begin
if Inc = -1
then
begin
D := D - SizeOf(Int8U);
S := S - SizeOf(Int8U);
Int8U(Pointer(D)^) := Int8U(Pointer(S)^);
end
else
begin
Int8U(Pointer(D)^) := Int8U(Pointer(S)^);
D := D + SizeOf(Int8U);
S := S + SizeOf(Int8U);
end;
C := C + 1;
end;
end;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 55