Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 04:20, 25 July 2007.

Дескрипторы в качестве параметров функций

From Forum Nokia Wiki

Перевод с английского, оригинальная статья находится здесь.


Дескрипторы предоставляют ряд мощных возможностей, однако необходимо четко понимать их свойства для корректного использования. Рано или поздно Вам прийдется использовать дескрипторы в качестве параметров функций. Самый простой способ для определения подобных функций:

void myFunction(TBuf<8> aText);

Недостаток такого решения заключается в том, что ограничен тип параметра - это TBuf (изменяемый стековый дескриптор), длиной 8 символов. Если в коде используется другой тип дескриптора, например RBuf, такую функцию нельзя будет вызвать напрямую.

Поэтому, если не требуется какой-то конкретной функциональности, в качестве параметров нужно использовать базовые типы дескрипторов: TDes (для изменяемых дескрипторов) и TDesC (для константных дескрипторов).

void SomeFunction(
		const TDesC& aReadOnlyDescriptor, 
		TDes& aReadWriteDescriptor);

В приведенном выше примере, используется два типа дескрипторов:

  • Первый параметр - дескриптор только для чтения, константный дескриптор. TDesC - это базовый класс всех дескрипторов, в том числе и для изменяемого TDesC. Даже если Вы используете RBuf, Вы можете передавать его в качестве параметра такого типа. Константный дескриптор плюс константная ссылка гарантируют, что содержимое дескриптора не будет изменено в ходе выполнения функции.
  • Второй параметр - дескриптор для чтения/записи. В отличие от первого, второй параметр не константный дескриптор TDes. Функция может изменять содержимое такого дескриптора, причем не имеет значения, где хранится его содержимое - в стеке или куче.


Другой важный момент - дескрипторы всегда нужно передавать по ссылке (например, TDesC&), а не по значению (например, TDes). При передаче по значению используется раннее связывание - в результате вызывающая функция получит объект базового типа, у которого не будет доступа к реальным данным. Компиляция такого кода пройдет без ошибок, однако во время выполнения возникнут проблемы. Воспользуйтесь отладчиком - Вы увидите, что вместо реальных данных такой параметр содержит мусор.


Пример API

Естественно, что в Symbian OS подобная парадигма используется для системных функций. Например, для чтения файла:

TInt errorCode = RFile.Read(TDes8& aDes);

У функции есть возможность узнать максимальный размер данных, которые может сохранить дескриптор с помощью метода aDes.MaxLength(), соответственно, ограничение максимального размера будет учтено при чтении файла. После вызова данной функции можно узнать, сколько байт было прочитано, используя вызов aDes.Length() - результат будет гарантировано меньше либо равен aDes.MaxLength().

Сравните с подобной функцией в Win32-API, где нет поддержки качественного строкового API. Для того, чтобы задать максимальный размер и вернуть количество прочитанных байт приходится использовать отдельные параметры:

BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, 
              LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
Related Discussions
Thread Thread Starter Forum Replies Last Post
CEikonEnv в Exe truf Russian Developer Forum - Форум Российских разработчиков 2 2008-01-31 10:40
Есть ли библиотеки для работы с fixed point? Ecconaut Russian Developer Forum - Форум Российских разработчиков 22 2008-02-03 12:39
Проблема запуска на эмуляторе LuckyBeaver Russian Developer Forum - Форум Российских разработчиков 17 2007-12-11 14:45
libc?... RZK333 Russian Developer Forum - Форум Российских разработчиков 12 2008-03-01 21:32
Помогите разобраться, а то загруз в ресурсах JTOne Russian Developer Forum - Форум Российских разработчиков 14 2008-01-06 15:29
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX