Структура resbuf включает поле указателя, rbnext, для соединения буферов результатов в список. Буфера Результатов могут быть размещены статически, объявляя их в приложении. Вы делаете это, когда только единственный буфер результатов используется (например, acedGetVar () и acedSetVar ()) или когда, только короткий список необходим. Но более длинные списки проще, чтобы обработать, размещая их динамически, и списки, возвращенные функциями ObjectARX всегда размещаются динамически. Один из наиболее часто используемые функции, который возвращает список связей - acedGetArgs ().
“ Оценка Внешних Функций ” на странице 526 показывает AutoLISP, запрашивающий внешней подпрограммы, которая берет параметры трех отличных типов: строка, целое число, и реальное значение:
( Doit pstr iarg rarg)
Следующий код сегментирует показы, как осуществить функцию с такой последовательностью запроса. Типовая функция проверяет, чтобы список параметров был правилен и сохранил значения в местном масштабе перед действием на них (операции не показываются). Пример предполагает, что предыдущий запрос к acedDefun () назначил внешнюю подпрограмму функциональный код 0, и что все функции, определенные этим приложением берут по крайней мере один параметр:
// Выполнить определенную функцию.
int dofun()
{
struct resbuf *rb;
char str[64];
int ival, val;
ads_real rval;
ads_point pt;
// Get the function code.
if ((val = acedGetFuncode()) == RTERROR)
return BAD; // Indicate failure.
// Get the arguments passed in with the function.
if ((rb = acedGetArgs()) == NULL)
return BAD;
switch (val) { // Which function is called?
case 0: // (doit)
if (rb->restype != RTSTR) {
acutPrintf("\nDOIT called with %d type.", rb->restype);
acutPrintf("\nExpected a string.");
return BAD;
}
// Save the value in local string.
strcpy(str, rb->resval.rstring);
// Advance to the next result buffer.
rb = rb->rbnext;
if (rb == NULL) {
acutPrintf("\nDOIT: Insufficient number of arguments.");