La razón por la que escribo esta columna es porque mientras trabajaba en un programa Arduino durante el fin de semana, me encontré con una pequeña pausa que me hizo pensar.
La razón por la que escribo esta columna es porque mientras trabajaba en un programa Arduino durante el fin de semana, me encontré con una pequeña pausa que me hizo pensar.
Ahora, antes de lanzarme de lleno a la refriega con valentía y abandono, quiero recordarte que no soy un experto en software. Soy ingeniero de diseño de hardware de día, por lo que la columna “Acertijos de codificación” no es para profesionales de software. En cambio, está dirigido a todos los que se sumergen en las aguas del software.
En términos generales, si escribe un programa que contiene una máquina de estado simple, o si usa una colección de estados como parte de su estructura de control, puede usar un conjunto de máquinas de estado. #define
Directivas que se muestran en el bosquejo de Arduino algo sin sentido a continuación.
Los programas de Arduino están escritos como una mezcla de C y C++ (de hecho, C++ es C con funciones de programación orientada a objetos añadidas). En caso de que no esté familiarizado con Arduino, el IDE (Entorno de desarrollo integrado) crea automáticamente dos funciones: setup()
que se ejecuta una vez y loop()
, corre una y otra vez. Por supuesto, también puede escribir sus propias funciones. Si proviene de un entorno de programación C/C++ tradicional, en la “parte superior” (quizás “raíz” sea una mejor palabra) de cada programa C/C++, main()
función. FYI, el Arduino también tiene esto, pero no es visible para el usuario. Al presionar el botón “Compilar”, el sistema creará un archivo temporal con contenido como este:
Pero nos desviamos. Volviendo al código de muestra, comenzamos con cuatro piezas de código. #define
Una directiva que declara los cuatro estados de algunos botones que planeo usar como parte de mi GUI (hablaré más sobre el programa real en una columna futura). La forma en que esto funciona es que cada vez que el preprocesador C/C++ encuentra uno de estos nombres en el código subsiguiente, los reemplaza con el valor relevante.Por ejemplo, nombre BUTTON_ACTIVE
asociado con el valor numérico de 2
Entonces, si quieres omitir #define
Usando directivas, puede reescribir su programa así:
motivo de uso #define
La ventaja de las directivas es que hacen que su código sea más fácil de leer, cambiar y mantener. Por ejemplo, puede utilizar los siguientes nombres: BUTTON_ACTIVE
Se ejecuta cientos de veces a lo largo del programa, y todas estas instancias se pueden cambiar rápida y fácilmente cambiando el valor único asociado con esa instancia. #define
Dominio.Hasta ahora todo bien, pero este fin de semana decidí buscar un “punto de estilo” personal, en lugar de usar #define
Decidí usar una enumeración en su lugar. enum
Así que mi código de ejemplo ahora se ve así:
grandes cosas sobre enum
La asignación automática de valores enteros basados en 0 a nombres de etiquetas. Esto es muy útil al agregar o eliminar entradas de la lista. Desafortunadamente, este código no se pudo compilar. Peor aún, el número de línea de error identificado por el compilador no tenía ningún sentido para mí. Debo señalar que el programa real tiene una longitud de aproximadamente 1500 líneas, lo que es aún más confuso. Esto explica por qué volví a usar estos ejemplos simples para resolver las cosas.Reduje las cosas a un argumento para mí mismo doYesButton()
función. Primero, traté de cambiar esto a:
void doYesButton (enum buttonStates whatState)
Oh, no funcionó (cara triste).Entonces cambié mi enum
En realidad, se resuelve en un valor entero.Basado en esto, cambié el argumento a mi doYesButton()
una función que se convierte int
como sigue:
void doYesButton (int whatState)
¡Banzai! Esto funciona (baile feliz). Por un lado, el hecho de que esto funcione es algo bueno. Por otro lado, el hecho de que no puedo entender por qué mi enfoque original no funcionó no es muy bueno. ¿Tienes tu propio acertijo de codificación? Si es así, publícalo como un comentario a continuación (si es fácil de explicar) o envíame un correo electrónico. [email protected]
(Si son difíciles de explicar), podría convertirlos en un tema para una futura columna de Enigmas de codificación.