Сегфо в рекурсивной функции - PullRequest
2 голосов
/ 13 марта 2012

Когда я запускаю этот код, у меня возникает ошибка по умолчанию, и я не знаю почему. Закомментирование конкретной строки (отмеченной ниже) удаляет ошибку сегмента, из-за чего я полагал, что рекурсивное использование итератора «i» могло вызывать проблемы, но даже после изменения его на указатель я получаю ошибку сегмента.

void executeCommands(string inputstream, linklist<linklist<transform> > trsMetastack)
{
int * i=new int;
(*i) = 0;
while((*i)<inputstream.length())
{
    string command = getCommand((*i),inputstream);
    string cmd = getArguments(command,0);
    //cout << getArguments(command,0) << " " << endl;


    if (cmd=="translate")
    {

        transform trs;
        trs.type=1;
        trs.arguments[0]=getValue(getArguments(command,2));
        trs.arguments[1]=getValue(getArguments(command,3));
        ((trsMetastack.top)->value).push(trs);
        executeCommands(getArguments(command,1),trsMetastack);
    }

    if (cmd=="group")
    { 
        //make a NEW TRANSFORMS STACK, set CURRENT stack to that one
        linklist<transform> transformStack;
        trsMetastack.push(transformStack);


        //cout << "|" << getAllArguments(command) << "|" << endl;
        executeCommands(getAllArguments(command),trsMetastack); // COMMENTING THIS LINE OUT removes the segfault

    }

    if (cmd=="line")
    { //POP transforms off of the whole stack/metastack conglomeration and apply them.


        while ((trsMetastack.isEmpty())==0)
        {
            while ((((trsMetastack.top)->value).isEmpty())==0)   //this pops a single _stack_ in the metastack
            { transform tBA = ((trsMetastack.top)->value).pop();
                cout << tBA.type << tBA.arguments[0] << tBA.arguments[1];
            }
            trsMetastack.pop();
        }


    }

«Metastack» - это связанный список связанных списков, которые я должен отправить в функцию во время рекурсии, объявленный так:

    linklist<transform> transformStack;
    linklist<linklist<transform> > trsMetastack;
    trsMetastack.push(transformStack);


    executeCommands(stdinstring,trsMetastack);

Функция "Getallarguments" предназначена только для извлечения большей части заданной строки, например:

    string getAllArguments(string expr) // Gets the whole string of arguments
    {
        expr = expr.replace(0,1," "); 
        int space = expr.find_first_of(" ",1);
        return expr.substr(space+1,expr.length()-space-1);
    }

А вот определение класса связанного списка.

    template <class dataclass> 
    struct linkm {
        dataclass value;     //transform object, point object, string... you name it
        linkm *next;
    };

    template <class dataclass> 
    class linklist 
    {
    public:
        linklist()
        {top = NULL;}
        ~linklist() 
        {}
        void push(dataclass num)
        {
            cout << "pushed";
            linkm<dataclass> *temp = new linkm<dataclass>;
            temp->value = num;
            temp->next = top;
            top = temp;
        }   
        dataclass pop()
        {

            cout << "pop"<< endl;
            //if (top == NULL) {return dataclass obj;}
            linkm<dataclass> * temp;
            temp = top;
            dataclass value;
            value = temp->value;
            top = temp->next;
            delete temp;
            return value;
        }
        bool isEmpty()
        {
            if (top == NULL) 
            return 1;
            return 0;
        }
        //  private:
        linkm<dataclass> *top; 
    };

Спасибо, что нашли время, чтобы прочитать это. Я знаю, что проблема неясна, но я просто провел последний час, пытаясь отладить это с помощью GDB, я, честно говоря, не знаю, что это могло быть.

1 Ответ

1 голос
/ 13 марта 2012

Это может быть что угодно, но по иронии судьбы я думаю, что переполнение стека. Возможно, вы захотите попробовать передать свои структуры данных в виде ссылок, например ::1001

void executeCommands(string &inputstream, linklist<linklist<transform> > &trsMetastack)

Но, как указал Влад, возможно, вы захотите познакомиться с GDB.

...