Приложения
Приложение А. Функции, константы и структуры 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 руководства программиста.
См. также