Приложения
Приложение А. Функции, константы и структуры RDS
А.5. Сервисные функции и макросы RDS
А.5.14. Общие функции работы с переменными блока
А.5.14.3. rdsClearRuntimeType – очистка переменной произвольного типа
Функция rdsClearRuntimeType очищает переменную произвольного типа с указанным базовым адресом.
void RDSCALL rdsClearRuntimeType( LPVOID BaseAddr // Базовый адрес переменной );
Тип указателя на эту функцию
RDS_VpV
Параметр
- BaseAddr (LPVOID)
- Базовый адрес переменной в дереве, то есть указатель на блок из восьми байтов, которые эта переменная занимает в дереве переменных блока (см. §2.5.6 руководства программиста).
Примечания
Вызов этой функции присваивает указанной переменной пустой фактический тип.
Пример
Модель блока-переключателя (мультиплексора), который подает на выход «y» произвольного типа элемент входного массива переменных произвольного типа «X» с номером, определяемым целым входом «N». Если «N» меньше нуля или больше числа элементов в массиве «X», выход «y» очищается, то есть ему присваивается пустой фактический тип.
Блок должен иметь следующую структуру переменных:
| Смещение | Имя | Тип | Размер | Вход/выход | Пуск | Начальное значение |
|---|---|---|---|---|---|---|
| 0 | Start | Сигнал | 1 | Вход | ✓ | 0 |
| 1 | Ready | Сигнал | 1 | Выход | 0 | |
| 2 | X | Массив произвольных | 8 | Вход | ✓ | |
| 10 | N | int | 4 | Вход | ✓ | 0 |
| 14 | y | Произвольный | 8 | Выход |
Модель блока:
extern "C" __declspec(dllexport) int RDSCALL MultiplexMVariant( int CallMode,RDS_PBLOCKDATA BlockData,LPVOID ExtParam) // Макросы для переменных #define pStart ((char *)(BlockData->VarTreeData)) #define pReady ((char *)(pStart+1)) #define pX ((void **)(pStart+2)) #define pN ((int *)(pStart+10)) #define py ((void **)(pStart+14)) { switch(CallMode) { case RDS_BFM_VARCHECK: if(strcmp((char*)ExtParam,"{SSMVIV}")==0) return RDS_BFR_DONE; return RDS_BFR_BADVARSMSG; case RDS_BFM_MODEL: if(RDS_ARRAYEXISTS(pX)) // Массив X не пустой { int n=RDS_ARRAYROWS(pX)*RDS_ARRAYCOLS(pX),N=*pN; BYTE *data=(BYTE*)RDS_ARRAYDATA(pX); // 1-й элемент if(N>=0 && N<n) // Копируем в выход rdsCopyRuntimeType(py,data+N*2*sizeof(void*)); else rdsClearRuntimeType(py); // Очищаем выход } else // Нет массива X rdsClearRuntimeType(py); // Очищаем выход break; } return RDS_BFR_DONE; } #undef py #undef pN #undef pX #undef pReady #undef pStart //=========================================
См. также