Pages: [1]   Go Down
Author Topic: Duda de programación  (Read 568 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Full Member
***
Karma: 0
Posts: 200
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas a todos.

Tengo una dudilla que seguro que es sencilla de responder.

Supongamos que declaro una variable unsigned long mivariable, la cual puede almacenar de 0 a (2^32 - 1) y
realizo la siguiente operación:

mivariable = 2^32 + 500 - 501;

¿Se desbordaría la variable durante la operación o durante la operación se pueden manejar números mayores que la variable destino?

Sencillo, ¿no?

Muchas gracias.
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se desborda al hacer la operación.
Logged

   

0
Offline Offline
Full Member
***
Karma: 0
Posts: 200
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK, gracias.

Vamos a concretar un poco más.

Digamos que quiero evaluar cuanto tiempo lleva una variable = 1.
Se me a ocurrido lo siguiente:

Si la variable = 0: t_start = millis()
Si es 1: duracion = millis() - t_start

Pero hay una particularidad: el overflow de millis() cada nosecuantos días

Entonces lo he planteado de la siguiente manera:

si millis() < t_start: duracion = 2^32 + now - t_start

Pero me decís que se desborda ¿que puedo hacer?
¿y si lo hago en dos veces: duracion = 2^32 - t_start, y luego duracion = duracion + now?

Gracias
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

El algoritmo parece sencillo, a ver que te parece y si te da alguna pista:

Code:
while ( 1 )
{
   static unsigned long previousTime = 0;
   unsigned long currentTime;
   
   currentTime = millis();

   if ( currentTime > previousTime )
   {
       // mi código va aquí no he desbordado el contador de tiempo
   }
   else
   {
      // aquí se ha desbordado el contador ya que el tiempo anterior es mayor que el actual
   }
   previousTime = millis();
}

Logged

   

*
Offline Offline
Sr. Member
****
Karma: 0
Posts: 470
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Puedes usar paréntesis para evitar la precedencia de operadores.

Si no me equivoco...

Cuando haces una operación pongamos variable = variable1*7 + 5; variable sea del tipo int y variable1 del tipo char.

La operación intermedia variable1*7 se almacena en los registros internos del micro en la cpu, tiene 24 más o menos de los 32, no lo sé. La variable intermedia (los registros internos del micro en la cpu) donde se almacena es del mismo tipo que variable1 (la variable sobre la que operas), por lo que si se puede desbordar en la operación de multiplicación tienes que hacer un cast en la instrucción:

variable = (int)variable1*7 + 5;

Si variable1 vale 100 y es de tipo char, al multiplicarla por 7 se desborda y ahí obtendrías un valor erróneo en variable si no haces el cast a int para evitarlo.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 200
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

fm, eso es más o menos lo que he planteado.

El tema es que no se como evaluar el tiempo cuando se ha producido el desbordamiento de millis()
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo tienes en la rama del else.

El cálculo que tendrás que hacer es: (ULONG_MAX - previousTime) + currentTime.

No te olvides de hacer #include <limits.h> en tu programa.

Ahora tienes el tiempo que ha transcurrido en milis aunque hayas desbordado el contador.
Logged

   

0
Offline Offline
Full Member
***
Karma: 0
Posts: 200
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

OK. Entonces la solución es priorizar las operaciones para que no se desborde la variable.

Gracias.
Logged

Málaga, Spain
Offline Offline
Edison Member
*
Karma: 41
Posts: 2182
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eso es, digamos que siempre tienes que hacer los calculos de tal forma que las sumas y multiplicaciones no desborden el maximo del tipo.

Un saludo,

fm
Logged

   

Pages: [1]   Go Up
Jump to: