Здравствуйте, решил перенести свой код с 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;Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1