Текущий раздел:

Описания RDS

Приложения

Приложение А. Функции, константы и структуры RDS

А.4. Структуры RDS

А.4.1. RDS_ARRAYACCESSDATA – описание матрицы/массива

# Приложения

## Приложение А. Функции, константы и структуры RDS

### А.4. Структуры RDS

Описываются структуры, используемые в различных сервисных функциях RDS.

#### А.4.1. RDS_ARRAYACCESSDATA – описание матрицы/массива

Структура RDS_ARRAYACCESSDATA может использоваться для упрощения доступа к массиву или матрице в составе статических или динамических переменных блока. Массивы и матрицы в RDS устроены одинаково (массив – это матрица с единственной строкой), поэтому эта структура описывает и массивы, и матрицы.

Работать с массивами и матрицами можно и без этой структуры, разбирая дерево переменных блока вручную или при помощи специальных макросов (см. приложение А.5.15).

      typedef struct {
        BOOL Exists;        // TRUE - массив существует (то есть не 0x0)
        RDSINT32 Rows,Cols; // Размерность массива
        RDSINT32 ItemSize;  // Размер элемента массива
        LPVOID Data;        // Начало области данных массива
      } RDS_ARRAYACCESSDATA;
      typedef RDS_ARRAYACCESSDATA *RDS_PARRAYACCESSDATA;

Поля структуры

Exists(BOOL)
  TRUE, если матрица (массив) существует, то есть имеет хотя бы один элемент, и FALSE, если она пуста.
Rows(RDSINT32)
  Число строк в матрице (массиве), если она не пуста. Для непустого массива в этом поле всегда записана единица.
Cols(RDSINT32)
  Число столбцов в матрице (массиве).
ItemSize(RDSINT32)
  Размер одного элемента матрицы или массива в байтах. Элементы массивов и матриц хранятся в памяти последовательно, поэтому это поле можно использовать для определения указателя на элемент с нужным номером (следует помнить, что в RDS нумерация элементов массивов и матриц начинается с нуля). Например, чтобы получить смещение в байтах от начала массива к элементу с индексом 8 (то есть к его девятому элементу), нужно умножить ItemSize на восемь.
Data(LPVOID)
  Указатель на нулевой (самый первый) элемент массива или матрицы. Начиная с этого указателя, элементы массива хранятся последовательно, элементы матрицы – последовательно по строкам.

Поле Data структуры RDS_ARRAYACCESSDATA имеет тип void*, то есть «указатель общего вида», поэтому для работы с элементами массива или матрицы его нужно привести к нужному типу. Например, для матрицы вещественных чисел двойной точности (double) обращение к элементу с индексом строки 2 и индексом столбца 3 будет выглядеть так:

      RDS_ARRAYACCESSDATA adata;
      // ... здесь должно быть заполнение структуры adata
      // какой-либо сервисной функцией ...
      double a_2_3=((double*)(adata.Data))[2*adata.Cols+3];

Пример

Пример использования структуры RDS_ARRAYACCESSDATA приведен в §2.5.3 руководства программиста.

См. также

rdsGetVarArrayAccessData, RDS_ARRAYITEMADDR, RDS_ARRAYITEM.