Альтернативные функции WinApi в Ubuntu

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Альтернативные функции WinApi в Ubuntu

Сообщение avi9526 » 25.08.2010 18:54:38

Здравствуйте, решил перенести свой код с Delphi на Lazarus (FPC)
интересуют альтернативы функциям WinApi
MoveMemory (я так понял тут можно применить System.Move ?)
CopyMemory
ZeroMemory
Аватара пользователя
avi9526
новенький
 
Сообщения: 16
Зарегистрирован: 25.08.2010 17:10:26

Re: Альтернативные функции WinApi в Ubuntu

Сообщение pda » 25.08.2010 21:46:11

MoveMemory - вроде нет аналога (а что, копируете пересекающиеся диапазоны?)
CopyMemory - Move
ZeroMemory - FillChar
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Альтернативные функции WinApi в Ubuntu

Сообщение coyot.rush » 25.08.2010 22:44:18

Распределение памяти http://linuxland.itam.nsc.ru/gnu/glibc/glibc-3.html

Добавлено спустя 7 минут 29 секунд:
PS: Пора добавить в ссылки вот это

Библиотека языка C GNU glibc
Сандра Лузмор (Sandra Loosemore)
Ричард Сталлман (Richard M. Stallman)
Роланд Макграх (Roland MacGrath)
Андрей Орам (Andrew Oram)
ред. 0.06 24.10.1994

http://linuxland.itam.nsc.ru/gnu/glibc/glibc.html
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Альтернативные функции WinApi в Ubuntu

Сообщение pda » 26.08.2010 00:04:41

Вот только не надо этого. Без необходимости не нужно использовать сторонние функции управления памятью.
Аватара пользователя
pda
постоялец
 
Сообщения: 303
Зарегистрирован: 27.05.2005 19:59:53

Re: Альтернативные функции WinApi в Ubuntu

Сообщение avi9526 » 26.08.2010 00:56:53

coyot.rush писал(а):Пора добавить в ссылки вот это

"чукча не читатель, чукча писатель", пожалуйста, не надо меня посылать в... библиотеку)

написал свое на "хлопський розум", для меньшего заморачивания сделал movememory такой же как и copymemory, вроде работает, главное что бы также как в WinAPI, если не затруднит - прокоментируйте)

Код: Выделить всё
...
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;
Аватара пользователя
avi9526
новенький
 
Сообщения: 16
Зарегистрирован: 25.08.2010 17:10:26

Re: Альтернативные функции WinApi в Ubuntu

Сообщение hinst » 26.08.2010 21:01:39

да уж... что тут комментировать... форматирование не правильное, отступы расставлены не так.
алсо :idea: вот у вас функция принимает Dest, Src и Len. если вы в процессе её работы не меняете их, то для достижение ускорения сделайте их const, ведь для const-параметров компилятор выполняет особую оптимизацию
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 51

Рейтинг@Mail.ru