为什么我的对象的方法没有返回到我的调用方法?

时间:2016-02-16 01:30:12

标签: c++ methods arduino closures function-pointers

我正在创建一个使用Arduino的微型计算机,用c ++编程,我正在为它创建一个全面的解释器。一切正常,代码在调用runCode方法后开始运行,但一旦运行完成,它就不会返回到调用函数。我有串口输出告诉我代码到达的位置。

我的代码包含"功能"对象,带有名称和函数指针,运行代码的对象(带有工作的Lexer对象,用空格分隔输入的代码),以及计算机内编辑器(除一个函数外完全有效)输入要运行的程序。

为我的代码运行对象(称为Joker)调用runCode方法的函数在编辑器中。问题是,一旦runCode完成,它就不会返回。 系统停止。我将发布Function类,runCode方法和调用方法。

P.S。有串行(即控制台)打印来确定代码到达的位置。它会输出"功能结束!"但不会"失败!" /"成功",所以在我看来我的功能并没有返回

P.P.S。它使用视差4x20背光单针串行LCD,完全100%工作(不用担心lcd.print和东西)

P.P.P.S它使用QueueList库,它基本上是一个像堆栈一样工作的动态列表(即:.pop(),. push(),. isEmpty()等。)

还有一点需要注意:代码heavyliy使用动态列表,函数指针和lambda表达式,所以......准备....

Function类的代码(不,它没有任何实际的功能):

class Function {
public:
  String f_name;
  bool (*f_run) (QueueList<float> &stack, SoftwareSerial &lcd);
};

runCode方法的代码:

bool Joker::runCode(QueueList<String> lineTable, SoftwareSerial &lcd) {
  // Set up lexer
  Lexer lexer;
  // Get all lexer words
  lexer.getWords(lineTable);

  String cur_word = "";
  float num_val = 0.0f;
  bool quit = false;

  while(!quit) {
    cur_word = lexer.nextWord();
    if(cur_word == "")
      quit = true;
    else {
      // Get word in uppercase
      cur_word.toUpperCase();

      Serial.println(cur_word);

      // Parse the first number from it
      num_val = cur_word.toFloat();

      // Check if we have a function
      if(queueListContains(cur_word, dictionary)) {
        Function theFunc = getDictionaryFunction(cur_word, dictionary);
        if(!theFunc.f_run(stack, lcd)) {
          error(F("Unable to process word!!"), lcd);
          return false;
        }
      } else if(num_val != 0) {         // check if the parse was good
        stack.push(num_val);            // if it was: push num to the stack
      } else if(num_val == 0) {         // if zero it could be parsing a zero or it could have failed
        if(cur_word.indexOf("0") != -1) // if it didn't fail:
          stack.push(num_val);          // push to the stack
        else {                          // otherwise:
          error(F("Unknown word!!"), lcd);   // Unknown word error
          return false;
        }
      } else {
        error(F("Unknown word!!"), lcd);
        return false;
      }
    }
  }

  // Test printing the stack
  /*while(!stack.isEmpty()) {
    lcd.print(stack.pop());
    lcd.print(' ');
  }*/

  Serial.print(F("Function end!"));
  return true;
}

调用方法:

void line_editor::RunProgram(SoftwareSerial &lcd) {
  Serial.println("Running program!!");
  // Move to top line
  currentLine = 0;
  while(!lineTableB.isEmpty()) {
    lineTableA.push(lineTableB.pop());
    // Serial.print(lineTableB.peek());
  }

  // Clear the string
  lcd.write(12);
  delay(5);
  lcd.write(128);

  // Joker language object
  Joker joker;

  QueueList<Function> PrintingWords;

  // Create the printing functions
  Function printWord;
  printWord.f_name = "BC"; // print "Beginning Card"
  printWord.f_run = [] (QueueList<float> &stack, SoftwareSerial &lcd) {
    if(stack.isEmpty()) {
      return false;
    }

    float num = stack.pop();
    lcd.print(num);
    lcd.write(13);

    return true;
  };
  PrintingWords.push(printWord);

  // Print the whole stack
  Function printStack;
  printStack.f_name = "AC"; // print "All Cards"
  printStack.f_run = [] (QueueList<float> &stack, SoftwareSerial &lcd) {
    while(!stack.isEmpty()) {
      lcd.print(stack.pop());
      lcd.print(' ');
    }

    lcd.write(13);

    return true;
  };
  PrintingWords.push(printStack);

  // Add all the functions
  joker.addWords(PrintingWords);

  // Run Program here...
  if(joker.runCode(lineTableA, lcd))
    Serial.println("Success!!");
  else
    Serial.println("Failed!!");

  // lineTableA.push(lineTableB.pop());

  Serial.println("Here!!");

  return;
}

抱歉,如果我困惑任何人。如果有任何问题,请发表评论,我会尝试解决这个问题。任何帮助将不胜感激。

编辑:添加NextWord功能以帮助消除一些混乱:

nextWord(其中word是Lexer对象的一部分,是QueueList):

String Lexer::nextWord()  {
  if(words.isEmpty())
    return "";
  return words.pop();
}

0 个答案:

没有答案