• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Ciekawy problem ze zmienną
#1
Cześć.

Napotakłem na ciekawy problem. Czy ktoś go może wytłumaczyć? A jak temu zapobiec?
W wyniku uruchomienia poniższego kodu, w monitorze dostajemy dwa wyniki (oba poprawne): 24000;


Kod:
long z;

void setup()
{
  Serial.begin(9600);
  
  unsigned long x = func(6000, 24, 48);
  Serial.println(x);

  z = 48;

  unsigned long y = func(6000, 24, z);
  Serial.println(y);
}

unsigned long func(unsigned long a, int b, long c)
{
  return a * (pow(2, (c / (float)b)));
}

void loop()
{
}


Jeśli natomiast przypisanie wartości do zmiennej z=48 przeniesiemy w kodzie nieco wyżej, zaraz pod Serial.begin, czyli: 


Kod:
void setup()
{
  Serial.begin(9600);
  z = 48;
  
  unsigned long x = func(6000, 24, 48);
  Serial.println(x);

  unsigned long y = func(6000, 24, z);
  Serial.println(y);
}

w monitorze zobaczymy: 
24000
23999

Dlaczego druga wartość jest błędna?

Zauważyłem również, że taka konstrukcja da poprawne wyniki:


Kod:
void setup()
{
  Serial.begin(9600);
  z = 48;
  
  unsigned long x = func(6000, 24, 48);
  unsigned long y = func(6000, 24, z);

  Serial.println(x);
  Serial.println(y);
}


jak i również zadeklarowanie z wewnątrz setup() również poprawnie wyświetli wartości, czyli:


Kod:
void setup()
{
  Serial.begin(9600);
  long z = 48;
  
  unsigned long x = func(6000, 24, 48);
  Serial.println(x);

  unsigned long y = func(6000, 24, z);
  Serial.println(y);
}


Testy przeprowadzałem na Arduino UNO w IDE 1.8.5.

Pozdrawiam, Marcin
 
Odpowiedź
  


Wiadomości w tym wątku
Ciekawy problem ze zmienną - przez kilof206 - 01-11-2017, 12:21

Skocz do:


Przeglądający: 1 gości