Duda sobre operadores y funciones

Iniciado por Luxus01, 9 Septiembre 2016, 17:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Luxus01

Hola a todos, soy nuevo y estoy empezando ha programar en c++.

Estoy haciendo un programa con el que "dibujar" un recorrido en la consola, el programa lee ese recorrido y lo procese para transformarlo en instrucciones para un robot en la vida real (con arduino). Y me gustaría saber si hay algún operador, función o librería que sea capaz de detectar ese recorrido, o al menos de ayudarme a hacer una función que lo detecte.

Gracias por adelantado  :D

ivancea96

Dibujar un recorrido en la consola. Explica mejor qué tipo de datos va a recibir el programa. ¿Va a recibir datos del tipo "ADELANTE 5", va a recibir un "mapa" del recorrido tipo

XXX
XX X
X  X
XXXX

Luxus01

Hola, perdón por haber tardado en responder :laugh:.
En el anterior mensaje no explique bien lo que quería hacer aqui, tienes el codigo con comentarios. Aun no esta terminado, me falta conectar el c++ y el arduino (algo que no se como hacer todavia) pero lo del recorrido ya esta hecho.

Código (cpp) [Seleccionar]
#include<stdio.h>  //Declara las librerias, variables y definiciones
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
#include<list>
#include<iostream>
using namespace std;

#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80

bool fina = false; //Esta variable pone fin al programa si es necesario
int recorrido[20]; //En este array se almacena el recorrido en forma de numeros

void gotoxy(int x, int y) //Funcion para situar el cursor en el lugar deseado
{
HANDLE hCon;
hCon = GetStdHandle (STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X =x;
dwPos.Y =y;

SetConsoleCursorPosition(hCon, dwPos);
}

void OcultarCursor()//Oculta el cursor

{

HANDLE hCon;
hCon = GetStdHandle (STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 2;
cci.bVisible = false;

SetConsoleCursorInfo (hCon,&cci);

}

class Inicio //Es el objeto que se mueve por el camino
{
private:
    int x, y;
public:
    Inicio(int _x,int _y): x(_x), y(_y){}
    void pintar();
    void mover();
};



void Inicio::mover()//Esta es la funcion mas importante, permite hacer el camino y lo traduce a numeros
{   int i;
    if(kbhit() && recorrido[20] == 0)//Detecta si se a presionado una tecla y si la ultima cifra del recorrido es cero
        {
        char tecla = getch();
        if(tecla == ARRIBA )//Detecta que flecha se a pulsado(en este caso arriba)
        {
        y--;
        for(i=0;i<21;i++)//En este for se recorre el arreglo y se guarda el numero correspondiente en el siguiente hueco distinto a cero
        {
            if(recorrido[i] == 0)
            {
                recorrido[i] = 72;
                break;
            }
        }

        }
        if(tecla == IZQUIERDA )
        {
            x--;
            for(i=0;i<21;i++)
            {
                if(recorrido[i] == 0)
                    {
                    recorrido[i] = 75;
                    break;
                    }
            }




        }
        if(tecla == DERECHA )
        {
            x++;
            for(i=0;i<21;i++)
            {
                if(recorrido[i] == 0)
                    {
                    recorrido[i] = 77;
                    break;
                    }
            }

        }
        if(tecla == ABAJO )
        {
            y++;
            for(i=0;i<21;i++)
            {
                if(recorrido[i] == 0)
                    {
                    recorrido[i] = 80;
                    break;
                    }
            }

        }
        gotoxy(x,y); printf("*");//Imprime un asterisco para que la trayectoria sea visible
        gotoxy(0,0);//Situa el cursor en la esquina superior izquierdaa
        for(i=0;i<21;i++)//Imprime la secuencia en el margen
        {
            cout<< recorrido[i]<<"\n";
        }

    }
    if(recorrido[20] != 0)//Comprueba si la ultima cifra del recorrido es distinta de cero, en tal caso, el programa le manda la secuencia al robot
    {
        fina = true;
        gotoxy(0,0); printf("Se ha completado la trayectoria, puedes mandar los datos al robot");
    }
}

void Inicio::pintar()//Pone el primer objeto para que sea visible
{
    gotoxy(x,y); printf("%c",223);
}

int main()
{
    OcultarCursor();
    int recorrido[20];
    int i;
    for(i=0;i<21;i++)//Despues de mandar la secuencia al robot vuelve el recorrido a cero para poder volver a utilizarla
    {
        recorrido[i]=0;
    }
    Inicio In(60,60);
    In.pintar();
    while(!fina)//Inicia el bucle que permite la creacion del recorrido
    {
        In.mover();

    }

return 0;
}



ivancea96

En primer lugar:
En un array de 20 elementos, el índice va desde 0 hasta 19. Por tanto, los for son incorrector. Seberían ser:
Código (cpp) [Seleccionar]
for(int i=0; i<20; i++)
También el if debería ser:
Código (cpp) [Seleccionar]
if(kbhit() && recorrido[19] == 0)

Luego, como detalle: Sería más conveniente que guardases la cantidad de recorrido en un entero, y te ahorras estos for:
Código (cpp) [Seleccionar]
for(i=0;i<21;i++)//En este for se recorre el arreglo y se guarda el numero correspondiente en el siguiente hueco distinto a cero
{
    if(recorrido[i] == 0)
    {
        recorrido[i] = 72;
        break;
    }
}


Como último detalle, si programas C++, es preferible utilizar las librerías de C++:
stdlib.h pasa a llamarse cstdlib
stdio.h -> cstdio

(windows.h y conio.h se quedan así)


Y bueno. Me has dejado desconcertado. En la pregunta inicial, preguntas cómo "detectar el recorrido". Con ese programa, tienes el array de movimientos, que es lo que necesitas, ¿no?

Luxus01

#4
Si, después de publicar el mensaje empece a darle vueltas mi di cuenta de que en vez de analizar el recorrido del objeto podía almacenar en una cadena cada pulsación de las teclas
como números y luego asignar esos números a un movimiento determinado.
Lo siento, no entiendo a que te refieres con almacenar los movimientos en un entero, tenerlos en un arreglo me permite tenerlos secuenciados.
Otra cosa, al poner cstdlib y cstdio me salta un error

Ahora tengo problemas con la comunicación serial por que no tengo ni idea de como funciona.

ivancea96

Decía de guardar un entero con el último índice almacenado. Actualmente, calculas la cantidad de movimientos almacenados con un for. En vez de hacer eso, mejor guardar sin más un entero.


En cuanto a la conexión serie, Arduino da una clase C++ para que la uses si quieres.

Para usarla, pues tiene funciones simples tipo Write y Read, no tiene más.

Si quieres, aquí tengo un programa funcional para conectar Arduino con programa C++:
https://github.com/ivancea/Arduino-Interpreter/tree/master/C++%20App

Luxus01

Me podrías explicar como usar tu programa. Porque sinceramente no tengo ni idea de que hacer con él.

ivancea96

Umh bueno. Hay la aprte de Arduino, que le metes al Arduino sin más:

https://github.com/ivancea/Arduino-Interpreter/blob/master/arduino_program.c

Y la parte de C++, que tienes que compilar. Si quieres, puedes usas un IDE, puedes hacer un proyecto, como más te guste.

El programa lo único que tiene es un intérprete de comandos, para poner cosas como:
pinmode 5 OUTPUT
digitalwrite 5 HIGH

Desde ls consola del programa, con el Arduino conectado.


Pero bueno, era más que nada para que vieras cómo implementar en tu proyecto la clase Serial (serial.h y serial.cpp).
Si quieres, aquí hay una fuente oficial en la cual usan la clase:
http://playground.arduino.cc/Interfacing/CPPWindows

Aunque bueno, no me gusta porque mezclan mucho C con C++ xD

Luxus01

Lo siento, debo de ser un plasta :-\ pero yo me refiero a como unir todos esos códigos,
el de arduino lo he copiado al Arduino  IDE y los archivos h los he puesto con las demás librerías pero el resto no se que hacer con ello.

Y donde se cambian las opciones para compilar con -std=c++11?

ivancea96

Vale, lo de Arduino listo.
Ahora los otros. Si usas un IDE para compilar C++, puedes crear un proyecto, agregar esos 5 archivos, y compilar, sin más.

Si no lo logras, dime: ¿Qué IDE utilizas para compilar C++? (No hablo del de Arduino)


Si compilas desde línea de comandos, sería (Con GCC, no sé cual es tu compilador):


g++ -std=c++11 -c functions.cpp -o functions.o
g++ -std=c++11 -c serial.cpp -o serial.o
g++ -std=c++11 -c main.cpp -o main.o
g++ functions.o serial.o main.o -o main.exe