[C#] Из жизни багов: байты в циклах

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Algol, 17 Dec 2009.

  1. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    МиниКвест.
    Недавно выловил такой вот баг в программе:
    Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто :) Очевидный, на первый взгляд код, не работает:

    Code:
    for (byte b = 0; b <= 255; b++)
          Console.WriteLine(b);
    
    Кто скажет почему не работает этот код? (желательно без компиляции :) )
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    так там после 255 идет 0
    т.е. если будет число 255, то оно проверится по условию. цикл выполнится, далее число увеличится на 1. А так как это байт, то оно станет = 0 и тогда опять процдет проверку.

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

    Это собственно говоря проблема любого языка.
     
    #2 slesh, 17 Dec 2009
    Last edited: 17 Dec 2009
  3. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    А да точно. туплю. Просто не ткомпилятора под рукой чтобы проверить. тогда типа так:
    Code:
    for (byte b = 0; b <= 255; b++)
    {
          Console.WriteLine(b);
          if (b == 255) break;
    }
    
    но вообще в данных условиях лучше просто расширить переменную хотябы до short
     
  4. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Это вообще говоря некорректно, потому как 256 выходит за рамки байта, и сравнивать с байтом - не очень хорошо (компилятор морщится на это варнингом). Ну и кроме того, как уже сказали, это не решает проблему.
    А вот здесь ты не прав. На delphi аналогичный код работает на ура
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var i:byte;
    begin
     for i:=0 to 255 do
         self.text := intToStr(i);
    end;
     
  5. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Твой код выводит не все значения байта, он не выводит 255 :)
     
  6. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.
     
  7. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    И ?
    Я разве спрашивал/утверждал чей это баг?
     
  8. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    тут как-то замешано то, что все типы в .net основаны на object, и byte - это не привычные 8 битов.

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

    рабочий пример:
    Code:
    byte b = 0x0;
    	for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);
    
     
    #8 scrat, 17 Dec 2009
    Last edited: 17 Dec 2009
  9. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ? :)
     
  10. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    for (byte i = byte.MaxValue; i > byte.MinValue; i--)
    {
    Console.WriteLine(byte.MinValue + i);
    }

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

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    а с char'ом ещё смешнее - он ещё и signed :)
    я так обходил
    Code:
    UCHAR b = 0;
    do{
    ...
    }while(--b); // или ++
    
     
    #11 desTiny, 18 Dec 2009
    Last edited: 18 Dec 2009
  12. .Slip

    .Slip Elder - Старейшина

    Joined:
    16 Jan 2006
    Messages:
    1,571
    Likes Received:
    977
    Reputations:
    783
    В цикле for такого в любом случае не сделать.
     
    #12 .Slip, 19 Dec 2009
    Last edited: 19 Dec 2009
    1 person likes this.
  13. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Можно добавить дополнительное условие - тогда будет работать.
     
  14. scrat

    scrat кодер

    Joined:
    8 Apr 2007
    Messages:
    625
    Likes Received:
    541
    Reputations:
    3
    ой, я почему-то был уверен в том, что оно печатается. Как-то это всё очень странно.
     
  15. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    а в JavaScript все работает:
    Code:
    for(b=0;b<=255;b++)document.write(b);
    :D
     
  16. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    А в джаваскрипте есть тип byte ?
     
  17. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Вариант 1
    Code:
    byte b = 0;
    do
          Console.WriteLine(b++);
    while(b);
    
    Вариант 2
    Code:
    byte b = 0;
    do
          Console.WriteLine(b);
    while(++b);
     
  18. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    Code:
        static bool print(byte b)
        {
          Console.WriteLine(b);
          return true;
        }
        static void Main(string[] args)
        {
          for (byte b = 0; (print(b++)) && (b != 0); );
        }
    опа...
    в плюсах можно ещё красивее сделать
     
    #18 Irdis, 19 Dec 2009
    Last edited: 19 Dec 2009
  19. Markus_13

    Markus_13 Member

    Joined:
    19 Feb 2009
    Messages:
    74
    Likes Received:
    19
    Reputations:
    0
    А в JS есть типы? Оо :D
     
  20. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Есть