2014-04-03 4 views
0
#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"); 
    } 

приведенный выше код - это то, что я пытаюсь реализовать для своего кода. в основном я пытаюсь сделать шутер «да/нет» для ноутбуков. он не собирается делать по-настоящему глубоко проблемную съемку, а только что-то, что может запускать средний конечный пользователь, который знает, как жить с загрузкой компакт-диска. Я просто пытаюсь настроить дерево решений.Я на правильном пути здесь с моим деревом решений? arduino

Я просто хочу убедиться, что я нахожусь на правильном пути мысли для этого проекта. и убедиться, что я не возился. У меня еще нет платы для ввода/вывода, и я просто изучаю, сколько места мне нужно для этого на чипе.

просто мысль, могу ли я запустить этот код в компиляторе c, чтобы убедиться, что внутренняя структура на самом деле запрограммирована правильно? Я знаю, что функции arduino не работают, но я не понимаю, почему дерево не работает.

спасибо за помощь

ответ

1

В функциях

void addyes (struct node n, char quest[]) 
void addno (struct node n, char quest[]) 

Вы проходящий параметр узла по значения. Это означает, что структура, которую вы изменяете, отличается от функции 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"); 
    } 
+0

спасибо за эту поправку, я знал, что я должен был быть что-то отсутствует я также забыть что-то подобное. Я тоже волнуюсь, я не использовал никаких новых/malloc. я понимаю, с такой небольшой памятью arduino's, что это не очень хорошо использовать правильно? –

+0

Хорошо использовать новый/malloc, но вам нужно эффективно управлять памятью кучи. Проще работать только с памятью стека, если у вас нет необходимости ускорять или уменьшать занимаемый объем памяти. – Idipaolo

+0

Обсуждается использование malloc в arduino [здесь] (http://arduino.stackexchange.com/questions/682/is-using-malloc-and-free-a-really-bad-idea-on-arduino) в Arduino SE site – hithwen

0

вы посмотрите на эту маленькую state machine library я написал, может быть полезным для деревьев решений тоже может.

Плюсы, которые я вижу в этой библиотеке, это то, что я думаю, что это может привести к более четкому коду и не использовать столько памяти, сколько не сохраняет весь путь yes/no, пройденный пользователем.

Вот мини-пример дерева решений с использованием библиотеки:

#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 = ''; 
    } 
} 
+0

звучит очень приятно, но для того, чтобы я мог получить полный кредит на проект, я могу включить только 1 lib, я не сделал себя, и я решил использовать lcd lib, потому что id будет орешком, чтобы переделать сам –

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