Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Luxus01 en 9 Septiembre 2016, 17:33 pm



Título: Duda sobre operadores y funciones
Publicado por: Luxus01 en 9 Septiembre 2016, 17:33 pm
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


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 9 Septiembre 2016, 19:56 pm
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
Código:
 XXX
XX X
X  X
XXXX


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 10 Septiembre 2016, 15:13 pm
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
  1. #include<stdio.h>  //Declara las librerias, variables y definiciones
  2. #include<windows.h>
  3. #include<conio.h>
  4. #include<stdlib.h>
  5. #include<list>
  6. #include<iostream>
  7. using namespace std;
  8.  
  9. #define ARRIBA 72
  10. #define IZQUIERDA 75
  11. #define DERECHA 77
  12. #define ABAJO 80
  13.  
  14. bool fina = false; //Esta variable pone fin al programa si es necesario
  15. int recorrido[20]; //En este array se almacena el recorrido en forma de numeros
  16.  
  17. void gotoxy(int x, int y) //Funcion para situar el cursor en el lugar deseado
  18. {
  19. HANDLE hCon;
  20. hCon = GetStdHandle (STD_OUTPUT_HANDLE);
  21. COORD dwPos;
  22. dwPos.X =x;
  23. dwPos.Y =y;
  24.  
  25. SetConsoleCursorPosition(hCon, dwPos);
  26. }
  27.  
  28. void OcultarCursor()//Oculta el cursor
  29.  
  30. {
  31.  
  32. HANDLE hCon;
  33. hCon = GetStdHandle (STD_OUTPUT_HANDLE);
  34. CONSOLE_CURSOR_INFO cci;
  35. cci.dwSize = 2;
  36. cci.bVisible = false;
  37.  
  38. SetConsoleCursorInfo (hCon,&cci);
  39.  
  40. }
  41.  
  42. class Inicio //Es el objeto que se mueve por el camino
  43. {
  44. private:
  45.    int x, y;
  46. public:
  47.    Inicio(int _x,int _y): x(_x), y(_y){}
  48.    void pintar();
  49.    void mover();
  50. };
  51.  
  52.  
  53.  
  54. void Inicio::mover()//Esta es la funcion mas importante, permite hacer el camino y lo traduce a numeros
  55. {   int i;
  56.    if(kbhit() && recorrido[20] == 0)//Detecta si se a presionado una tecla y si la ultima cifra del recorrido es cero
  57.        {
  58.        char tecla = getch();
  59.        if(tecla == ARRIBA )//Detecta que flecha se a pulsado(en este caso arriba)
  60.        {
  61.        y--;
  62.        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
  63.        {
  64.            if(recorrido[i] == 0)
  65.            {
  66.                recorrido[i] = 72;
  67.                break;
  68.            }
  69.        }
  70.  
  71.        }
  72.        if(tecla == IZQUIERDA )
  73.        {
  74.            x--;
  75.            for(i=0;i<21;i++)
  76.            {
  77.                if(recorrido[i] == 0)
  78.                    {
  79.                    recorrido[i] = 75;
  80.                    break;
  81.                    }
  82.            }
  83.  
  84.  
  85.  
  86.  
  87.        }
  88.        if(tecla == DERECHA )
  89.        {
  90.            x++;
  91.            for(i=0;i<21;i++)
  92.            {
  93.                if(recorrido[i] == 0)
  94.                    {
  95.                    recorrido[i] = 77;
  96.                    break;
  97.                    }
  98.            }
  99.  
  100.        }
  101.        if(tecla == ABAJO )
  102.        {
  103.            y++;
  104.            for(i=0;i<21;i++)
  105.            {
  106.                if(recorrido[i] == 0)
  107.                    {
  108.                    recorrido[i] = 80;
  109.                    break;
  110.                    }
  111.            }
  112.  
  113.        }
  114.        gotoxy(x,y); printf("*");//Imprime un asterisco para que la trayectoria sea visible
  115.        gotoxy(0,0);//Situa el cursor en la esquina superior izquierdaa
  116.        for(i=0;i<21;i++)//Imprime la secuencia en el margen
  117.        {
  118.            cout<< recorrido[i]<<"\n";
  119.        }
  120.  
  121.    }
  122.    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
  123.    {
  124.        fina = true;
  125.        gotoxy(0,0); printf("Se ha completado la trayectoria, puedes mandar los datos al robot");
  126.    }
  127. }
  128.  
  129. void Inicio::pintar()//Pone el primer objeto para que sea visible
  130. {
  131.    gotoxy(x,y); printf("%c",223);
  132. }
  133.  
  134. int main()
  135. {
  136.    OcultarCursor();
  137.    int recorrido[20];
  138.    int i;
  139.    for(i=0;i<21;i++)//Despues de mandar la secuencia al robot vuelve el recorrido a cero para poder volver a utilizarla
  140.    {
  141.        recorrido[i]=0;
  142.    }
  143.    Inicio In(60,60);
  144.    In.pintar();
  145.    while(!fina)//Inicia el bucle que permite la creacion del recorrido
  146.    {
  147.        In.mover();
  148.  
  149.    }
  150.  
  151. return 0;
  152. }
  153.  



Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 10 Septiembre 2016, 16:05 pm
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
  1. for(int i=0; i<20; i++)
También el if debería ser:
Código
  1. 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
  1. 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
  2. {
  3.    if(recorrido[i] == 0)
  4.    {
  5.        recorrido[i] = 72;
  6.        break;
  7.    }
  8. }

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?


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 10 Septiembre 2016, 16:38 pm
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.


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 10 Septiembre 2016, 23:00 pm
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 (https://github.com/ivancea/Arduino-Interpreter/tree/master/C++%20App)


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 11 Septiembre 2016, 12:24 pm
Me podrías explicar como usar tu programa. Porque sinceramente no tengo ni idea de que hacer con él.


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 11 Septiembre 2016, 13:37 pm
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 (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:
Código:
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 (http://playground.arduino.cc/Interfacing/CPPWindows)

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


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 11 Septiembre 2016, 14:35 pm
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?


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 11 Septiembre 2016, 15:46 pm
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):

Código:
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


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 11 Septiembre 2016, 16:03 pm
Mi compilador es codebloks,

te refieres a agregar los archivos como new files y copiar el texto no?


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 11 Septiembre 2016, 16:23 pm
Primero creas un proyecto de C++.
Luego, agregas los archivos al proyecto. Para ello, puedes abrir los archivos con Code::Blocks, y dar click derecho sobre la pestaña de cada archivo -> Agregar al proyecto.

Una vez hecho eso, compilar. Para ello, antes, dale click derecho al proyecto en la barra de la izquierda -> Build options.
Ahí, verás una lista de checkboxes. Marca una que pone: "Have g++ use the C++11 ISO C++ language standar [-std=c++11]". Y compila.


Por cierto. En el main, hay unas opciones al principio:
Código
  1. /// OPTIONS
  2. const uint32_t maxDigitalPin = 13;
  3. const uint32_t maxPin = 19;
  4. const string port = "\\\\.\\COM22";

Si usas Arduino UNO, deja las primeras como están.
El port, es donde está conectado el Arduino. Si abres el IDE de Arduino, abajo a la derecha te pone en cual está. Modifica el número (COM22 -> COM3, por ejemplo)


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 11 Septiembre 2016, 17:14 pm
Por que no me deja añadir archivos al proyecto?

file:///C:/Users/david/Downloads/pantallazo%20(1).webp

Esto es un screenshot, pero al pulsar add files no hace nada


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 11 Septiembre 2016, 17:43 pm
Para poner una imagen tendrás que subirla a un servidor web.

Pero lo dicho. Crear un proyecto, tenerlo abierto, abrir el archivo, click derecho, añadirlo.
(http://i.imgur.com/uacYFpG.png)

Al agregarlo, automáticamente aparecerá a la izquierda.


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 11 Septiembre 2016, 19:42 pm
Vale, lo tengo todo ya preparado pero al darle al boton de compilar me salta esto

Código
  1. fatal error: iostream: No such file or directory|


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 11 Septiembre 2016, 19:45 pm
Amh pff. ¿Compilaste alguna vez con Code::Blocks algo en C++?
¿Puedes pasar captura del proyecto? Como la que pasé yo, más o menos, que se vea esa zona. Usa https://imgur.com (https://imgur.com) por ejemplo.


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 12 Septiembre 2016, 09:43 am
Si, pero hasta ahora solo habia compilado archivo simples, no  proyectos.

(http://i.imgur.com/xDq54ka.png)

MOD EDIT: Imagen adaptada a lo usado en el foro.


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 12 Septiembre 2016, 14:07 pm
Al crear el proyecto pusiste "Console application", y luego elegiste "C++"?


Título: Re: Duda sobre operadores y funciones
Publicado por: Luxus01 en 12 Septiembre 2016, 15:24 pm
No, elegi empty project


Título: Re: Duda sobre operadores y funciones
Publicado por: ivancea96 en 12 Septiembre 2016, 15:31 pm
Pues eso, elige proyecto de consola, y luego, elige C++.
Sinó, tendrías que configurar el proyecto a mano, y es más lioso.