Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Быстрый способ обмена значений в 2х переменных

Delphi , Синтаксис , Типы и Переменные

Быстрый способ обмена значений в 2х переменных

Автор: http://www.swissdelphicenter.ch

procedure SwapVars1(var u, v; Size: Integer);
var
  x: Pointer;
begin
  GetMem(x, Size);
  try
    System.move(u, x^, Size);
    System.move(v, u, Size);
    System.move(x^, v, Size);
  finally
    FreeMem(x);
  end;
end;

procedure SwapVars2(var Source, Dest; Size: Integer);
// By Mike Heydon, mheydon@eoh.co.za
begin
  asm
     push edi
     push esi
     mov esi,Source
     mov edi,Dest
     mov ecx,Size
     cld
 @1:
     mov al,[edi]
     xchg [esi],al
     inc si
     stosb
     loop @1
     pop esi
     pop edi
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  SwapVars1(X1, X2, SizeOf(Integer));
end;

Программный код предлагает два способа обмена значениями двух переменных в Delphi.

Первый метод (SwapVars1) использует функции управления памятью из модуля System. Он выделяет временный буфер с помощью GetMem, копирует значение одной переменной в этот буфер, затем перемещает значения второй переменной в первую переменную и наконец копирует значение из буфера обратно во вторую переменную. Буфер затем освобождается с помощью FreeMem.

Второй метод (SwapVars2) использует inline-ассемблерный код для прямого обмена памятью местоположений двух переменных. Он сохраняет текущие регистры, загружает адреса исходной и целевой переменных, настраивает цикл для итерации по каждому байту в диапазоне памяти, указанном в Size, обменивает соответствующие байты с помощью инструкции xchg (которая может использоваться только на 32-регистрах), а затем восстанавливает сохраненные регистры.

Оба метода работают правильно, но имеют различные характеристики. Первый метод более типичен для Delphi, в то время как второй метод использует ассемблерный код, что может сделать его менее переносимым.

Однако для операции обмена, где Size обычно маленький (например, обмен двух целых чисел или строк), второй метод может быть быстрее и более эффективным, потому что он не выделяет дополнительную память.

Вот пример использования этих процедур:

procedure TForm1.Button2Click(Sender: TObject);
begin
  X2 := 10;
  X1 := 20;

  SwapVars1(X1, X2, SizeOf(Integer));

  ShowMessage('After swap X1 = ' + IntToStr(X1) + ', X2 = ' + IntToStr(X2));
end;

В этом примере X1 и X2 - это две целочисленные переменные. Они изначально присваиваются значениям 20 и 10 соответственно. Событие клика кнопки вызывает процедуру SwapVars1, чтобы обменять их значения. Затем сообщение отображает новые значения X1 и X2.

Быстрый способ обмена значений в двух переменных - это процедура на Pascal, которая использует операцию xchg для мгновенного обмена значениями.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Типы и Переменные ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 11:44:12/0.0037169456481934/0