ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Создание и cтирание cписка


ObjectARX-приложение может динамически размещать единственный буфер результатов,  вызывая acutNewRb (). Запрос к acutNewRb () должен определить тип буфера, чтобы разместить; acutNewRb () автоматически инициализирует restype поле буфера, чтобы содержать указанный код типа.

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

struct resbuf *head;

if ((head=acutNewRb(RT3DPOINT)) == NULL) {

acdbFail("Unable to allocate buffer\n");

return BAD;

}

head->resval.rpoint[X] = 15.0;

head->resval.rpoint[Y] = 16.0;

head->resval.rpoint[Z] = 11.18;

Если новый буфер результатов должен содержать строку, приложение должно явно разместить память, чтобы содержать строку:

struct resbuf *head;

if ((head=acutNewRb(RTSTR)) == NULL) {

acdbFail("Unable to allocate buffer\n");

return BAD;

}

if ((head->resval.rstring = malloc(14)) == NULL) {

acdbFail("Unable to allocate string\n");

return BAD;

}

strcpy(head->resval.rstring, "Hello, there.");

Память, размещенная для строк, которые связаны с динамическим списком,  выпущена, когда список выпущен, так что следующий запрос выпускает всю память, размещенную в предыдущем примере:

acutRelRb(head);

Чтобы выпускать строку без того, чтобы выпустить буфер, вызовите свободным () и установите строковый указатель на NULL как показано в следующем примере:

free(head->resval.rstring);

head->resval.rstring = NULL;

Установка resval.rstring к NULL предотвращает последующий запрос к acutRelRb () из попытки выпустить строку второй раз.

Если элементы списка известны заранее, более быстрый способ создавать это состоит в том, чтобы вызвать acutBuildList (), который берут переменное число пар параметра (с исключениями типа RTLB, RTLE, -3, и других) и возвращают указатель на список буферов результатов, который содержит указанные типы и значения, связанные вместе в порядке, в котором их пропускали к acutBuildList (). Эта функция размещает память как требовано и инициализирует все значения. Последний параметр к acutBuildList () должен быть единственный параметр, чей значение является или нулем или RTNONE.

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

struct resbuf *result;

ads_point pt1 = {1.0, 2.0, 5.1};

result = acutBuildList(

RTREAL, 3.5,

RTSTR, "Hello, there.",

RT3DPOINT, pt1,

0 );

Если это не может создавать список, acutBuildList () возвращает NULL; иначе, это размещает пространство, чтобы содержать список. Этот список должен быть выпущен последующим запросом к acutRelRb ():

if (result != NULL)

acutRelRb(result);



Содержание раздела