Scooter
Cascarrabias crónico
Hace poco discutimos la conveniencia de usar o no #define en el lenguaje wiring del arduino.
El hilo fue a moderación porque en realidad colgaba de un hilo en el que se hablaba de otra cosa, pero creo que el tema es interesante porque yo le veo bastantes ventajas a #define pero el manual del arduino desaconseja su uso.
Wiring es un "casi C" pero no es C, de ahí el origen de la discusión.
He hecho unas pruebas:
Hacer dos define uno que incluye al otro:
#define bomba 3
#define bombardeo 6
Luego en el código he puesto:
Serial.print(bomba);
Serial.println(bombardeo);
Aparece 36 que es lo correcto, así que el compilador no se lía con eso
Hacer un #define de una palabra clave
#define if 3
Serial.print(if);
Aquí da error, en una de las líneas hay una sentencia if y da el error:
"PhysicalPixel:40: error: '3' cannot be used as a function", osea que cambia el if por un 3 quedando el código:
3(condición);
Eso no cuela lógicamente.
Hacer #define de un trozo de palabra clave
#define digital 3
Serial.print (digital);
Aquí todo funciona correctamente, en el código hay una orden "digitalWrite" que no se convierte en "3Write"
Osea que no se por qué en el manual desaconseja usar los #define. Está claro que hay que tomar ciertas precauciones, si uso un nombre de constante igual al de una función por ejemplo, pero eso creo que también pasa con variables o constantes.
No se si las versiones previas del compilador se atascaban con eso, he usado la 1.0.5
Me parece muuuucho mas eficiente definir ciertas cosas con #define que declarar variables.
En todos los ejemplos define los pines como variables tipo INT cuando eso gasta 2bytes de preciada RAM para cada uno, si defines unos 20 pines son 40 BYTES (mas los punteros que usen) tirados a la basura. Por cierto no se por que no usa variables tipo BYTE que ocupan la mitad. Además por desbordamiento de un array o algo así se podrían corromper con lo que puede fallar que des la orden de apagar el pin 3 y se apague el 12 por decir algo.
Así que por lo menos las asignaciones de los pines creo que se deben de hacer con #define por una cuestión de seguridad, por gasto de ram y posiblemente velocidad.
No se que código compila pero si haces:
funcion(3); // esto es lo que harías indirectamente con un #define
Repito que no se lo que compila pero lo lógico es que haga algo así como un "carga acumulador inmediato 3" y eso va en rom todo y es un ciclo
Si haces:
funcion(variable_que_contiene_un_3);
Entonces habrá un puntero que apunte a la posición de ram en la que está la variable, osea que será algo como "carga acumulador con el contenido de la ram xxx" con suerte será igual de rápido pero puede que el puntero sea de 16 bits y tarde un ciclo mas etc. Desde luego corres el riesgo de que en la ram xxx no tengas un 3 por el motivo que sea.
Quizás la ventaja de definir como variable, es que si hago INT if =3; me de el error en esa línea y sea fácil de localizar y solucionar, si hago #define if 3 , el error sale en la línea en la que esté el if(), si además el #define lo hice cuando no habían if en el programa todo funcionaba correctamente y de repente al añadir la condición salta un error que puede que no sepas de donde cae. Pero bueno eso se soluciona #definiendo con sentido común
El hilo fue a moderación porque en realidad colgaba de un hilo en el que se hablaba de otra cosa, pero creo que el tema es interesante porque yo le veo bastantes ventajas a #define pero el manual del arduino desaconseja su uso.
Wiring es un "casi C" pero no es C, de ahí el origen de la discusión.
He hecho unas pruebas:
Hacer dos define uno que incluye al otro:
#define bomba 3
#define bombardeo 6
Luego en el código he puesto:
Serial.print(bomba);
Serial.println(bombardeo);
Aparece 36 que es lo correcto, así que el compilador no se lía con eso
Hacer un #define de una palabra clave
#define if 3
Serial.print(if);
Aquí da error, en una de las líneas hay una sentencia if y da el error:
"PhysicalPixel:40: error: '3' cannot be used as a function", osea que cambia el if por un 3 quedando el código:
3(condición);
Eso no cuela lógicamente.
Hacer #define de un trozo de palabra clave
#define digital 3
Serial.print (digital);
Aquí todo funciona correctamente, en el código hay una orden "digitalWrite" que no se convierte en "3Write"
Osea que no se por qué en el manual desaconseja usar los #define. Está claro que hay que tomar ciertas precauciones, si uso un nombre de constante igual al de una función por ejemplo, pero eso creo que también pasa con variables o constantes.
No se si las versiones previas del compilador se atascaban con eso, he usado la 1.0.5
Me parece muuuucho mas eficiente definir ciertas cosas con #define que declarar variables.
En todos los ejemplos define los pines como variables tipo INT cuando eso gasta 2bytes de preciada RAM para cada uno, si defines unos 20 pines son 40 BYTES (mas los punteros que usen) tirados a la basura. Por cierto no se por que no usa variables tipo BYTE que ocupan la mitad. Además por desbordamiento de un array o algo así se podrían corromper con lo que puede fallar que des la orden de apagar el pin 3 y se apague el 12 por decir algo.
Así que por lo menos las asignaciones de los pines creo que se deben de hacer con #define por una cuestión de seguridad, por gasto de ram y posiblemente velocidad.
No se que código compila pero si haces:
funcion(3); // esto es lo que harías indirectamente con un #define
Repito que no se lo que compila pero lo lógico es que haga algo así como un "carga acumulador inmediato 3" y eso va en rom todo y es un ciclo
Si haces:
funcion(variable_que_contiene_un_3);
Entonces habrá un puntero que apunte a la posición de ram en la que está la variable, osea que será algo como "carga acumulador con el contenido de la ram xxx" con suerte será igual de rápido pero puede que el puntero sea de 16 bits y tarde un ciclo mas etc. Desde luego corres el riesgo de que en la ram xxx no tengas un 3 por el motivo que sea.
Quizás la ventaja de definir como variable, es que si hago INT if =3; me de el error en esa línea y sea fácil de localizar y solucionar, si hago #define if 3 , el error sale en la línea en la que esté el if(), si además el #define lo hice cuando no habían if en el programa todo funcionaba correctamente y de repente al añadir la condición salta un error que puede que no sepas de donde cae. Pero bueno eso se soluciona #definiendo con sentido común
Última edición: