#ifndef _QUEUELIST.H
#define _QUEUELIST.H
#include <Arduino.h>
struct node {
char question[16];
node * yes;
node * no;
}node;
struct node initlist(char quest[]){
struct node head;
strcpy(head.question,quest);
head.yes=NULL;
head.no=NULL;
return head;
}
void addyes (struct node n, char quest[]){
struct node tnode;
strcpy(tnode.question,quest);
tnode.yes=NULL;
tnode.no=NULL;
n.yes=&tnode;
}
void addno (struct node n, char quest[]){
struct node tnode;
strcpy(tnode.question,quest);
tnode.yes=NULL;
tnode.no=NULL;
n.no=&tnode;
}
#endif
void setup() {
struct node top;
struct node *temp; //using this to traverse the tree keeping top as my handle
top = initlist ("does it turn on?");
temp = ⊤
addyes(top, "blue screen?");
addno(top, "power light on?");
temp=top.yes;
addyes(*temp, "test memory");
}
以上代码是我尝试为我的代码实现的代码。基本上,我试图为笔记本电脑制作一个是/否麻烦的射击游戏。它不会做任何真正深入的故障排除,但只是知道如何生活启动CD的普通最终用户可以运行。我只是想设置一个决策树。
我只是想确保我对这个项目有正确的思路。并确保我不会搞砸事情。我还没有为输入/输出设置电路板,我只是想知道芯片上需要多少空间。
只是一个想法,我可以在c编译器中运行此代码以确保内部结构实际编程正确吗?我知道arduino函数不会工作,但我不明白为什么这棵树不会工作。
感谢您的帮助
答案 0 :(得分:1)
在功能
中void addyes (struct node n, char quest[])
void addno (struct node n, char quest[])
您正在通过值传递node参数。这意味着您正在修改的结构与setup()函数中的结构不同。 要解决此问题,请尝试将指针传递给该结构,而不是整个结构。
void addyes (struct node * n, char quest[]){
struct node* tnode = new node;
strcpy(tnode->question,quest);
tnode->yes=NULL;
tnode->no=NULL;
n->yes=tnode;
}
void addno (struct node* n, char quest[]){
struct node* tnode = new node;
strcpy(tnode->question,quest);
tnode->yes=NULL;
tnode->no=NULL;
n->no=tnode;
}
设置将改变:
void setup() {
struct node top;
struct node *temp; //using this to traverse the tree keeping top as my handle
top = initlist ("does it turn on?");
temp = ⊤
addyes(&top, "blue screen?");
addno(&top, "power light on?");
temp=top.yes;
addyes(temp, "test memory");
}
答案 1 :(得分:0)
你可以看看我写的这个小state machine library也可能对决策树有帮助。
我在该库中看到的优点是,我认为它可以导致更清晰的代码,并且不会使用尽可能多的内存,因为它不存储用户走过的整个是/否路径。
这是使用该库的迷你决策树示例:
#include "Arduino.h"
#include "hithwen/statemachine/statemachine.h"
char input;
StateMachine machine(3, 2);
bool char_is_y() {
return input == 'y';
}
bool char_is_n() {
return input == 'n';
}
void status_0() {
Serial.println(F("Do you like chocolate?"));
}
void status_1() {
Serial.println(F("Eat chocolate!"));
}
void status_2() {
Serial.println(F("Don't eat chocolate!"));
}
void setup() {
Serial.begin(9600);
Serial.println(F("Welcome to my decision tree!"));
//machine.reset();
machine.add_transition(0, 1, &char_is_y);
machine.add_transition(0, 2, &char_is_n);
machine.add_state_function(0, &status_0);
machine.add_state_function(1, &status_1);
machine.add_state_function(2, &status_2);
machine.loop();
}
void loop() {
//checking data has been sent
if (Serial.available() > 0) {
char msg = Serial.read(); //read a message, it's not ignoring \0 chars
input = msg;
int nustate = machine.loop();
input = '';
}
}