Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   [C#] Из жизни багов: байты в циклах (https://forum.antichat.xyz/showthread.php?t=164218)

Algol 17.12.2009 14:42

[C#] Из жизни багов: байты в циклах
 
МиниКвест.
Недавно выловил такой вот баг в программе:
Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто :) Очевидный, на первый взгляд код, не работает:

Код:

for (byte b = 0; b <= 255; b++)
      Console.WriteLine(b);

Кто скажет почему не работает этот код? (желательно без компиляции :) )

slesh 17.12.2009 15:07

так там после 255 идет 0
т.е. если будет число 255, то оно проверится по условию. цикл выполнится, далее число увеличится на 1. А так как это байт, то оно станет = 0 и тогда опять процдет проверку.

достаточно было бы поставить < 256 чтобы исключить такое.

Это собственно говоря проблема любого языка.

slesh 17.12.2009 15:17

А да точно. туплю. Просто не ткомпилятора под рукой чтобы проверить. тогда типа так:
Код:

for (byte b = 0; b <= 255; b++)
{
      Console.WriteLine(b);
      if (b == 255) break;
}

но вообще в данных условиях лучше просто расширить переменную хотябы до short

Algol 17.12.2009 17:30

Цитата:

Сообщение от slesh
достаточно было бы поставить < 256 чтобы исключить такое.

Это вообще говоря некорректно, потому как 256 выходит за рамки байта, и сравнивать с байтом - не очень хорошо (компилятор морщится на это варнингом). Ну и кроме того, как уже сказали, это не решает проблему.
Цитата:

Сообщение от slesh
Это собственно говоря проблема любого языка.

А вот здесь ты не прав. На delphi аналогичный код работает на ура
Код:

procedure TForm1.Button1Click(Sender: TObject);
var i:byte;
begin
 for i:=0 to 255 do
    self.text := intToStr(i);
end;


Algol 17.12.2009 17:33

Цитата:

Сообщение от dober.man
Algol, все нормально, смотри что я придумал:
Код:

for (byte i = 0, j = 255; i < j; i++)
    System.Console.WriteLine(i);

Работает! =)

Твой код выводит не все значения байта, он не выводит 255 :)

.Slip 17.12.2009 17:55

Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.

Algol 17.12.2009 18:05

Цитата:

Сообщение от .Slip
Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.

И ?
Я разве спрашивал/утверждал чей это баг?

scrat 17.12.2009 23:48

Цитата:

Сообщение от Algol
МиниКвест.
Недавно выловил такой вот баг в программе:
Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто :) Очевидный, на первый взгляд код, не работает:

Код:

for (byte b = 0; b <= 255; b++)
      Console.WriteLine(b);

Кто скажет почему не работает этот код? (желательно без компиляции :) )

тут как-то замешано то, что все типы в .net основаны на object, и byte - это не привычные 8 битов.

Решение: Использовать CompareTo()

рабочий пример:
Код:

byte b = 0x0;
        for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);


Algol 18.12.2009 01:00

Цитата:

Сообщение от scrat
рабочий пример:
Код:

byte b = 0x0;
        for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);


Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ? :)

W!z@rD 18.12.2009 12:27

Цитата:

Сообщение от Algol
Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ? :)

for (byte i = byte.MaxValue; i > byte.MinValue; i--)
{
Console.WriteLine(byte.MinValue + i);
}

rofl, теперь нет нуля? :)))))


Время: 05:53