VarArrayLock, функция

Синтаксис


function VarArrayLock(var V:  Variant):  Pointer;

Описание

Функция VarArrayLock блокирует размерности массива Variant, чтобы их нельзя было изменить, и возвращает указатель на простой массив с содержимым массива Variant. Массив данных организован так, что самый левый индекс изменяется первым (развертывание по строкам). Заметьте, что обычные массивы Паскаля хранятся в порядке развертывания по столбцам, и первым изменяется самый правый индекс.
VarArrayLock не является настоящей функцией

Ошибки

Советы и приемы

  • Если требуется выполнить операцию над всеми элементами массива Variant, сначала заблокируйте массив для повышения производительности.
  • Массив данных содержит фактические значения всех элементов массива Variant. Проверьте, что тип элемента массива совпадает с ожидаемым и преобразуйте указатель на данные в соответствующий тип.
  • Пока массив заблокирован, нельзя изменить его размер, но можно изменить содержимое. Изменения в элементах массива отражаются на массиве данных, полученном от функции VarArrayLock.
  • Можно заблокировать массив более одного раза. Для разблокирования массива необходимо вызвать VarArrayUnlock столько раз, сколько была вызвана VarArrayLock.

Пример


// Перестановка двух значений типа double.
procedure DSwap(var A, B: Double);
var
  Tmp: Double;
begin
  Tmp := A;
  A := B;
  B := Tmp;
end;

// Транспонирование матрицы значений varDouble.  Для максимальной
// производительности блокируем массив Variant и обращаемся к данным
// в чистом виде.
procedure Transpose(var M: Variant);
type
  TDoubleArray = array[0..MaxInt div SizeOf(Double)-1] of Double;
  PDoubleArray = ^TDoubleArray;
var
  I, J:  Integer;
  Data: PDoubleArray;
  Dim1: Integer;
  Low1, Low2: Integer;
  High1,  High2: Integer;
begin
  Assert(VarType(M) = varArray or varDouble);
  Data := VarArrayLock(M);
  try
    Low1 := VarArrayLowBound(M, 1);
    Low2 := VarArrayLowBound(M, 2);
    High1 := VarArrayHighBound(M, 1);
    High2 := VarArrayHighBound(M, 2);
    Dim1 := High1 - Low1 + 1;

    // Массив Data представляет собой одномерный вектор,  но
    // его значения все равно организованы в виде матрицы.  Переставляем
    // элементы матрицы M[J, I] и M[I,  J] с помощью массива Data.
    for I := Low1 to High1 do
      for J := I to High2 do
        DSwap(Data[J-Low2 + (I-Low1)*Dim1],
              Data[I-Low2 + (J-Low1)*Dim1]);
  finally
      VarArrayUnlock(M);
  end;
end;

Смотрите также

Функции VarArrayCreate, VarArrayDimCount, VarArrayHighBound, VarArrayLowBound, VarArrayOf, VarArrayRef, VarArrayUnlock, VarIsArray, VarType, процедура VarArrayRedim.
    Учебник по языку Pascal          Лабораторные работы по программированию          Справочник




Нет комментариев.



Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: