Go Down

Topic: RETO AL CÓDIGO (Read 716 times) previous topic - next topic

TonyDiana

Una pregunta @PeterKantTropus ¿No querrás decir que el problema es que se declaró volátil? porque si no necesito que me expliques, ya que static = 'no volatil' o TonyDiana = 'ni idea de esto del C++'

PeterKantTropus

De hecho no tengo en claro porque funciono, creí que había declararla volatil, pero el hecho es que funciono lo contrario.
//-----------------------******------------------------
if (Codigo_con_delay==True) {
Proyecto=Fracaso;
 } 
//-----------------------******-----------------------

TonyDiana

Pues eso es lo que creo, que los punteros a funciones, sobre todo en hardware, no deben ser declarados volátiles, así que declararlos en un ámbito en el que van a ser destruidos tienen consecuencias nefastas o no deseadas, por eso reapuntarlos a NULL, controlando la destrucción como haríamos con un objeto NEW en c++, o declararlos estáticos, tiene mucho que ver con el reto que he propuesto de crear una función genérica para PROGMEM y, para otras locuras que tengo en mente

victorjam

#18
Nov 13, 2020, 06:09 pm Last Edit: Nov 13, 2020, 06:10 pm by victorjam
volatile y static son dos cosas diferentes.

En el caso de volatile se le indica al compilador que esa posición de memoria podrá ser compartida por otro proceso/recurso. En el mundo de arduino las usamos en el entorno de las interrupciones generalmente: cuando una variable que vas a usar en el loop la usas también en la rutina de la interrupción, conviene que esta sea <b>volatile</b>, así el compilador la trata de manera especial y tiene en cuenta que puede ser cambiada por otro proceso.

static por lo contrario fija una variable. Es decir si declaras una variable static en una función está variable permanecerá en memoria, no importa las veces que llames a dicha función.

¿Por qué si pones la función con el modificador static funciona el código? En la primera llamada a loop se crea la variable y le asignas un valor (o varios por el código), pero cuando el loop termina y se vuelve a ejecutar esa variable static no se crea de nuevo, si no que permanece de la llamada anterior y en el estado que tuviera.  Podriamos decir que es una variable local, pero tiene ambito global (vamos, como si la hubieras declarado global).

Un uso de static que también es interesante es en objetos. Si un miembro de una clase es declarado como static, significará que ese miembro es común a todos los objetos. Por ejemplo, clase MESA, con un miembro static "patas", ahora creas dos objetos mesa, mesacomedor y mesacocina. Si dices que mesacomedor tiene cuatro patas, automaticamente mesacocina tendrá cuatro patas. Pero si a la mesacocina le dices que tiene tres, automaticamente la del comedor pasará a tener también tres, aunque previamente hayas puesto cuatro.

El mundo de C++ es demasiado amplio y hay que tener cuidado con los modificadores ya que pueden también causarte dolores de cabeza.


TonyDiana

Si, es lo que me temía, es como el C, bien complicados y si los descuidas te matan, gracias a todos por ayudarme a entenderlo mejor

TonyDiana


gatul

Yo todavía sigo así...  :smiley-eek-blue:
 :smiley-mr-green:

TonyDiana

¡¡ CREO QUE SOLUCIONÉ EL SEGUNDO RETO!!

https://forum.arduino.cc/index.php?topic=713589.0

Y me vuelvo a trabajar antes que me llamen la atención, jajajjaa

surbyte

Apúrate gatul que en 5 min cierran, jajaja.

Si vas al próximo desafío te quedarás con la boca abierta!!

gatul

No, en el otro desafío directamente me dije: "Seguí participando..."
 :smiley-lol:

surbyte

Llegó gente pesada, jaja

Go Up