Wątek przeniesiony 2014-06-10 01:01 z Delphi i Pascal przez olesio.

Dziwne warningi przy porównywaniu typu k in [0 .. 22]

0

Urywki z kodu:

var
  k: integer;

begin
  k := round(radtodeg(arcsin(s)));
  
  if y2 < y1 then
    k := k + 2 * (90 - k);
  if x2 < x1 then
    k := k + 2 * (180 - k);

  if (k in [0 .. 22]) or (k in [338 .. 360]) then
    ustaw(x1, y1, Pionowa)
  else if k in [22 .. 67] then
    ustaw(x1, y1, WPrawo)
  else if k in [67 .. 112] then
    ustaw(x1, y1, Pozioma)
  else if k in [112 .. 157] then
    ustaw(x1, y1 - 1, WLewo)
 else if k in [157 .. 202] then
    ustaw(x1, y1 - 1, Pionowa)
 else if k in [202 .. 247] then
    ustaw(x1 - 1, y1 - 1, WPrawo)
 else if k in [247 .. 292] then
    ustaw(x1 - 1, y1, Pozioma)
 else if k in [292 .. 337] then
    ustaw(x1 - 1, y1, WLewo)

To wywołuje lawinę wargningów:

(118,48) Warning: range check error while evaluating constants
(118,41) Warning: range check error while evaluating constants
(130,32) Warning: range check error while evaluating constants
(132,32) Warning: range check error while evaluating constants
(132,25) Warning: range check error while evaluating constants
(131,13) Warning: unreachable code

Nie pojmuję ich kompletnie. Co to znaczy: range check error?!? Przecież sprawdzałem kilka razy, zawsze po lewej stronie wstawiałem liczbę mniejszą, niż po prawej. Na przykład 0 jest mniejsze niż 22 a 292 jest mniejsze niż 337.

Tym mniej pojmuję Warning: unreachable code (odnosi się ono do przypadku else if k in [247 .. 292]). No albo jestem kompletnie ślepy, albo naprawdę ten przypadek nie był nigdzie wcześniej pokryty!

Mógłbym prosić o pomoc przy interpretacji tych warningów? Z góry dzięki!

2

maksymalny zakres w tych [] to 255

0

Ale przecież nigdy nie przekraczam tego zakresu? Różnice między prawą i lewą wartością wynoszą zwykle 45, nie 255?

3

Taaa... 338 .. 360 rzeczywiście zakres do 255 jak w mordę strzelił. Poczytaj podstawy o zbiorach w Pascalu. I na przyszłość zadawaj pytania o tak banalne podstawy w dziale Newbie. Tam też ten wątek przenoszę.

1

Co to znaczy: range check error?!? Przecież sprawdzałem kilka razy, zawsze po lewej stronie wstawiałem liczbę mniejszą, niż po prawej. Na przykład 0 jest mniejsze niż 22 a 292 jest mniejsze niż 337.

Czyli nie rozumiesz co znaczy ten błąd... Po polsku to będzie "błąd sprawdzania zakresu";

Kompilatora nie isteresuje to, czy zawsze podajesz małe liczby i czy są one mniejsze czy większe względem siebie - w kodzie zapisałeś zbyt duże zakresy i o tym kompilator przypomina w ostrzeżeniach; W ostrzeżeniach, więc program się skompiluje i będzie działał normalnie, aż do podania zbyt dużej wartości; To programu nie zepsuje, w przypadku wyłączenia kontroli zakresów (range checking) nawet nie zauważysz problemu, ale kod na pewno nie będzie działał poprawnie, dlatego że taka wartość pewnie się przekręci (jak typ Byte) i będziesz miał dziwne rezultaty;

Tak więc posłuchaj poprzedników i albo używaj zakresów typu jednobajtowego, albo zastąp każdy zbiór dwoma warunkami;


Twoje zakresy i tak wyglądają dziwnie, bo każda z dolnych i górnych ich granic występuje w dwóch warunkach:

if (k in [0 .. 22]) or (k in [338 .. 360]) then
    ustaw(x1, y1, Pionowa)
  else if k in [22 .. 67] then
    ustaw(x1, y1, WPrawo)
  else if k in [67 .. 112] then

Zobacz ile razy wpisałeś wartości np. 22, 67 i kolejne; No chyba że to celowe, ale wątpię;

A czy ten kod ma zmieniać kierunek czegoś? Czy wartości 0 .. 360 i parametry przekazywane do procedury ustaw przypadkowo posiadają takie a nie inne wartości? Jeśli faktycznie chodzi o kąty, to lepiej wypieprzyć tę drabinkę ifów i skorzystać z normalnej i wiele szybszej od nich arytmetyki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1