2012-03-13 4 views
2

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

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, честно говоря, что это может быть.

+3

Если вы не знаете, почему вы получаете segfault - запустите программу под gdb или используйте сгенерированный coredump ... –

+0

Я пробовал это. gdb сказал, что top * был пуст, но кроме того, что он давал мне адреса памяти, и я вообще не испытываю этого. :/ – xyzzy

+0

[Не используйте указатели для 'i' здесь] (https://twitter.com/#!/klmr/status/177173159836008448). Пожалуйста, исправьте это первым. –

ответ

1

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

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

Но, как Влад указал, вы можете ознакомиться с БГД.

+0

О, я все еще нехорошо передаю вещи по ссылке. После того, как они были изменены и для ссылок, я получил несколько ошибок. Пробовал исправить их, не кубиками. Что-то нуждалось в rvalue, когда он получал lvalue, я пытался изменить, как работает функция ... это было беспорядочно. Затем я попытался изменить это выше на указатели и после изменения всего остального для обработки указателей, мой код вообще не выводит. :( – xyzzy

Смежные вопросы