我正在创建一个使用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();
}