Приложения
Приложение А. Функции, константы и структуры RDS
А.5. Сервисные функции и макросы RDS
А.5.15. Работа с матрицами и массивами
А.5.15.11. rdsVarArrayIndexCheck – проверить допустимость индексов матрицы/массива
Функция rdsVarArrayIndexCheck проверяет допустимость значений индексов строки и столбца для указанной матрицы и выводит сообщение пользователю при необходимости.
BOOL RDSCALL rdsVarArrayIndexCheckA( LPVOID BaseAddr, // Базовый адрес переменной int Row, // Индекс строки int Col, // Индекс столбца DWORD Flags, // Флаги RDS_VAIC_* RDSCSTR VarName, // Имя переменной или NULL (UTF8) RDSCSTR BlockName // Имя блока или NULL (UTF8) ); BOOL RDSCALL rdsVarArrayIndexCheckW( LPVOID BaseAddr, // Базовый адрес переменной int Row, // Индекс строки int Col, // Индекс столбца DWORD Flags, // Флаги RDS_VAIC_* RDSWCSTR VarName, // Имя переменной или NULL (UTF16) RDSWCSTR BlockName // Имя блока или NULL (UTF16) ); // Функция-псевдоним BOOL RDSCALL rdsVarArrayIndexCheck( LPVOID BaseAddr, // Базовый адрес переменной int Row, // Индекс строки int Col, // Индекс столбца DWORD Flags, // Флаги RDS_VAIC_* RDSXCSTR VarName, // Имя переменной или NULL (кодировка по умолчанию) RDSXCSTR BlockName // Имя блока или NULL (кодировка по умолчанию) );
Тип указателя на эту функцию
RDS_BpVIIDwSS (для UTF8) или RDS_BpVIIDwWsWs (для UTF16)
Параметры
- BaseAddr (LPVOID)
- Указатель (может быть любого типа, в т.ч. и void*) на данные матрицы в дереве переменных блока, то есть указатель на область из восьми байтов, которые эта матрицы занимает в дереве переменных (см. §2.5.3 руководства программиста).
- Row, Col (int)
- Индекс строки (Row) и столбца (Col) в матрице, нумерация начинается с нуля.
- Flags (DWORD)
- Один или несколько объединенных битовым ИЛИ флагов, управляющих поведением функции:
RDS_VAIC_SINGLE Указанная переменная – массив, а не матрица. Для массива вместо проверки индексов по отдельности произведение этих индексов будет сравниваться с общим числом элементов (обычная проверка для массивов, имеющих, с точки зрения пользователя, всего один индекс). Этот флаг также влияет на выводимое сообщение – если он взведен, в тексте будет использоваться слово «массив» вместо слова «матрица». RDS_VAIC_MESSAGE Выводить пользователю сообщение в случае недопустимости индексов. RDS_VAIC_SINGLEMSG При взведенном RDS_VAIC_MESSAGE: выводить сообщение только один раз за расчет. До тех пор, пока расчет не будет остановлен или сброшен, функция не будет выводить новых сообщений пользователю. RDS_VAIC_STOPCALC Останавливать расчет при недопустимых индексах. - VarName (RDSCSTR, RDSWCSTR, RDSXCSTR)
- Имя переменной для отображения в сообщении пользователю, или NULL, если имя переменной в сообщение вставлять не нужно.
- BlockName (RDSCSTR, RDSWCSTR, RDSXCSTR)
- Имя блока, в котором произошла ошибка, для отображения сообщения пользователю, или NULL, если нужно использовать имя вызвавшего функцию блока.
Возвращаемое значение
TRUE – индексы в пределах размера матрицы, FALSE – недопустимые индексы.
Примечания
Доступ к элементам матриц и массивов в RDS производится по смещениям относительно базового адреса (см. §2.5.3 руководства программиста) – это обеспечивает высокую скорость работы модели, но при этом, очевидно, никаких автоматических проверок допустимости индексов не производится. Функция rdsVarArrayIndexCheck позволяет организовать простейшую проверку индексов с выводом сообщения пользователю или без него. Такая проверка может, например, использоваться для организации классов доступа к матрицам и массивам в моделях, создаваемых модулями автокомпиляции (см. главу 3 руководства программиста). При взведенном в параметре Flags флаге RDS_VAIC_SINGLE (при этом считается, что переменная – массив, а не матрица), функция возвращает TRUE, если произведение параметров Row и Col больше или равно нуля и меньше произведения числа строк и числа столбцов матрицы. При сброшенном RDS_VAIC_SINGLE функция возвращает TRUE, если Row больше или равно нуля и меньше числа строк в матрице, и при этом Col больше или равно нуля и меньше числа столбцов в матрице.
При взведенном флаге RDS_VAIC_MESSAGE функция будет выводить сообщение вида «Выход индекса матрицы за диапазон: переменная ИМЯ1, блок ИМЯ2, размер [N,M], обращение к ячейке [r,c]», где ИМЯ1 – значение параметра VarName (имя переменной), ИМЯ2 – имя блока (значение параметра BlockName или имя вызвавшего функцию блока), N – число строк в матрице, M – число столбцов, r – значение параметра Row, с – значение параметра Col. Если переменная не матрица, а массив, текст сообщения немного изменяется. Сообщение выводится в отдельном окне через функцию rdsMessageBox.
Если взведен флаг RDS_VAIC_SINGLEMSG, при запущенном расчете сообщение будет выведено только один раз (при самом первом вызове функции для самого первого вызвавшего ее блока), все остальные сообщения будут пропускаться до тех пор, пока расчет не будет остановлен или сброшен. Это может быть полезно, если проверка производится в реакции на выполнение такта расчета RDS_BFM_MODEL – если ошибка в значениях индексов будет повторяться каждый такт, и при этом каждый раз будет выводиться сообщение, эти сообщения не дадут пользователю нормально работать.
См. также
RDS_ARRAYCOLS, RDS_ARRAYROWS, rdsGetVarArrayAccessData, rdsMessageBox.