我在决定树上走在正确的轨道上吗? Arduino的

时间:2014-04-03 02:40:39

标签: tree arduino decision-tree

  #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 = &top;
  addyes(top, "blue screen?");
  addno(top, "power light on?");
  temp=top.yes;
  addyes(*temp, "test memory");
  }

以上代码是我尝试为我的代码实现的代码。基本上,我试图为笔记本电脑制作一个是/否麻烦的射击游戏。它不会做任何真正深入的故障排除,但只是知道如何生活启动CD的普通最终用户可以运行。我只是想设置一个决策树。

我只是想确保我对这个项目有正确的思路。并确保我不会搞砸事情。我还没有为输入/输出设置电路板,我只是想知道芯片上需要多少空间。

只是一个想法,我可以在c编译器中运行此代码以确保内部结构实际编程正确吗?我知道arduino函数不会工作,但我不明白为什么这棵树不会工作。

感谢您的帮助

2 个答案:

答案 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 = &top;
    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 = '';
    }
}