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

Описания RDS

Приложения

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

А.5. Сервисные функции и макросы RDS

А.5.26. Вспомогательный объект для разбора текста

А.5.26.12. Команда RDS_HSTR_SETTEXT – передать в объект текст для разбора

# Приложения

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

### А.5. Сервисные функции и макросы RDS

#### А.5.26. Вспомогательный объект для разбора текста

##### А.5.26.12. Команда RDS_HSTR_SETTEXT – передать в объект текст для разбора

Команда RDS_HSTR_SETTEXT передает в объект текст, из которого функция rdsSTRGetWord будет последовательно извлекать слова.

Вызов команды

      RDSCSTR strText= … // Текст для разбора на слова (UTF8)
      rdsSetObjectStrA(Parser,RDS_HSTR_SETTEXT,0,strText);

или

      RDSWCSTR strText= … // Текст для разбора на слова (UTF16)
      rdsSetObjectStrW(Parser,RDS_HSTR_SETTEXT,0,strText);

или (через функцию-псевдоним)

      RDSXCSTR strText= … // Текст для разбора на слова (кодировка по умолчанию)
      rdsSetObjectStr(Parser,RDS_HSTR_SETTEXT,0,strText);

Параметры и результат

Parser(RDS_HOBJECT)
  Идентификатор вспомогательного объекта для разбора текста, ранее созданного функцией rdsSTRCreateTextReader.
strText(RDSCSTR,RDSWCSTR,RDSXCSTR)
  Указатель на текст, который будет разбираться объектом.

Примечания

Объект Parser запоминает переданный ему указатель strText, но сам текст не копируется во внутреннюю память объекта. Таким образом, этот текст должен быть доступен все время работы объекта Parser. Если удалить этот текст (освободить динамическую строку, в которой он хранится, или завершить функцию, локальной переменной которой он является), объект попытается получить доступ к освобожденной памяти, что приведет к аварийному завершению работы RDS. Например, следующий фрагмент программы не сможет работать:

      char *text=new char[100]; // Динамически отведенный массив
      strcpy(text,"alpha beta gamma"); // Текст для разбора
      // Создание объекта
      RDS_HOBJECT obj=rdsSTRCreateTextReader(TRUE);
      // Передача текста в объект
      rdsSetObjectStrA(obj,RDS_HSTR_SETTEXT,0,text);
      delete[] text; // ОШИБКА! Текст используется объектом!
      int id=rdsSTRGetWordA(obj,NULL,NULL,NULL,TRUE); // Сбой!

В этом примере после оператора «delete[] text» указатель внутри объекта obj начинает ссылаться на область памяти с освобожденными данными, и следующий за ним вызов функции rdsSTRGetWord с большой вероятностью приведет к ошибке общей защиты.

Пример

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

См. также

rdsSTRCreateTextReader, rdsSetObjectStr, rdsSTRGetWord.