Создание и 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);