ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|
[C#] Из жизни багов: байты в циклах |

17.12.2009, 14:42
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
[C#] Из жизни багов: байты в циклах
МиниКвест.
Недавно выловил такой вот баг в программе:
Требовалось перебрать все значения байта от 0 до 255. Как оказалось, это сделать не так-то просто  Очевидный, на первый взгляд код, не работает:
Код:
for (byte b = 0; b <= 255; b++)
Console.WriteLine(b);
Кто скажет почему не работает этот код? (желательно без компиляции  )
|
|
|

17.12.2009, 15:07
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
так там после 255 идет 0
т.е. если будет число 255, то оно проверится по условию. цикл выполнится, далее число увеличится на 1. А так как это байт, то оно станет = 0 и тогда опять процдет проверку.
достаточно было бы поставить < 256 чтобы исключить такое.
Это собственно говоря проблема любого языка.
Последний раз редактировалось slesh; 17.12.2009 в 15:10..
|
|
|

17.12.2009, 15:17
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
А да точно. туплю. Просто не ткомпилятора под рукой чтобы проверить. тогда типа так:
Код:
for (byte b = 0; b <= 255; b++)
{
Console.WriteLine(b);
if (b == 255) break;
}
но вообще в данных условиях лучше просто расширить переменную хотябы до short
|
|
|

17.12.2009, 17:30
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от 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;
|
|
|

17.12.2009, 17:33
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от dober.man
Algol, все нормально, смотри что я придумал:
Код:
for (byte i = 0, j = 255; i < j; i++)
System.Console.WriteLine(i);
Работает! =)
Твой код выводит не все значения байта, он не выводит 255 
|
|
|

17.12.2009, 17:55
|
|
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме: 21768337
Репутация:
3486
|
|
Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.
|
|
|

17.12.2009, 18:05
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от .Slip
Algol, в C-like во всех так будет. Это не бага ЯП, это бага программиста.
И ?
Я разве спрашивал/утверждал чей это баг?
|
|
|

17.12.2009, 23:48
|
|
Постоянный
Регистрация: 08.04.2007
Сообщений: 853
Провел на форуме: 5812656
Репутация:
1540
|
|
Сообщение от 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);
Последний раз редактировалось scrat; 18.12.2009 в 00:04..
|
|
|

18.12.2009, 01:00
|
Регистрация: 29.05.2002
Сообщений: 1,793
Провел на форуме: 2050916
Репутация:
0
|
|
Сообщение от scrat
рабочий пример:
Код:
byte b = 0x0;
for (; b.CompareTo(0xFF)<0 ; b++) Console.WriteLine("{0}",b);
Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ? 
|
|
|

18.12.2009, 12:27
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
Сообщение от Algol
Ну какой же он рабочий, если он выводит только числа до 254, а где 255 ? 
for (byte i = byte.MaxValue; i > byte.MinValue; i--)
{
Console.WriteLine(byte.MinValue + i);
}
rofl, теперь нет нуля?  ))))
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|