Тема: Ошибка при считывании списка.

Создаю для LISP-а функцию faces(k n vert), где k- целое число, n длина списка vert, vert - список, состоящий из списков целых чисел, примерно такого вида:((1 2 7 6) (2 3 8 7) (3 4 9 8) (4 5 10 9) (6 7 12 11) (7 8 13 12) (8 9 14 13) (9 10 15 14) (11 12 17 16) (12 13 18 17) (13 14 19 18) (14 15 20 19) (16 17 22 21) (17 18 23 22) (18 19 24 23) (19 20 25 24)). Пока что функция должна только считать входные данные, а возвращает последний элемент последнего входящего списка. Код выглядит следующим образом:

    // ----- ads_faces symbol (do not rename)
    static int ads_faces(void)
    {
        struct resbuf *pArgs =acedGetArgs () ,*rb;
        if(pArgs==NULL) {
        return 0;    }
        int k, n;
        int elem;
        if(pArgs->restype!=RTSHORT) {
        ads_relrb(pArgs);
        return 0;
        }
        k=pArgs->resval.rint;
        rb=pArgs->rbnext;
        if(rb->restype!=RTSHORT) {
        ads_relrb(rb);
        return 0;
        }
        n=rb->resval.rint;
        rb=rb->rbnext;
        int** vert;
        vert = new int* [n];
        for (int i=0; i<n; i++)
        vert[i] = new int[4];
        if(rb->restype!=RTLB) {
        ads_relrb(rb);
        return 0;
        }
        rb = rb->rbnext;
        int j=0;
        while (j<n) {
        rb = rb->rbnext;
        i = 0;
        while (i<4)
            {
            elem = rb->resval.rint;
            vert[j][i] = elem;
            i++;
            rb=rb->rbnext;
            }
        rb = rb->rbnext;
        j++;
        }
        acedRetInt (elem) ;
        if ( pArgs != NULL )
            acutRelRb (pArgs) ;
        return (RSRSLT) ;
        }

Однако, при выполнении возникает необрабатываемое исключение C0000005(Нарушение доступа). Если в цикле заменить while (j<n) на while (j<8) (для приведённого в начале списка vert) то всё работает, возвращается последний элемент 8-го списка - 14. Если while (j<9), то возвращается почему-то 0. Для while (j<k), где 10<k<=16 опять C0000005. В чём дело?

Re: Ошибка при считывании списка.

Это не мистика. Так и должно быть.
1) Во-первых, код не корректен. Почему в случае некорректных данных освобождается только "хвост списка"? Нужно освобождать весь список, т.е. вместо ads_relrb(rb); должно быть ads_relrb(pArgs);
Кстати список в таком случае может быть несбалансированным и это может приводить к развалу AutoCAD.
2) Почему в одних местах возвращается 0 (это недопустимое значение), а в других RSRSLT, что правильно?
3) Никогда из lisp'а в arx не передавай списки типа ((I11 I12 I13 I14) (I21 I22 I23 I24)...), где Iij - целые числа. AutoCAD пытается интерпретировать их как DXF-группы и это приводит в ряде случаев к развалу AutoCAD, а в других случаях значения просто не передаются в ARX и выводится сообщение об ошибке.
Проанализируй в цикле while (j<n) значения rb->restype и ты поймешь, что они не равны RTSHORT.
В качестве рекомендации - используй в списке плавающие числа и (вероятнее всего) твоя функция сразу заработает. Т.е. передай в нее список vert == ((:((1. 2. 7. 6.) (2. 3. 8. 7.) ... (19. 20. 25. 24.)). Или вообще измени структуру списка. Например, вложи его еще в один список. Т.е.
(((1 2 7 6) (2 3 8 7) (3 4 9 8) (4 5 10 9) (6 7 12 11) (7 8 13 12) (8 9 14 13) (9 10 15 14) (11 12 17 16) (12 13 18 17) (13 14 19 18) (14 15 20 19) (16 17 22 21) (17 18 23 22) (18 19 24 23) (19 20 25 24))). Пропусти еще одну открывающуюся скобку RTLB. Тоже должно работать.

Re: Ошибка при считывании списка.

P.S.: И вообще, когда делаешь rb = rb->rbnext; не забывай проверять значение rb перед тем как его использовать - оно запросто может оказаться нулем - как в твоем случае.